在python中解包元素

问题描述

看到下面的例子后:

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) 

我做错了什么?

解决方法

那是因为您为每个递归创建了一个带有头尾的元组。您似乎只想在第一次将它们分开,而不是每次都将它们分开。我会创建两个函数,一个用于分隔头部和尾部,一个用于递归:

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)

递归的原因是在不同的数据集上一遍又一遍地应用相同的逻辑。但既然你想做两件不同的事情,最好只是拥有不同的功能。

,

它不起作用,因为您使用的是 sum 内置函数,但由于您的函数名为 sum,因此无法访问,因此如果您更改函数名称,它将起作用。

所以尝试改变这一行:

def sum(items):

致:

def func(items):

并在调用函数时,更改:

sum([1,3])

致:

func([1,3])

那么结果将是:

(1,5)
,

您的问题是您将函数命名为 sum,它覆盖了内置的 sum 函数。但是,您显然想在自己的 sum 函数中调用内置的 sum 函数。那行不通。您正在做的是递归调用您自己的函数,而不是调用内置的 sum

只需重命名您的函数,您就会得到您期望的结果:

def my_sum(items):
    head,sum(tail) if tail else head

x = my_sum([1,3])

print(x)

结果:

(1,5)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...