比在 python 中使用 if-else 语句更好的方法 [重复]

Posted

技术标签:

【中文标题】比在 python 中使用 if-else 语句更好的方法 [重复]【英文标题】:better way than using if-else statement in python [duplicate] 【发布时间】:2012-07-14 13:42:02 【问题描述】:

可能重复:Putting a simple if-then statement on one line

我正在研究一个 python 表达式,我希望该表达式被压缩而不是使用 if else 语句。

s = [1, 2, 3, 4]
if len(s)>5:
    print s.index(5)
else:
    print 'cant print'

有没有比使用 as if else 语句更好的方法?

【问题讨论】:

似乎普遍认为 if/else 语句最好的写法。 我只是在这里猜测,但似乎 OP 的意图是避免 if/elif/case/switch 丑陋。最终解决方案将是基于类的解决方案,其中案例选择是通过多态性完成的。这可以带来更简洁的代码。 在最新的编辑之后,似乎 OP 只想进行范围检查...? 是的,如果该索引存在,那么我只想找到该索引的那个元素 @don: 对不起,我试着用更简单的方式问。 【参考方案1】:

在这种情况下,您可以使用 try/except 块:

try:
    print s.index(5)
except ValueError:
    print "5 not in list"

【讨论】:

请问为什么?那就是使用它的“pythonic”! “不求许可,只求原谅!” - 你的 if 子句请求许可,然后按照它的要求去做。 try 语句就是这样做的,如果它失败了,它会处理宽恕部分。 根据 OP 对问题本身的评论,他似乎实际上是指 s[5](这将使其成为 IndexError)。但我同意,这显然是 Pythonic 的拼写范围检查方式。【参考方案2】:

另一种变化:

print len(s)>5 and 'y' or 'n'

只是为了完整性而添加的。不要在家里尝试这个! ;-)

【讨论】:

我会给你考古价值的分数,但否则这种可怕性就是我们在语言中加入 if 表达式的原因。 @thebjorn 等等,有没有没有 if 表达式的 python 版本? @Marcin if 表达式是在 2.5 中引入的,在此之前我们只有 if 语句 :-)【参考方案3】:

简短,但非常模糊(不要这样做):

print 'ny'[len(s) > 5]

[edit] 你永远不应该这样做的原因是因为它使用了大多数人鲜为人知的语言属性,即 bool 是 int 的子类。在大多数情况下,您发现自己在编写像 OP 这样的代码,通常最好创建一个标志变量

s_is_long = len(s) > 5

然后您可以使用任何更合适的方式来编写打印,例如:

print 'y' if s_is_long else 'n'

print True: 'y', False: 'n'[s_is_long]

或者是最易读的……

if s_is_long:
    print 'y'
else:
    print 'n'

【讨论】:

它是如何工作的? Python 是否在索引时将布尔值转换为整数? 虽然在技术上是正确的,但这是一个糟糕的答案 IMO。对于许多人来说,乍一看很难理解。考虑到这个问题的答案最常被语言新手和/或一般编程新手阅读,我认为建议这样的结构不是一个好主意。 Python bool 是 int(在 isinstance 意义上——bool 是 int 的子类)。 @Bryan 请注意,我明确表示“不要这样做”,所以我不会称之为建议。 @thebjorn:虽然“(不要这样做)”总比没有好,但如果您花更多的精力解释为什么有人不应该这样做,您的答案会更好。请记住:观众大多是可能不知道为什么这是一个坏主意的人。这是你教育他们的机会。【参考方案4】:

简洁明了:

s = [1, 2, 3, 4]
output = True: 'y',False: 'n'
print output[len(s) > 5]

【讨论】:

没有反对您的解决方案,但我认为 OP 的原始代码在考虑到可读性时是“简短而清晰”的。 你是对的,但我决定将其发布为避免 if-else 的“正确方法”,而不是指望一些可能会随着时间而改变的无证隐式转换。 zenopy 的解决方案简短、清晰且不失优雅 ;-) @zenpoy 这是一个很好的理由(而且它肯定比公认的聪明和酷,但取决于 True/False 值的混淆代码更清晰) @zenpoy 虽然bool 是一个int 的事实可能并不明显,但它既不是隐式转换(它是一个子类型)也不是无证的(参见 PEP 285 中的基本原理:python.org/dev/peps/pep-0285 )。但是,是的,它绝对是晦涩的 :-)【参考方案5】:

你可以这样做:

s = [1, 2, 3, 4]
print 'y' if len(s) > 5 else 'n'

但是我认为这不会使代码更具可读性(一目了然)。还要注意ifelse 不会创建循环,它们只是控制流的语句。循环是使用forwhile 编写的。

【讨论】:

同意,这符合 OP 的要求,但不会产生更可读的代码。 +1(不情愿因为混淆)

以上是关于比在 python 中使用 if-else 语句更好的方法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python:为啥 if-else 一行语句在 else 中不能与 continue 一起使用?

Python从入门到进阶9流程控制语句-条件语句(if-else)

if-else 中的块语句

多个 if-else 测试的更简单方法

if-else和三目运算符 ? : 的对比

用if-else语句替换程序中switch语句