在Python中有比使用if-else语句更好的方法吗?

13

可能是重复问题:
将简单的 if-then 语句放在一行上

我正在处理一个 Python 表达式,希望它比使用 if else 语句更加简洁。

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

除了使用if else语句,还有更好的方法吗?


1
似乎普遍认为,if/else语句是编写它的最佳方式。 - Joel Cornett
我只是猜测,但似乎OP的意图是避免if/elif/case/switch的丑陋。最终的解决方案将是基于类的解决方案,其中通过多态性进行选择。这可以导致更简洁的代码。 - Don Question
经过最新的编辑,似乎原帖只想进行范围检查...? - thebjorn
是的,实际上只有当该索引存在时,我才想查找该索引的元素。 - sam
@don:抱歉,我尝试以更简单的方式提问。 - sam
5个回答

17

你可以这样做:

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

但是我认为这并没有使得代码更易读(一眼就能看懂)。还要注意的是,ifelse 并不会创建循环,它们只是用于控制流的语句。循环需要使用 forwhile 来编写。


4
同意,这符合 OP 的要求,但并不会导致代码更易读。+1(勉强同意因为可能会有代码混淆的问题)。 - Levon

13

代码极度混淆,不建议使用:

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

[编辑] 你永远不应该这样做的原因是因为它使用了大多数人都不知道的语言属性,即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是否会将布尔值转换为整数? - Simeon Visser
3
在技术上是正确的,但我认为这是一个糟糕的答案。对于许多人来说,一开始很难理解。考虑到这个问题的答案通常会被新接触该语言和/或编程的人阅读,我认为不建议这样的结构不是个好主意。 - Bryan Oakley
1
Python中的布尔值是整数(在isinstance意义上--bool是int的子类)。 - thebjorn
3
注意Bryan,我明确地说了“不要这样做”,因此我不认为这是一个建议。 - thebjorn
2
@thebjorn:虽然“(不要这样做)”比什么都不说要好,但如果你花费更多的精力解释为什么某人不应该那样做,你的答案会更好。记住:观众大多是可能不知道为什么那是个坏主意的人。这是你教育他们的机会。 - Bryan Oakley
显示剩余3条评论

7
在这种情况下,您可以使用try/except块:
try:
    print s.index(5)
except ValueError:
    print "5 not in list"

2
我可以问一下为什么吗?那是一种“Pythonic”的使用方式!“不要请求许可,而是请求宽恕!”- 你的if语句正在请求许可,然后执行所请求的操作。try语句只是执行它,如果失败了,它会处理宽恕部分。 - Don Question
1
根据问题本身OP的评论,他似乎实际上是指s[5](这将导致IndexError)。但我同意,这是明显的Pythonic拼写范式检查的方式。 - thebjorn

3

简短明了:

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

没有针对你的解决方案有任何意见,但是我认为在考虑可读性时,楼主的原始代码已经尽可能地“简短和清晰”了。 - Levon
1
你说得没错,但我决定将其发布为避免if-else的“正确方法”,而不是依赖于一些未记录的隐式转换,因为这可能会随着时间的推移而发生变化。 - zenpoy
zenopy的解决方案简短、清晰,且不乏优雅之处;-) - Don Question
@zenpoy 这是一个很好的理由(它肯定比依赖于True/False值的聪明而酷的、但易于混淆的代码更清晰) - Levon
@zenpoy 尽管 boolint 的子类型这一事实可能有些晦涩,但它既不是隐式转换(而是一个子类型),也不是未记录的(请参见 PEP 285 中的解释:http://www.python.org/dev/peps/pep-0285/)。但是没错,它确实有些晦涩 :-) - thebjorn

0

另一种变体:

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

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


我会给你考古价值的分数,但除此之外,这种可怕的东西就是我们将if表达式引入语言的原因。 - thebjorn
@thebjorn 等等,有一种没有 if 表达式的 Python 版本? - Marcin
1
@Marcin,if表达式是在2.5中引入的,在那之前我们只有if语句 :-) - thebjorn

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