2017-03-28 14 views
0
나는 무한 발전기의 숫자 반복하고 싶습니다

: 의지 위파이썬 어떻게 동시에 두 무한 발전기를 반복하는

def x(y): 
    while True: 
     for i in xrange(y): 
      yield i 

for i,j in zip(x(5),x(3)): 
    print i,j 

코드는 아무것도 생산하지 것이다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

있겠습니다 리팩토링 할 수 있는가? – Jacobr365

+0

'from itertools import izip as zip' –

+3

@BurhanKhalid : 또는'from future_builtins import zip'. –

답변

1

zip은 발전기에 적합한 도구가 아닙니다. 대신 itertools.izip을 시도하십시오!

(또는 더 나은, 코드가 잘 작동 파이썬 3, 사용 - 당신이 print에 괄호를 추가하면) 파이썬 2 개 zip 시도 발전기 이제까지 모든 요소를 ​​얻어서 목록을 만들 수 있기 때문이다

2

을 생기게 하다. 원하는 것은 반복자입니다 (예 : itertools.izip).

파이썬 3에서 zipizip처럼 작동합니다.

1

목록 대신 반복자를 반환하는 zip 변형을 사용해야합니다. 다행히도 itertools 모듈에는 그 중 하나가 있습니다. 바닐라 zip 이미 반복자이기 때문에 파이썬 3에서, itertools.izip이 존재하지 않는다고

import itertools 

def x(y): 
    while True: 
     for i in xrange(y): 
      yield i 

for i,j in itertools.izip(x(5),x(3)): 
    print i,j 

참고. itertools에서 또한


는 반복 가능한 이상 cycle하는 무한 사이클라는 함수가 있습니다.

iterable에서 요소를 반환하고 각각 복사본을 저장하는 iterator를 만듭니다. 반복 가능 요소가 모두 소모되면 저장된 요소에서 요소를 반환하십시오. 무기한 반복합니다.

그래서 itertools.cycle(range(5))은 귀하의 x(5)과 동일합니다. xrange(5)cycle으로 전달할 수도 있습니다. ;)

0

내가 이해 한 바에 따르면 두 개의 반복자를 동시에 반복하려고합니다. 아무 것도 작동하지 않으면 while 루프를 사용할 수 있습니다.

gen1 = x(5) 
gen2 = x(3) 

while True: 
    try: 
     print(next(gen1), next(gen2)) 
    except StopIteration: 
     break 

당신은 python3.4를 사용하는 경우 위, 다음 함수 x는 그냥 두 개의 별도의 스레드에서 할 수있는

def x(y): 
    yield from xrange(y) 
관련 문제