在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 headsum什么?你从不添加任何东西。您删除了添加 再次...只是为了让我们都清楚您的想法...您是要递归调用自己的函数,还是要调用内置的@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中解包元素的主要内容,如果未能解决你的问题,请参考以下文章

python中的解包

没有足够的值在 Python 中解包

在 python 中解包一个元组并对其进行迭代

ValueError:没有足够的值来解包(预期为 2,得到 1)当试图在 python 中解包 dict 以使用 pandas 进行数据标记时

python ValueError:在元组中解包的值太多

在 for 循环中解包 Vector/Set