Расширяют ли аргументы Python переменной длины (* args) генератор во время вызова функции? - PullRequest
9 голосов
/ 03 марта 2011

Рассмотрим следующий код 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, и один раз, чтобы перебрать аргументы? Или генератор сохраняется в первоначальном состоянии, в то время как итерация происходит только один раз в течение цикла for?

Ответы [ 3 ]

13 голосов
/ 03 марта 2011

Генератор расширяется во время вызова функции, так как вы можете легко проверить:

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

напечатает

('foo', 'bar', 'baz')
2 голосов
/ 03 марта 2011

Почему бы не посмотреть и не увидеть, что gen находится в f()?Добавьте print args в качестве первой строки.Если это все еще объект-генератор, он скажет вам.Я ожидаю, что аргумент распаковки превратит его в кортеж.

1 голос
/ 09 декабря 2012

Тебе не нужно

gen = (f for f in foo)

Вызов

f(*foo)

выдаст

('foo', 'bar', 'baz')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...