string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString;
在Python中是否有一种快速完成相同操作的方式,或者我只能使用“if”语句?
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
This type of code is longer and more expressive, but also more readable
是的,代码更长了。但“更具表现力”和“更易读”我不太确定。至少可以说,你的说法是有争议的。我甚至要说,它是完全错误的,原因有两个。
首先,你的代码强调决策(而且非常极端)。另一方面,条件运算符强调其他东西,即值(或分配该值)。这正是这段代码的作者想要的。决策实际上是代码的副产品。在这里重要的部分是赋值操作。你的代码在很多语法噪音中隐藏了这个赋值。
你的代码表达能力较差,因为它将重点从重要部分转移了。
即使如此,你的代码可能仍然比某些晦涩的ASCII艺术像?:
好。最好使用内联if
。就个人而言,我不喜欢Python 2.5引入的变体,因为它是反向的。我更喜欢使用单词而不是ASCII字符,但与C三元运算符相同流程(方向)的变体:
C = if cond then A else B
这是无可争议的最佳选择。
不幸的是,C和C#没有这样表达语句的方式。但是(这是第二个论点),C语言系列的三元条件运算符已经使用得非常久远,已经成为一种惯用语。三元运算符和“传统”的if
语句一样成为了语言的一部分。因为它是一种惯用语,任何熟悉该语言的人都能立即读懂这段代码。此外,这是一种极为简短、简洁的表达方式,实际上是最短的想象方式。它非常具有表现力,因为它不会用不必要的噪音掩盖本质。
最后,Jeff Atwood写了一个完美的结论:最好的代码是没有代码。
这个问题有几个重复的版本,例如:
本质上,在一般情况下,2.5 之前的代码应该使用以下内容:
(condExp and [thenExp] or [elseExp])[0]
(假设condExp、thenExp和elseExp是任意表达式),这样可以避免错误的结果,如果thenExp评估为布尔值False,同时保持短路评估。
编写易读、表达清晰的代码从来不是一件坏事。
if otherString:
stringValue = otherString
else:
stringValue = defaultString
这种类型的代码更长,更具表现力,但也更易读,不太可能在以后被绊倒或误编辑。不要害怕写得富有表现力 - 可读性强的代码应该是一个目标,而不是副产品。
IsDefaultOrNull
实际上被称为 IsNullOrEmpty
之外,这是纯粹的代码膨胀。C#为这种情况提供了合并运算符:
string stringValue = otherString ?? defaultString;
确实,这只有在otherString
为null
(而不是空)时才有效,但如果可以事先确保这一点(通常情况下可以),它会使代码更易读。
finalString = get_override() or defaultString
如果get_override()返回""或None,它将始终使用defaultString。
你可以利用逻辑表达式返回其值的事实,而不仅仅是真或假状态。例如,你总是可以使用:
result = question and firstanswer or secondanswer
需要注意的是,如果firstanswer为false,则它不像三元运算符那样工作。这是因为首先评估问题,假设它是真的,除非firstanswer为false,否则将返回firstanswer,因此此用法无法像三元运算符一样运行。但是,如果您知道值,通常没有问题。例如:
result = choice == 7 and "Seven" or "Another Choice"
stringValue = otherString.blank? ? defaultString : otherString;
内置的blank?
方法表示null或空。
来到黑暗面吧...