在Python 2中解压缩多个函数参数

时间:2018-10-26 03:30:37

标签: python python-3.x python-2.x

Possible Relevant Questions(我搜索了相同的问题,但找不到)


Python提供了一种方便的方法,可以使用星号将参数解压缩为函数,如https://docs.python.org/3/tutorial/controlflow.html#unpacking-argument-lists

中所述
>>> list(range(3, 6))            # normal call with separate arguments
[3, 4, 5]
>>> args = [3, 6]
>>> list(range(*args))            # call with arguments unpacked from a list
[3, 4, 5]

在我的代码中,我正在调用这样的函数:

def func(*args):
    for arg in args:
        print(arg)

在Python 3中,我这样称呼它:

a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9]

func(*a, *b, *c)

哪个输出

1 2 3 4 5 6 7 8 9

但是,在Python 2中,我遇到了一个异常:

>>> func(*a, *b, *c)
  File "<stdin>", line 1
    func(*a, *b, *c)
             ^
SyntaxError: invalid syntax
>>> 

似乎Python 2无法处理解压缩多个列表的问题。有没有比这更好,更清洁的方法

func(a[0], a[1], a[2], b[0], b[1], b[2], ...)

我的第一个念头是我可以将列表连接成一个列表并解压缩,但是我想知道是否有更好的解决方案(或者我不理解的解决方案)。

d = a + b + c
func(*d)

1 个答案:

答案 0 :(得分:10)

推荐:迁移至Python 3
从2020年1月1日开始,Python软件基金会不再支持Python编程语言的2.x分支。

拆箱清单并传递到*args

Python 3解决方案

def func(*args):
    for arg in args:
        print(arg)

a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9]

func(*a, *b, *c)

Python 2解决方案

如果需要Python 2,则itertools.chain将提供一种解决方法:

import itertools


def func(*args):
    for arg in args:
        print(arg)

a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9]

func(*itertools.chain(a, b, c))

输出

1
2
3
4
5
6
7
8
9

解压缩字典并传递给**kwargs

Python 3解决方案

def func(**args):
    for k, v in args.items():
        print(f"key: {k}, value: {v}")


a = {"1": "one", "2": "two", "3": "three"}
b = {"4": "four", "5": "five", "6": "six"}
c = {"7": "seven", "8": "eight", "9": "nine"}

func(**a, **b, **c)

Python 2解决方案

如评论中的Elliot所述,如果您需要解压缩多个词典并传递给kwargs,则可以使用以下内容:

import itertools

def func(**args):
    for k, v in args.items():
        print("key: {0}, value: {1}".format(k, v))


a = {"1": "one", "2": "two", "3": "three"}
b = {"4": "four", "5": "five", "6": "six"}
c = {"7": "seven", "8": "eight", "9": "nine"}

func(**dict(itertools.chain(a.items(), b.items(), c.items())))