可能是重复问题:
将简单的 if-then 语句放在一行上
我正在处理一个 Python 表达式,希望它比使用 if else 语句更加简洁。
s = [1, 2, 3, 4]
if len(s)>5:
print s.index(5)
else:
print 'cant print'
除了使用if else语句,还有更好的方法吗?
可能是重复问题:
将简单的 if-then 语句放在一行上
我正在处理一个 Python 表达式,希望它比使用 if else 语句更加简洁。
s = [1, 2, 3, 4]
if len(s)>5:
print s.index(5)
else:
print 'cant print'
除了使用if else语句,还有更好的方法吗?
你可以这样做:
s = [1, 2, 3, 4]
print 'y' if len(s) > 5 else 'n'
但是我认为这并没有使得代码更易读(一眼就能看懂)。还要注意的是,if
和 else
并不会创建循环,它们只是用于控制流的语句。循环需要使用 for
和 while
来编写。
代码极度混淆,不建议使用:
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'
isinstance
意义上--bool是int的子类)。 - thebjorntry:
print s.index(5)
except ValueError:
print "5 not in list"
s[5]
(这将导致IndexError)。但我同意,这是明显的Pythonic拼写范式检查的方式。 - thebjorn简短明了:
s = [1, 2, 3, 4]
output = {True: 'y',False: 'n'}
print output[len(s) > 5]
bool
是 int
的子类型这一事实可能有些晦涩,但它既不是隐式转换(而是一个子类型),也不是未记录的(请参见 PEP 285 中的解释:http://www.python.org/dev/peps/pep-0285/)。但是没错,它确实有些晦涩 :-) - thebjorn另一种变体:
print len(s)>5 and 'y' or 'n'
只是为了完整性而添加。不要在家尝试! ;-)