在python中解包元素
Posted
技术标签:
【中文标题】在python中解包元素【英文标题】:Unpacking elements in python 【发布时间】:2020-12-28 01:28:44 【问题描述】:看了下面的例子:
def sum(items):
head, *tail = items
return head + sum(tail) if tail else head
我想知道是否可以将其更改为分别打印头和余数,所以我将其更改为:
def sum(items):
head, *tail = items
return head, sum(tail) if tail else head
但是,当我测试它时,它返回了这些结果:
sum([1,2,3])
(1, (2, (3, 3)))
而不是
(1,5)
我做错了什么?
【问题讨论】:
您不应该定义自己的名为sum
的函数,因为它隐藏了同名的内置函数。你的意思是递归调用你自己的sum
函数,还是你认为内置的sum
会在你的sum
函数内部被调用?
你为什么期望 return head, sum(tail) if tail else head
去sum什么?你从不添加任何东西。您删除了添加
再次...只是为了让我们都清楚您的想法...您是要递归调用自己的函数,还是要调用内置的@987654330 @函数在你自己的sum
函数里面?这两种方法都是有效的。你到底想在这里做什么?
对,我想我的问题是我没有注意到函数内部调用了函数。谢谢~
【参考方案1】:
这是因为您为 each 递归创建了一个带有头部和尾部的元组。您似乎只想在第一次而不是每次都将它们分开。我会创建两个函数,一个用于分隔标题和尾部,一个用于递归:
def sum_items(items):
head, *tail = items
return head + sum_items(tail) if tail else head
def split_and_sum(items):
head, *tail = items
return head, sum_items(tail) if tail else head
split_and_sum([1,2,3]) # Returns (1, 5)
递归的原因是在不同的数据集上一遍又一遍地应用相同的逻辑。但既然你想做两件不同的事情,最好简单地拥有不同的功能。
【讨论】:
【参考方案2】:它不起作用,因为您使用的是 sum
内置函数,但由于您的函数名为 sum
,因此无法访问它,因此如果您更改函数名称,它将起作用。
所以尝试改变这一行:
def sum(items):
收件人:
def func(items):
并且在调用函数时,改变:
sum([1,2,3])
收件人:
func([1,2,3])
那么结果就是:
(1, 5)
【讨论】:
【参考方案3】:您的问题是您将函数命名为sum
,它覆盖了内置的sum
函数。但是你显然想在你自己的sum
函数中调用内置的sum
函数。那是行不通的。你正在做的是递归调用你自己的函数,而不是调用内置的sum
。
只要重命名你的函数,你就会得到你期望的结果:
def my_sum(items):
head, *tail = items
return head, sum(tail) if tail else head
x = my_sum([1,2,3])
print(x)
结果:
(1, 5)
【讨论】:
以上是关于在python中解包元素的主要内容,如果未能解决你的问题,请参考以下文章
ValueError:没有足够的值来解包(预期为 2,得到 1)当试图在 python 中解包 dict 以使用 pandas 进行数据标记时