可能是重复问题:
Python的可变长度参数(*args)会在函数调用时展开生成器吗?
假设你有这样一个函数:
def give_me_many(*elements):
#do something...
你可以像这样调用它:
generator_expr = (... for ... in ... )
give_me_many(*generator_expr)
元素会被惰性地调用,还是生成器会在函数执行之前运行所有可能的数百万个元素?
可能是重复问题:
Python的可变长度参数(*args)会在函数调用时展开生成器吗?
假设你有这样一个函数:
def give_me_many(*elements):
#do something...
你可以像这样调用它:
generator_expr = (... for ... in ... )
give_me_many(*generator_expr)
元素会被惰性地调用,还是生成器会在函数执行之前运行所有可能的数百万个元素?
函数的参数总是作为元组和/或字典传递的,因此使用*args
传入的任何内容都将转换为元组, **kwargs
将转换为字典。如果 kwargs
已经是一个字典,则会创建它的副本。元组是不可变的,因此除非它发生变化(通过包含其他位置参数或删除某些参数以命名位置参数),否则不需要复制 args
,但是它将从任何其他序列类型转换为元组。
tuple(..)
(或 dict(..)
)进行转换将迫使求值整个生成器。 - huonf(*some_tuple)
比调用f(*some_list)
稍微快一些。哦。 - Lauritz V. Thaulow不,它们不是:
>>> def noisy(n):
... for i in range(n):
... print i
... yield i
...
>>> def test(*args):
... print "in test"
... for arg in args:
... print arg
...
>>> test(*noisy(4))
0
1
2
3
in test
0
1
2
3