if/else 三元表达式

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这本书,优点和缺点是同一个点:过于详尽,或者说是冗长吧。:)

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容