10

重複の可能性:
Pythonの可変長引数(* args)は、関数呼び出し時にジェネレーターを拡張しますか?

次のような関数があるとしましょう。

def give_me_many(*elements):
   #do something...

そして、あなたはそれをそのように呼びます:

generator_expr = (... for ... in ... )
give_me_many(*generator_expr)

要素は遅延して呼び出されますか、それとも関数を実行する前にジェネレーターが数百万の要素すべてを実行しますか?

4

3 に答える 3

14

引数は常にタプルやディクショナリとして関数に渡されるため、渡されたものはすべて*argsタプルに**kwargs変換されるか、ディクショナリに変換されます。kwargsがすでに辞書である場合は、コピーが作成されます。タプルは不変であるためargs、変更されない限り(他の位置引数を含めるか、名前付きの位置引数にいくつかの引数を削除することによって)コピーする必要はありませんが、他のシーケンスタイプからタプルに変換されます。

于 2012-08-16T12:06:18.777 に答える
12

いいえそうではありません:

>>> 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
于 2012-08-16T12:03:41.993 に答える
0

ドキュメントによると

これらの引数はタプルにまとめられます

これは、ジェネレータが早期に評価されることを意味します。

于 2012-08-16T12:41:50.273 に答える