if/else 三元表达式
问题
items = [1,10,7,4,5,9]
def sum(items):
head,*tail = items
return head + sum(tail) if tail else head
print(sum(items))
在看python cookbook 1.2节的时候,有这样一个代码段。有点看不懂 if/else是如何执行的,因为自己并没有手动计算到运行的结果。
参考LearningPython
if X:
A= Y
else:
A= Z
通过if/else三元表达式简化后就成了:
A = Y if X else Z
该书的解释:
As in the statement equivalent, Python runs expression Y only if X turns out to be true, and runs expression Z only if X turns out to be false.
意思就是如果X是真,就执行表达式Y;如果X是假,则执行表达式Z。
举个例子:
>>> A = 't' if 'spam' else 'f' #对于字符串来说,非空为真
>>> A
't'
>>> A = 't' if '' else 'f'
>>> A
'f'
简化理解
其实对于更好地理解if/else三元表达式来说,以上代码中的A是多余的。A的出现有时候会对理解造成困惑,毕竟咱们说的if/else三元表达式嘛!去除掉A的代码:
if X:
Y
else:
Z
通过if/else三元表达式简化后就成了:
Y if X else Z
接着举个例子,看看打印:
>>> print('t' if 'spam' else 'f')
't'
>>> print('t' if '' else 'f')
'f'
如果X为真,那么结果为Y;如果X为假,那么结果为Z。
再看问题
head,*tail = items
是把可迭代的变量的第一个赋值个head,其余的都给tail。
head + sum(tail) if tail else head
再来看下这个if/else表达式。如果tail为真,那么sum(tail)执行,即结果为head + sum(tail);否则 head + head。
错了,我刚看这行代码也是这样理解的。但是结果告诉我错了。
其实应该是这样执行的:如果tail为真,那么(head + sum(tail))执行,即结果为(head + sum(tail));否则为 head。head + sum(tail) 是一个表达式,也就是上面
Y if X else Z
中的Y。
这是个递归函数,通过不断调用自身提取出head,知道tail为空的时候不执行head + sum(tail),而执行head结束递归。
测试一下
A = 1
B = 2
C = 3
D = 4
print(C + D if A else B)
结果为7。
A = 1
B = 2
C = 3
D = 4
print(C + D if A else B)
结果为2,而不是5。
这也证实了我们的假设。
最后还是得吐槽下LearningPython这本书,优点和缺点是同一个点:过于详尽,或者说是冗长吧。:)
网友评论