Ответ 1
нет, они не являются:
>>> 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
Возможный дубликат:
Разве аргументы переменной длины python (* args) расширяют генератор во время вызова функции?
Скажем, у вас есть такая функция:
def give_me_many(*elements):
#do something...
И вы называете это так:
generator_expr = (... for ... in ... )
give_me_many(*generator_expr)
Будут ли элементы называться лениво или генератор будет запускать все возможные миллионы элементов до того, как функция будет выполнена?
нет, они не являются:
>>> 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
Аргументы всегда передаются функции как кортеж и/или словарь, поэтому все, что передается с *args
, будет преобразовано в кортеж, или **kwargs
будет преобразован в словарь. Если kwargs
уже является словарем, тогда делается копия. кортежи являются неизменяемыми, поэтому args
не нужно копировать, если он не изменяется (путем включения других позиционных аргументов или удаления некоторых аргументов в именованные позиционные), но он будет преобразован из любого другого типа последовательности в кортеж.
Документы говорят, что
Эти аргументы будут завернуты в кортеж
что означает, что генератор оценивается раньше.