我怎么可以密切合实现?:从C++/C#在蟒蛇?
-
02-07-2019 - |
题
C#我可以很容易地编写如下:
string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString;
是有一个快速的方式做同样的事情在蟒蛇还是我坚持一个"如果"的说法?
解决方案
在Python 2.5中,有
A if C else B
表现得很像?:在C中。然而,由于两个原因,它令人不悦:可读性,以及通常有一种更简单的方法来解决问题。例如,在您的情况下:
stringValue = otherString or defaultString
其他提示
@丹
if otherString: stringValue = otherString else: stringValue = defaultString
这种类型的代码更长,更具表现力,但也更具可读性
是的,它更长。不太确定“更具表现力”和“更具可读性”至少,你的主张是有争议的。我甚至会说这完全错了,原因有两个。
首先,您的代码强调决策(非常极端)。另一方面,条件运算符强调其他东西,即值(分别是所述值的赋值)。这完全这段代码的作者想要的东西。决策实际上是代码的副产品。这里重要的部分是分配操作。你的代码隐藏了很多语法噪音:分支。
你的代码表现力较差,因为它将重点从重要部分转移。
即便如此,您的代码可能会胜过一些模糊的ASCII艺术,如?:
。内联 - if
更可取。就个人而言,我不喜欢Python 2.5中引入的变体,因为它是向后的。我希望读取与C三元运算符相同的流(方向),但使用单词而不是ASCII字符:
C = if cond then A else B
这会赢得胜利。
不幸的是,C和C#没有这样的表达声明。但是(这是第二个论点),C语言的三元条件运算符已经建立了很长时间,它已经成为一种习惯用语。三元运算符与“传统” if
语句。因为它是一个成语,任何知道该语言的人都会立即读取这段代码。此外,它是表达这些语义的极短,简洁的方式。事实上,它是最短的可想象的方式。它非常具有表现力,因为它不会因为不必要的噪音而模糊本质。
最后,杰夫阿特伍德已经写出了完美的结论: 最佳代码完全没有代码 。
编写可读,富有表现力的代码从来都不是坏事。
if otherString:
stringValue = otherString
else:
stringValue = defaultString
这种类型的代码更长,更具表现力,但也更具可读性,不太可能在路上被绊倒或错误编辑。不要害怕写清楚 - 可读代码应该是目标,而不是副产品。
有一些重复这一问题,例如
在本质上,在一般的设定前的2.5码应该使用这个:
(condExp and [thenExp] or [elseExp])[0]
(给予condExp,thenExp和elseExp是任意的表情),因为它避免了错误的结果,如果thenExp评估为布尔的假,同时保持简短的路评估。
顺便说一句,j0rd4n,你没有(请不要!)在C#中编写这样的代码。除了 IsDefaultOrNull
实际上被称为 IsNullOrEmpty
之外,这是纯粹的代码膨胀。 C#为这些情况提供了合并运算符:
string stringValue = otherString ?? defaultString;
确实,这只有在 otherString
是 null
(而不是空)的情况下才有效,但如果事先可以确保(并且经常可以),那么它会使代码更多更具可读性。
我还发现只使用“或”运营商做得很好。例如:
finalString = get_override() or defaultString
如果 get_override()返回“"”或者无,它将始终使用 defaultString 。
diveintopython.net第4章有答案。它被称为Python中的和 - 或技巧。
您可以利用逻辑表达式返回其值的事实,而不仅仅是true或false状态。例如,您始终可以使用:
result = question and firstanswer or secondanswer
需要注意的是,如果firstanswer为false,它就不像三元运算符那样工作。这是因为首先评估问题,假设它是真的,首先返回firstanswer,除非firstanswer为false,因此这种使用不能像三元运算符那样运行。但是,如果您知道这些值,通常没有问题。一个例子是:
result = choice == 7 and "Seven" or "Another Choice"
如果你使用红宝石,你可以写
stringValue = otherString.blank? ? defaultString : otherString;
内置的 blank?
方法意味着null或为空。
来到黑暗的一面......