赞
踩
在学习Python Cookbook中关于 “解压可迭代对象赋值给多个变量” 时遇到代码如下:
items = [1,10,7,4,5,9]
def sum(items):
head, *tail = items
return head + sum(tail) if tail else head
sum(items)
该代码巧妙地使用分割语法实现递归算法,计算数组中元素之和。
重点在于return head + sum(tail) if tail else head
一开始认为是一个简单条件,竟没有发现是一个三元运算符。
Python 中三元运算符的语法是:
# X是条件
# Y是 运算表达式1
# Z是 运算表达式2
# 如果X为True,则运行 Y ,否则运行 Z
Y if X else Z
对应的简单得条件语句是:
if X:
Y
else:
Z
首先对return head + sum(tail) if tail else head
进行一个解析。
X
对应 的条件应该是:tail
这里tail
是一个数组, 并不是一个正常的条件语句。只要数组不为空时,都会返回True
Y
对应 的执行语句1 是: head + sum(tail)
Z
对应 的执行语句2 是:head
要看懂这个迭代需要分布解析:
第一次:
head = 1 , tail = [10,7,4,5,9]
return 1 + sum([10,7,4,5,9]) if [10,7,4,5,9] else 1
#当前结果
return 1 + sum([10,7,4,5,9])
第二次:
head = 10 , tail = [7,4,5,9]
return 10 + sum([7,4,5,9]) if [7,4,5,9] else 10
# 将此时return的内容带入第一次的 sum([10,7,4,5,9])
# 当前结果:
return 1 + ( 10 + sum([7,4,5,9]))
第三次:
head = 7 , tail = [4,5,9]
return 7 + sum([4,5,9]) if [4,5,9] else 7
# 将此时return的内容带入上一次的 sum([7,4,5,9])
# 当前结果:
return 1 + ( 10 + (7 + sum([4,5,9])))
第四次:
head = 4 , tail = [5,9]
return 4 + sum([5,9]) if [5,9] else 4
# 将此时return的内容带入上一次的 sum([4,5,9])
# 当前结果:
return 1 + ( 10 + (7 + (4 + sum([5,9]))))
第五次:
head = 5 , tail = [9]
return 5 + sum([9]) if [9] else 5
# 将此时return的内容带入上一次的 sum([5,9])
# 当前结果:
return 1 + ( 10 + (7 + (4 + (5 + sum([9])))))
第六次:
此时数组tail
已经为null , 在执行三元运算符时,会得到False
,执行else
后的语句,也就是head
那么sum([9])
就会直接返回 9
head = 9 , tail = []
return 9 + sum([]) if [] else 9
# 将此时return的内容带入上一次的 sum([9])
# 当前结果:
return 1 + ( 10 + (7 + (4 + (5 + 9))))
如此一来,就得到最终迭代的结果36
。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。