在 C# 中,我可以轻松编写以下内容:
string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString;
有没有一种在 Python 中做同样事情的快速方法,或者我是否坚持使用“if”语句?
在 C# 中,我可以轻松编写以下内容:
string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString;
有没有一种在 Python 中做同样事情的快速方法,或者我是否坚持使用“if”语句?
在 Python 2.5 中,有
A if C else B
它的行为很像?例如,在您的情况下:
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
语句一样是语言的一部分。因为它是一个成语,任何了解该语言的人都会立即正确地阅读此代码。此外,它是表达这些语义的一种极短、简洁的方式。事实上,这是可以想象到的最短路径。它极具表现力,因为它不会用不必要的噪音掩盖本质。
最后,Jeff Atwood 写了一个完美的结论:最好的代码就是没有代码。
编写可读的、富有表现力的代码从来都不是一件坏事。
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
is null
(而不是空)时才有效,但如果可以事先确保(并且通常可以),它会使代码更具可读性。
我还发现仅使用“或”运算符效果很好。例如:
finalString = get_override() or defaultString
如果get_override()返回 "" 或 None,它将始终使用defaultString。
diveintopython.net 的第 4 章给出了答案。这在 Python 中被称为与或技巧。
您可以利用逻辑表达式返回其值的事实,而不仅仅是真或假状态。例如,您始终可以使用:
result = question and firstanswer or secondanswer
需要注意的是,如果 firstanswer 为假,它就不会像三元运算符那样工作。这是因为问题首先被评估,假设它是真的 firstanswer 被返回,除非 firstanswer 为假,所以这种用法不能像三元运算符一样。但是,如果您知道这些值,则通常没有问题。一个例子是:
result = choice == 7 and "Seven" or "Another Choice"
如果你使用 ruby,你可以写
stringValue = otherString.blank? ? defaultString : otherString;
内置blank?
方法表示 null 或空。
来到黑暗的一面...