enumerate ()-Python에서 생성기


88

생성기 함수의 결과를 파이썬의 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 % 확신한다. 그래서 그것을 생성기 함수와 똑같이 취급 할 수 있는가, 아니면 무엇을 조심해야 하는가?


1
나는 당신이 veryBigHello에서 i를 증가시키는 것을 의미한다고 생각합니다.
로버트

@robert : 내가 착각하고 있지 않다 경우 나는 자동 증가
the_drow

@the_drow veryBigHello함수 자체 에는 없습니다.
Will McCutchen

1
@Will : 오, 맞습니다. 그러나 그것은 단지 어리석은 일입니다. 예입니다. 어쨌든 수정되었습니다.
the_drow

답변:


103

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

>>> 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 2 또는 3 (또는 둘 다)입니까? 둘 다 게으른가요? 파이썬 2에서 테스트 그것은 이다 게으른.
becko

2
나는 이것을 Python 3.5.2에서 테스트했으며 느리게 평가됩니다.
gobernador

42

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

$ 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

2
이 설명에 감사드립니다. 나는 받아 들여지는 대답을 알아내는 데 약간의 어려움을 겪었습니다. 적어도 내가 당신의 것을 볼 때까지.
trendsetter37

13

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

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

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

0

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

i=(-1)
for x in some_generator:
    i+=1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.