python的可变长度参数(* args)在函数调用时扩展生成器吗?

时间:2011-03-03 15:26:18

标签: python function iteration generator

考虑以下Python代码:

def f(*args):
    for a in args:
        pass

foo = ['foo', 'bar', 'baz']

# Python generator expressions FTW
gen = (f for f in foo)

f(*gen)

*args会在通话时自动展开发电机吗?换句话说,我在gen内迭代f(*gen)两次,一次展开*args,一次迭代args?或者生成器是保持原始状态,而迭代只在for循环中发生一次?

3 个答案:

答案 0 :(得分:13)

在函数调用时扩展生成器,因为您可以轻松检查:

def f(*args):
    print(args)
foo = ['foo', 'bar', 'baz']
gen = (f for f in foo)
f(*gen)

将打印

('foo', 'bar', 'baz')

答案 1 :(得分:2)

为什么不查看genf()的内容?添加print args作为第一行。如果它仍然是一个生成器对象,它会告诉你。我希望解压缩的参数能把它变成一个元组。

答案 2 :(得分:1)

你真的不需要

gen = (f for f in foo)

调用

f(*foo)

将输出

('foo', 'bar', 'baz')