次のような関数があるとしましょう。
def give_me_many(*elements):
#do something...
そして、あなたはそれをそのように呼びます:
generator_expr = (... for ... in ... )
give_me_many(*generator_expr)
要素は遅延して呼び出されますか、それとも関数を実行する前にジェネレーターが数百万の要素すべてを実行しますか?
次のような関数があるとしましょう。
def give_me_many(*elements):
#do something...
そして、あなたはそれをそのように呼びます:
generator_expr = (... for ... in ... )
give_me_many(*generator_expr)
要素は遅延して呼び出されますか、それとも関数を実行する前にジェネレーターが数百万の要素すべてを実行しますか?
引数は常にタプルやディクショナリとして関数に渡されるため、渡されたものはすべて*args
タプルに**kwargs
変換されるか、ディクショナリに変換されます。kwargs
がすでに辞書である場合は、コピーが作成されます。タプルは不変であるためargs
、変更されない限り(他の位置引数を含めるか、名前付きの位置引数にいくつかの引数を削除することによって)コピーする必要はありませんが、他のシーケンスタイプからタプルに変換されます。
いいえそうではありません:
>>> 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