【问题标题】:Unpacking elements in python在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函数里面?这两种方法都是有效的。你到底想在这里做什么?
  • 对,我想我的问题是我没有注意到函数内部调用了函数。谢谢~

标签: python list function sum unpack


【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 2021-07-11
        • 1970-01-01
        • 2015-05-15
        • 1970-01-01
        • 1970-01-01
        • 2019-03-09
        • 2016-11-11
        • 1970-01-01
        • 2019-10-26
        相关资源
        最近更新 更多