2017-05-09 5 views
1

간단한 함수 발생기 I 만든?내 파이썬 생성기 기능이 정말로 게으른가요?</p>가 <pre><code>def myfunc(text): for i in text[::-1]: yield(i) for i in myfunc("anytext"): print(i) </code></pre> <p><code>text[::-1]</code> 발생기 내부 기능이 먼저 평가되는 것이다되거나 느리게 평가 (발전기 함수로부터 예상)한다 :

+3

문자열 분리를 할 때와 완전히 똑같이 평가 될 것입니다 :'str [...]'는 새로운 문자열을 반환하고, 그 다음 반복합니다. – deceze

답변

2

텍스트가 반복되기 전에 되돌려집니다. 그것은 다른 어떤 방법도 될 수 없습니다. for 루프는 반복 할 텍스트가 필요합니다.

정말 게으르려면 색인을 사용해야합니다.

def myfunc(text): 
    for i in range(len(text) - 1, -1, -1): 
     yield text[i] 

파이썬 2에서, range 대신에 xrange를 사용합니다.

물론 기본적으로 기본 제공 함수 reversed()을 다시 구현했습니다.

+0

"다른 방법은있을 수 없으며 for 루프는 반복 할 텍스트가 필요합니다." 불행한 말씨? 여전히 for 루프를 사용하고 있습니다. – viraptor

+0

@viraptor'text [:: - 1]'을 평가해야하고 그 결과로 만든 반복자입니다. 그렇기 때문에이 경우에는 "reversed text"를 생성해야합니다 ** ** 전에'for' 루프가 시작될 수있다. (물론'str .__ getitem__'이 반복자를 반환했다면 게으르다.) – donkopotamus

+1

글쎄,'text [:: - 1]'*는 문자열 대신에 반복자를 반환 할 수있다. 방법; 그것은 분명히 아닙니다. – deceze