Являются ли параметры параметрами ленивыми?

Возможный дубликат:
Разве аргументы переменной длины python (* args) расширяют генератор во время вызова функции?

Скажем, у вас есть такая функция:

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

И вы называете это так:

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

Будут ли элементы называться лениво или генератор будет запускать все возможные миллионы элементов до того, как функция будет выполнена?

Ответ 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

Ответ 2

Аргументы всегда передаются функции как кортеж и/или словарь, поэтому все, что передается с *args, будет преобразовано в кортеж, или **kwargs будет преобразован в словарь. Если kwargs уже является словарем, тогда делается копия. кортежи являются неизменяемыми, поэтому args не нужно копировать, если он не изменяется (путем включения других позиционных аргументов или удаления некоторых аргументов в именованные позиционные), но он будет преобразован из любого другого типа последовательности в кортеж.

Ответ 3

Документы говорят, что

Эти аргументы будут завернуты в кортеж

что означает, что генератор оценивается раньше.