如何在Python中从C ++ / C#紧密实现?:?
在CI中可以轻松编写以下内容:
string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString;
有没有一种快速的方法可以在Python中做同样的事情,还是我坚持使用'if'语句?
解决方案
在Python 2.5中,
A if C else B
在C中,它的行为很像?:。但是,由于两个原因,它不被接受:可读性和通常有一种更简单的方法来解决问题的事实。例如,在情况下:
stringValue = otherString or defaultString
编写可读性强的代码从来都不是一件坏事。
if otherString: stringValue = otherString else: stringValue = defaultString
这种类型的代码更长,更具表现力,但也更具可读性,并且不太可能被绊倒或者被错误地编辑。不要害怕写表达力强的代码应该是目标,而不是副产品。
我们可以利用逻辑表达式返回其值的事实,而不仅仅是返回true或者false状态。例如,我们可以始终使用:
result = question and firstanswer or secondanswer
需要注意的是,如果firstanswer为false,它就不会像三元运算符那样起作用。这是因为假设问题为真,首先假设问题是正确的,除非firstanswer为假,否则将返回firstanswer,因此这种用法不能像三元运算符那样起作用。但是,如果我们知道这些值,通常就没有问题。一个例子是:
result = choice == 7 and "Seven" or "Another Choice"
@担
if otherString: stringValue = otherString else: stringValue = defaultString This type of code is longer and more expressive, but also more readable
是的,它更长。不太确定更具表现力和可读性。至少,主张是有争议的。我什至可以说这是完全错误的,这有两个原因。
首先,代码强调决策(相当极端)。另一方面,条件运算符强调其他内容,即值(表示该值的赋值)。而这正是这段代码的编写者想要的。决策实际上是代码的副产品。这里的重要部分是分配操作。代码将此分配隐藏在许多语法噪声中:分支。
代码表达性较差,因为它使重点从重要部分转移到其他地方。
即使这样,代码也可能胜过诸如"?:"之类的晦涩的ASCII艺术。内联的" if"将是更可取的。就个人而言,我不喜欢Python 2.5引入的变体,因为它是向后的。我更喜欢以与C三进制运算符相同的流(方向)读取但使用单词而不是ASCII字符的内容:
C = if cond then A else B
这赢得了手。
遗憾的是C和Cun没有这样的表达方式。但是(这是第二个参数),C语言的三元条件运算符已经建立了很长时间,以至于它本身已成为一种习惯用法。三元运算符与常规的if语句一样,是语言的一部分。因为这是一个习惯用法,所以任何知道该语言的人都会立即阅读此代码。此外,这是表达这些语义的极其简短的方法。实际上,这是最短的可想象的方法。它具有极强的表现力,因为它不会因不必要的噪音而掩盖本质。
最后,杰夫·阿特伍德(Jeff Atwood)为此写了一个完美的结论:最好的代码根本就是没有代码。
顺便说一句,j0rd4n,我们不要(请不要!)用C#编写这样的代码。除了" IsDefaultOrNull"实际上被称为" IsNullOrEmpty"之外,这是纯粹的代码膨胀。可以为以下情况提供合并运算符:
string stringValue = otherString ?? defaultString;
的确,这只有在" otherString"为" null"(而不是空)的情况下才有效,但是如果可以事先确保(并且通常可以),它将使代码更加可读。
如果我们使用红宝石,可以写
stringValue = otherString.blank? ? defaultString : otherString;
内置的" blank"方法表示null或者为空。
来到黑暗的一面...
我还发现仅使用"或者"运算符就可以很好地实现。例如:
finalString = get_override() or defaultString
如果get_override()返回""或者"无",它将始终使用defaultString。
diveintopython.net的第4章提供了答案。在Python中称为"与"或者"把戏"。
这个问题有些重复,例如
- Python是否具有三元条件运算符?
- 在Python中替换三元运算符的最佳方法是什么?
本质上,在一般设置中,低于2.5的代码应使用以下代码:
(condExp and [thenExp] or [elseExp])[0]
(给定condExp,thenExp和elseExp是任意表达式),因为如果thenExp评估为布尔False,则可以避免错误的结果,同时保持短路评估。