2010-08-03 2 views
49
에서

생성자 함수의 결과를 파이썬의 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 %가 게으르다는 것을 확신하므로 생성기 기능과 정확히 동일하게 처리 할 수 ​​있습니까? 아니면 아무것도 조심해야합니까?

+0

난 당신이 veryBigHello에서 난을 증가하는 것을 의미 추정 : 물론

는, 열거는 정말 멋진 생성기입니다. – robert

+0

@robert : 내가 잘못하지 않으면 나는 자동으로 증가한다 –

+0

@the_drow'veryBigHello' 함수 자체가 아니다. –

답변

61

게으르다. 당신이 그것을 definitly 메모리 예외 벗어나 려하지 않고이 함수를 호출 할 수 있기 때문에

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

이 파이썬 2 또는 3 (또는 둘 다)입니까? 둘 다 게으른가요? 나는 Python 2에서 테스트했는데 * 게으름이다. – becko

10

그것은 이전의 하나가 제안보다 말에도 쉽게

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

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

게으른 : 그것은 그런 경우 입증하기 매우 쉽다 : 열거 게으른 평가를 수행하지 않은 경우

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

[(0,'a'), (1,'b'), (2,'c')] 또는 일부 (거의) 상당을 반환합니다.

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

+1

허용 된 답변이어야합니다. – cowbert

관련 문제