перечислите () - луг генератор в Python

Я хотел бы знать то, что происходит, когда я передаю результат функции генератора к Python, перечисляют (). Пример:

def veryBigHello():
    i = 0
    while i < 10000000:
        i += 1
        yield "hello"

numbered = enumerate(veryBigHello())
for i, word in numbered:
    print i, word

Перечисление выполнено с помощью итераций лениво, или оно хлебает все в первое? Я на 99,999% уверен, что это лениво, таким образом, я могу рассматривать его точно то же как функция генератора, или я должен не упустить что-нибудь?

70
задан the_drow 4 August 2010 в 06:26
поделиться

3 ответа

Это лень. Доказать это довольно легко:

>>> def abc():
...     letters = ['a','b','c']
...     for letter in letters:
...         print letter
...         yield letter
...
>>> numbered = enumerate(abc())
>>> for i, word in numbered:
...     print i, word
...
a
0 a
b
1 b
c
2 c
82
ответ дан 24 November 2019 в 13:25
поделиться

Это даже проще, чем любой из предыдущих вариантов:

$ python
Python 2.5.5 (r255:77872, Mar 15 2010, 00:43:13)
[GCC 4.3.4 20090804 (release) 1] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> abc = (letter for letter in 'abc')
>>> abc
<generator object at 0x7ff29d8c>
>>> numbered = enumerate(abc)
>>> numbered
<enumerate object at 0x7ff29e2c>

Если бы enumerate не выполнял ленивую оценку, он бы вернул [(0,'a'), (1,'b'), (2,'c')] или что-то (почти) эквивалентное.

Конечно, enumerate на самом деле просто причудливый генератор:

def myenumerate(iterable):
   count = 0
   for _ in iterable:
      yield (count, _)
      count += 1

for i, val in myenumerate((letter for letter in 'abc')):
    print i, val
38
ответ дан 24 November 2019 в 13:25
поделиться

Поскольку вы можете вызывать эту функцию без исключений из памяти, она определенно является ленивой

def veryBigHello():
    i = 0
    while i < 1000000000000000000000000000:
        yield "hello"

numbered = enumerate(veryBigHello())
for i, word in numbered:
    print i, word
12
ответ дан 24 November 2019 в 13:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: