如何将元组元素作为参数传递给函数?

15

我有一个由元组组成的列表,我想将每个元组的元素作为参数传递给一个函数:

mylist = [(a, b), (c, d), (e, f)]

myfunc(a, b)
myfunc(c, d)
myfunc(e, f)

我该如何做?

2个回答

29

在Python中,这实际上非常容易实现,只需循环遍历列表,并使用展开运算符(*)将元组作为函数参数进行拆包:

mylist = [(a, b), (c, d), (e, f)]
for args in mylist:
    myfunc(*args)

例如:

>>> numbers = [(1, 2), (3, 4), (5, 6)]
>>> for args in numbers:
...     print(*args)
... 
1 2
3 4
5 6

3
另请参阅itertools.starmap - DSM
3
func(*args)语法不仅适用于3.x版本,而print是一个函数,因此在2.x版本中使用print(*args)会导致语法错误。 - Andrew Clark
3
如果只有一个参数,即使你在2.x版本中使用了print函数的括号,括号实际上并没有起到任何作用。例如,print(1)print 1是一样的。同样,其他语句也可以这样写,例如return(1)等价于return 1。请注意,此翻译仅供参考,如果需要专业翻译,请寻求资深的翻译人员帮助。 - Andrew Clark
2
Python 2.x 中的另一个选项是从未来导入打印函数 - from __future__ import print_function - Gareth Latty
1
@DSM 我会避免使用那种方法。通常情况下,列表推导式/生成器表达式是更好的选择,除了一些罕见的情况(https://dev59.com/pWPVa4cB1Zd3GeqP53WO#10448628)。在这里,你不需要构建一个列表或生成器,所以我认为普通循环是最好的选择。 - Gareth Latty
显示剩余7条评论

1

为了明确@DSM的评论:

>>> from itertools import starmap
>>> list(starmap(print, ((1,2), (3,4), (5,6)))) 
# 'list' is used here to force the generator to run out.
# You could instead just iterate like `for _ in starmap(...): pass`, etc.
1 2
3 4
5 6
[None, None, None] # the actual created list;
# `print` returns `None` after printing.

我认为这是一个不好的主意 - 你正在构建一个你实际上并不想要的列表。它很丑陋,也不清晰。 - Gareth Latty
starmap 迭代器可以根据需要使用。在我们想要“将每个元组的元素作为参数传递给函数”的情况下,通常也希望对函数调用的结果进行一些操作。如果不需要这样做,则适合使用 for _ in starmap(...): pass - Karl Knechtel
它能完成任务,但为什么不使用普通的for循环呢?这样对于阅读代码的人来说会更加清晰明了。 - Gareth Latty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接