문제

예를 들어 시리즈를 생성하는 생성기가 있습니다.

def triangleNums():
    '''generate series of triangle numbers'''
    tn = 0
    counter = 1
    while(True):
        tn = tn + counter
        yield tn
        counter = counter + 1

Python 2.6에서는 다음과 같은 전화를 할 수 있습니다.

g = triangleNums() # get the generator
g.next()           # get next val

그러나 3.0에서 동일한 두 줄의 코드를 실행하면 다음 오류가 발생합니다.

AttributeError: 'generator' object has no attribute 'next'

그러나 루프 반복자 구문은 3.0에서 작동합니다.

for n in triangleNums():
    if not exitCond:
       doSomething...

3.0의 행동 차이를 설명하는 것은 아직 찾을 수 없었습니다.

도움이 되었습니까?

해결책

옳은, g.next() 이름이 바뀌 었습니다 g.__next__(). 그 이유는 일관성입니다. __init__() 그리고 __del__ 모두 이중 밑줄 (또는 현재 언어에서 "Dunder")이 있으며 .next() 그 규칙에 대한 몇 가지 예외 중 하나였습니다. 이것은 파이썬 3.0에서 고정되었습니다. [*

그러나 전화하는 대신 g.__next__(), Paolo가 말했듯이 사용하십시오 next(g).

*]이 수정을받은 다른 특수 속성이 있습니다. func_name, 지금입니다 __name__, 등.

다른 팁

노력하다:

next(g)

체크 아웃 이 깔끔한 테이블 이는 구문의 차이가 2와 3 사이의 차이를 보여줍니다.

코드가 Python2 및 Python3에서 실행되어야하는 경우 2to3를 사용하십시오. 여섯 이와 같은 도서관 :

import six

six.next(g)  # on PY2K: 'g.next()' and onPY3K: 'next(g)'
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top