Python |任意论点

时间:2014-02-17 23:10:40

标签: 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)

这可能是什么原因

3 个答案:

答案 0 :(得分:3)

m是包含两个(或更多或更少)列表的元组。您需要遍历m才能获得函数的通用版本

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

你可以在一个班轮里做这件事,但我认为这更清楚。

答案 1 :(得分:3)

函数或方法签名中的星号*语法将位置参数打包成tuplesee this answer以获取大量详细信息)。你的第二个函数接收一个名为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

还有一些工具可供您使用:具体来说,itertools.chain

import itertools
def joiner(*m):
    return list(itertools.chain(*m))

当然在那时(正如其他人提到的那样),你可能根本就不会编写joiner函数,因为它只需要一些额外的步骤来包装itertools.chain调用。

......实际上,每当你用一个或多个iterables做任何时,你应该去查看itertools模块,看看是否有人已经为你实现了它。 : - )

答案 2 :(得分:2)

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

import itertools

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