2013-05-19 1 views
7

파이썬의 itertools.cycle에 대한 문서는()와 같은 의사 코드 구현 제공 : 아래왜 파이썬의 itertools.cycle은 반복 가능한 복사본을 생성해야합니까?

def cycle(iterable): 
    # cycle('ABCD') --> A B C D A B C D A B C D ... 
    saved = [] 
    for element in iterable: 
     yield element 
     saved.append(element) 
    while saved: 
     for element in saved: 
       yield element 

를,이 상태 : "참고 툴킷이 멤버는 중요한 보조 기억 장치를 필요로 할 수있다 (의 길이에 따라 iterable). "

def loop(iterable): 
    it = iterable.__iter__() 

    while True: 
     try: 
      yield it.next() 
     except StopIteration: 
      it = iterable.__iter__() 
      yield it.next() 

x = {1, 2, 3} 

hard_limit = 6 
for i in loop(x): 
    if hard_limit <= 0: 
     break 

    print i 
    hard_limit -= 1 

인쇄 :

1 
2 
3 
1 
2 
3 

예, 내 구현을 실현 내가 이런 짓을 제외하고

나는 기본적으로 반복자의 복사본을 만들 필요로하지 않는,이 길을 가고 있었다 str의 경우에는 작동하지 않지만 그렇게 할 수는 있습니다. 왜 다른 복사본을 만드는 지에 대해 더 궁금합니다. 쓰레기 수거와 관련된 느낌이 들지만, 파이썬의이 분야에서 잘 공부하지는 못했습니다.

감사합니다.

+0

@Martijn 구문 강조 표시를 어떻게 추가 했습니까? 나는 그것을하는 법을 이해할 수 없었다 ... – stantonk

+0

나는하지 않았다; 나는'python' 태그를 추가하고 강조 표시가 자동으로 적용됩니다. 그러나 태그 강조 표시가없는 경우에도 어쨌든 정확하게 추측됩니다. –

+0

아,하지만 python2.7 태그는 그렇지 않나요? 이상한 ... – stantonk

답변

11

반복문은 번에만 번만 반복 할 수 있습니다.

반복문에 새 반복문을 생성 할 수 있습니다. 주기는 그렇게 할 수 없으며, 전달한 항목과 함께 작동해야합니다. cycle은 반복 가능을 단순히 재현 할 수 없습니다. 따라서 원래 반복기가 생성하는 모든 요소를 ​​저장해야합니다. 대신 다음과 발전기를 전달한다면

, 당신의 loop() 실패 : 이제

def finite_generator(source=[3, 2, 1]): 
    while source: 
     yield source.pop() 

당신의 loop()는 생산 :

귀하의 코드 만있는 cycle()을 사용하여 시퀀스를 위해 일하는 것이
>>> hard_limit = 6 
>>> for i in loop(finite_generator()): 
...  if hard_limit <= 0: 
...   break 
...  print i 
...  hard_limit -= 1 
... 
1 
2 
3 

과잉 될 것이다. 이 경우 저장 용량이 cycle() 일 필요가 없습니다. 다음으로 간단히 지정하십시오 :

def loop_sequence(seq): 
    while True: 
     for elem in seq: 
      yield elem 
+0

나는 당신의 대답이 무엇인지 잘 모르겠다. 나의 질문은 왜 그것이 입력의 사본을 만들어야 하는가이다. 그들은 보조 기억 장치에 대한 의미를 적어 놓았습니다 ... 그 문제를 해결하지 않는 이유는 무엇입니까? – stantonk

+0

@stantonk : 그게 내가 다루고있는 것이다. 반복자가 어떻게 한 번 요소를 생성 할 수 있는지 보여 드리고자합니다. 반복하려는 경우 해당 요소를 저장해야합니다. –

+0

@stantonk : 당신은 새로운 반복자를 만드는'set' 능력에 속았습니다; 그것은 여전히 ​​엘리먼트를 가지므로 매번 동일한 엘리먼트를위한 새로운 반복자를 생성 할 수있다. –