Python |任意参数

Python |任意参数,python,Python,我必须在函数中接受列表的任意参数 这个代码很好用 a=[1,2,3] b=[5,6,7] def joiner(m,n): o = [] return m+n+o print joiner(a,b) 但是当我将代码更改为任意参数时,它就不起作用了 a=[1,2,3] b=[5,6,7] def joiner(*m): o = [] return m+o print joiner(a,b) 出现这种情况的原因可能是一个包含两个(或更多或更少)列表的元组。

我必须在函数中接受列表的任意参数

这个代码很好用

a=[1,2,3]
b=[5,6,7]

def joiner(m,n):
    o = []
    return m+n+o

print joiner(a,b)
但是当我将代码更改为任意参数时,它就不起作用了

a=[1,2,3]
b=[5,6,7]

def joiner(*m):
    o = []
    return m+o

print joiner(a,b)

出现这种情况的原因可能是一个包含两个(或更多或更少)列表的元组。您需要通过
m
循环以获得函数的通用版本

def joiner(*m):
    o = []
    for item in m:
        o += item
    return o

你可以用一行程序来完成,但我认为这更清楚。

函数或方法签名中的星型
*
语法将位置参数打包到
元组中(
)。第二个函数接收一个名为
m
的参数,该参数(例如)如下所示:

([1, 2, 3], [5, 6, 7])
如果您想单独访问该元组(每个参数)的每个成员,那么必须显式地这样做——Python无法神奇地直觉地认为您想要将所有参数添加到一起

def joiner(*args):
    o = []
    for arg in args: # Iterate over each argument your function received.
        o += arg   # or better, o.extend(arg)
    return o

还有一些已经存在的工具可以为您执行此操作:特别是:

当然,在这一点上(正如其他人所提到的),您可能根本不需要编写
joiner
函数,因为包装
itertools.chain
调用只需要额外的几个步骤


…实际上,任何时候只要你使用一个或多个iterables做任何事情,你都应该去查看
itertools
模块,看看是否有人已经为你实现了它。:-)

我对一系列正确答案的贡献:p

import itertools

def joiner(*m):
    return itertools.chain.from_iterable(m)

你试过你的代码吗?错误信息非常清楚。o什么也没做。。。只是想让你知道。。。非常接近a+1。。去掉sum注释。。。虽然这确实是一个垃圾代码,而且是一个需要教导或鼓励的坏习惯(比其他方法更不清晰,速度也慢得多),但Joran 100%同意这一点。在这种情况下,
sum
起作用的唯一原因是函数的作者无法想出一种好方法使其不适用于任意的可重用项(因为
Iterable
还不存在)。正确的编写方法是使用
,如他的答案所示,或者明确地这样做。这里的sum的问题是,它对于几乎任何不是数字的东西都具有二次性能。现在,您可以得到我的+1:P@gnibbler:sum的真正问题在于它具有误导性。人们已经多次提出“修复”,让它使用
+=
而不是
+
,这将使它在所有可变可数(以及字符串,出于不同的原因)下具有摊销线性或对数线性性能,但这一想法总是被拒绝,因为
sum
用于对数字求和,而
chain
是用来链接可重用项的。如果您实际上不需要列表,那么这很好。但是你可以说:我知道。。。但是我想我会像他那样用一种方法保存它it@gnibbler:如果您确实需要一个列表,
返回列表(itertools.chain.from_iterable(m))
。或者,需要返回一个,因此将三个
deque
s连接在一起将返回一个
deque
。(当然,将两个
deque
s、一个
列表
和一个
元组
连接起来也会返回一个
deque
…但在这种情况下,您需要它…)
import itertools

def joiner(*m):
    return itertools.chain.from_iterable(m)