[python] enumerate ()-Python에서 생성기

생성기 함수의 결과를 파이썬의 enumerate ()에 전달할 때 어떤 일이 발생하는지 알고 싶습니다. 예:

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

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

열거 형이 느리게 반복됩니까, 아니면 모든 것을 첫 번째로 밀어 넣습니까? 나는 그것이 게으른 것이라고 99.999 % 확신한다. 그래서 그것을 생성기 함수와 똑같이 취급 할 수 있는가, 아니면 무엇을 조심해야 하는가?



답변

게으르다. 그 사실을 증명하는 것은 매우 쉽습니다.

>>> 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


답변

이전 제안 중 하나보다 쉽게 ​​알 수 있습니다.

$ 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


답변

메모리 예외를 벗어나지 않고이 함수를 호출 할 수 있으므로 확실히 게으르다

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

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


답변

다른 사람 (sklearn)이 작성한 생성기를 사용하고 있었기 때문에 여기에서 접근 방식으로 작동하지 않는 오래된 학교 대안.

i=(-1)
for x in some_generator:
    i+=1


답변