如何在Python中紧密实现C++/C#的功能?

12
在C#中,我可以轻松地编写以下内容:
string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString;

在Python中是否有一种快速完成相同操作的方式,或者我只能使用“if”语句?

9个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
24

在Python 2.5中,存在

A if C else B

它的行为与C语言中的 ?: 很相似。然而,人们不赞成使用它有两个原因:可读性和通常有更简单的方法来解决问题。例如,在您的情况下:

stringValue = otherString or defaultString

第二个例子/有效/,但请查看我的评论以了解如何指定比较。 - Serafina Brocious
2
这不是颠倒了吗?通常情况下,“and/or”技巧是不受欢迎的,因为会出现一些陷阱,比如“cond and A or B”,其中A恰好是一个假值,比如0。有一些解决方法,比如(cond and [A] or [B])[0],但是if/else语法基本上是为了消除这种滥用而添加的。 - Brian
1
这并不是倒退。if/else语法是为了“修复”人们对三元运算符的需求,而这种需求导致了错误和/或技巧的问题。然而,请注意我的示例中没有使用'and'。它只使用了'or',这是一种更直接的方式来实现OP想要的功能。没有任何陷阱。 - Thomas Wouters

5

@丹

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写了一个完美的结论:最好的代码是没有代码

如果我说错了,请指出来,但我认为这应该是对丹帖子的评论而不是一个新答案。你说他的答案有争议,但我认为说“完全错误”有点过分了。那只是一种恶意行为...(大多数物理学家都是站在彼此的肩膀上,而大多数计算机科学家则是站在彼此的脚趾头上。) - Pretzel
顺便说一句,我明白为什么你觉得需要回答而不是评论...(Stackoverflow 不允许我编辑我的评论...) - Pretzel

1

1

编写易读、表达清晰的代码从来不是一件坏事。

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString

这种类型的代码更长,更具表现力,但也更易读,不太可能在以后被绊倒或误编辑。不要害怕写得富有表现力 - 可读性强的代码应该是一个目标,而不是副产品。


0

0
顺便说一下,j0rd4n,你不应该(不要!)在C#中编写这样的代码。除了 IsDefaultOrNull 实际上被称为 IsNullOrEmpty 之外,这是纯粹的代码膨胀。C#为这种情况提供了合并运算符:
string stringValue = otherString ?? defaultString;

确实,这只有在otherStringnull(而不是空)时才有效,但如果可以事先确保这一点(通常情况下可以),它会使代码更易读。


这是一个很好的观点(因为我几周前才了解到 coalesce 运算符,但如果数据库查询返回空字符串怎么办? 我编写的许多代码都使用我们公司的数据库 API,它经常返回空字符串)。 - Jordan Parmer
关于我的 Ruby 示例,我在 C# 中编写了一个 IsBlank 扩展方法来实现这个功能。不知道你会在 Python 中怎么做。 - Orion Edwards

0
我还发现只使用“或”运算符也可以很好地完成任务。例如:
finalString = get_override() or defaultString
如果get_override()返回""或None,它将始终使用defaultString

-1

你可以利用逻辑表达式返回其值的事实,而不仅仅是真或假状态。例如,你总是可以使用:

result = question and firstanswer or secondanswer

需要注意的是,如果firstanswer为false,则它不像三元运算符那样工作。这是因为首先评估问题,假设它是真的,除非firstanswer为false,否则将返回firstanswer,因此此用法无法像三元运算符一样运行。但是,如果您知道值,通常没有问题。例如:

result = choice == 7 and "Seven" or "Another Choice"

-1
如果你使用 Ruby,你可以写成:
stringValue = otherString.blank? ? defaultString : otherString;

内置的blank?方法表示null或空。
来到黑暗面吧...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,