当前位置:   article > 正文

Python 三元运算符_return head + sum(tail) if tail else head

return head + sum(tail) if tail else head

引言问题

在学习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)
  • 1
  • 2
  • 3
  • 4
  • 5
'
运行

该代码巧妙地使用分割语法实现递归算法,计算数组中元素之和。
重点在于return head + sum(tail) if tail else head
一开始认为是一个简单条件,竟没有发现是一个三元运算符

三元运算符

Python 中三元运算符的语法是:

# X是条件
# Y是 运算表达式1
# Z是 运算表达式2
# 如果X为True,则运行 Y ,否则运行 Z
Y if X else Z
  • 1
  • 2
  • 3
  • 4
  • 5

对应的简单得条件语句是:

if  X:
    Y
else:
    Z
  • 1
  • 2
  • 3
  • 4

回到问题中

首先对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])
  • 1
  • 2
  • 3
  • 4

第二次:

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]))
  • 1
  • 2
  • 3
  • 4
  • 5

第三次:

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])))
  • 1
  • 2
  • 3
  • 4
  • 5

第四次:

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]))))
  • 1
  • 2
  • 3
  • 4
  • 5

第五次:

head = 5 , tail = [9]
return 5 + sum([9]) if [9] else 5
# 将此时return的内容带入上一次的 sum([5,9])
# 当前结果:
return 1 + ( 10 + (7 + (4 + (5 + sum([9])))))
  • 1
  • 2
  • 3
  • 4
  • 5

第六次:
此时数组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))))
  • 1
  • 2
  • 3
  • 4
  • 5

如此一来,就得到最终迭代的结果36

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
  

闽ICP备14008679号