在C#中,我可以很容易地编写如下:
string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString;
是否有这样做在Python同样的事情的一个快速的方法还是我坚持一个“如果”语句?
在C#中,我可以很容易地编写如下:
string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString;
是否有这样做在Python同样的事情的一个快速的方法还是我坚持一个“如果”语句?
在Python 2.5,有
A if C else B
其行为很像:在C然而,它的令人难以接受的原因有二:可读性,这通常有接近问题的一个简单的方法的事实。 例如,你的情况:
stringValue = otherString or defaultString
@丹
if otherString: stringValue = otherString else: stringValue = defaultString
这种类型的代码是更长和更富有表现力,而且更易读
嗯,是的,它是更长的时间。 不太确定“更有表现力”和“更具可读性”。 最起码,你的要求是有争议的。 我甚至会去尽可能说这是完全错误的,原因有两个。
首先,你的代码强调决策(而极)。 Onthe另一方面,条件运算符强调别的东西,即价值(相应地,说值的分配)。 而这正是这段代码的作者希望。 决策实在是相当的代码的一个副产品。 这里最重要的部分是赋值操作。 您的代码隐藏此任务中有很多语法的噪音:分支。
您的代码是少的表现,因为它从转移的重要组成部分的重点。
即使你的代码可能会胜过一些模糊的ASCII艺术一样?:
一个inline- 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计算结果为布尔值false,同时保持短路评价。
顺便说一句,j0rd4n,你不这样做( 请不要!)用C#这样的代码。 除了事实IsDefaultOrNull
实际上是所谓IsNullOrEmpty
,这是纯粹的代码膨胀。 C#提供了这样的情况下,聚结操作:
string stringValue = otherString ?? defaultString;
这是真的,这只是工作,如果otherString
为null
(不是空的),但是如果能够事先保证(通常它可以)它使代码更易读。
我还发现,仅仅使用“或”操作不很好。 例如:
finalString = get_override() or defaultString
如果get_override()返回“”或无,它将始终使用defaultString。
diveintopython.net的第4章给出了答案。 这就是所谓的and-or技巧Python编写的。
您可以利用的事实,逻辑表达式返回自己的价值,而不仅仅是真或假的地位。 例如,你可以随时使用:
result = question and firstanswer or secondanswer
需要提醒的是它并不像三元运算符的工作,如果firstanswer是假的。 这是因为,问题是先进行计算,假设它返回真firstanswer除非firstanswer是假的,所以这种用法不能像三元运算符。 如果你知道这些值,但是,通常没有问题。 一个例子是:
result = choice == 7 and "Seven" or "Another Choice"
如果您使用的红宝石,你可以写
stringValue = otherString.blank? ? defaultString : otherString;
内置的blank?
方法是指空。
过来黑暗的一面...