我怎样才能接近目标呢?:来自C++/Python中的C#?

我怎样才能接近目标呢?:来自C++/Python中的C#?,python,syntax,ternary-operator,syntax-rules,Python,Syntax,Ternary Operator,Syntax Rules,用C#我可以很容易地写出以下内容: string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString; 在Python中是否有一种快速的方法来做同样的事情,或者我是否被“if”语句所束缚?在Python 2.5中,有 A if C else B 它的行为很像?:在C中。然而,有两个原因不赞成它:可读性,以及通常有一种更简单的方法来解决这个问题。例如,在您的情况下: stringValu

用C#我可以很容易地写出以下内容:

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"
@丹

这种类型的代码更长、更具表现力,但也更具可读性

是的,它更长。不太确定“更具表现力”和“更具可读性”。至少,你的要求是有争议的。我甚至会说这是完全错误的,原因有二

首先,您的代码强调决策(相当极端)。另一方面,条件运算符强调其他内容,即值(即所述值的赋值)。这正是这段代码的作者想要的。决策实际上是代码的副产品。这里的重要部分是赋值操作。您的代码将此赋值隐藏在大量语法噪音中:分支

您的代码表现力较弱,因为它将重点从重要部分转移

即使这样,您的代码也可能胜过一些晦涩难懂的ASCII艺术,如
?:
。最好是内联-
if
。就个人而言,我不喜欢Python2.5引入的变体,因为它是向后的。我更喜欢读与C三元运算符相同的流(方向),但使用单词而不是ASCII字符:

C = if cond then A else B
这是轻而易举的胜利

不幸的是,C和C#没有这样一个表达性陈述。但是(这是第二个论点),C语言的三元条件运算符由来已久,它本身已经成为一种习语。三元运算符与“常规”if语句一样是语言的一部分。因为这是一种习惯用法,任何懂这种语言的人都能立即正确地阅读这段代码。此外,它是表达这些语义的一种极其简短的方式。事实上,这是可以想象的最短的方法。它极具表现力,因为它不会用不必要的噪音掩盖本质


最后,Jeff Atwood对此给出了完美的结论:。

顺便说一句,j0rd4n,您不能(请不要!)在C#中编写这样的代码。除了
IsDefaultOrNull
实际上被称为
IsNullOrEmpty
之外,这是纯粹的代码膨胀。C#为以下情况提供合并运算符:

string stringValue = otherString ?? defaultString;

确实,只有当
otherString
null
(而非空)时,这才有效,但如果事先能够确保这一点(通常可以),它会使代码更具可读性。

如果使用ruby,您可以编写

stringValue = otherString.blank? ? defaultString : otherString;
内置的
blank?
方法表示null或空。

说到黑暗面…

我还发现,仅仅使用“or”操作符就可以做得很好。例如:

finalString = get_override() or defaultString

如果get_override()返回“”或无,它将始终使用defaultString。

有答案。在Python中,它被称为and或技巧。

这个问题有一些重复,例如

本质上,在一般设置中,2.5版之前的代码应使用:

 (condExp and [thenExp] or [elseExp])[0]

(给定condExp,thenExp和elseExp是任意表达式),因为如果thenExp的计算结果为boolean False,它可以避免错误的结果,同时保持短路计算。

第二个示例/works/,但请参阅我的注释,了解如何指定比较。这不是倒退了吗?一般情况下,and/or技巧是不受欢迎的,因为像“cond和A或B”这样的GOTCHA,其中A恰好是一个像0这样的假值。有类似(cond和[A]或[B])[0]这样的变通方法,但是添加if/else语法的目的是为了消除这种滥用的需要。这不是倒退。if/else语法被添加到了“fix”中,人们需要一个三元运算符,这会导致他们出现坏的和/或技巧。但是,请注意我的示例没有使用“and”。它只是使用“或”,这是一种更直接的方式来做OP想要的事情。不,抓住你了,这是一个很好的观点(正如我在几周前刚刚了解到的coalesce操作符,那么从数据库查询返回空字符串的情况又如何呢?我编写的大部分代码都使用了我们公司的数据库API,该API返回了大量空字符串。参考我的ruby示例,我用C#编写了一个IsBlank扩展方法,它可以实现这一点。不知道你在想什么如果你认为我错了,请纠正我,但这应该是对丹的帖子的评论,而不是一个新的答案。你对他的答案是有争议的/有争议的是对的,但我要说你说“完全错了”。这只是意味着。。。(大多数物理学家站在彼此的肩膀上,而大多数计算机科学家站在彼此的脚尖上。)顺便说一句,我明白为什么你觉得有必要把它作为一个答案,而不是一个评论来回答…(Stackoverflow不让我编辑我的评论…)
 (condExp and [thenExp] or [elseExp])[0]