Python 3.0에서 Generator.next ()가 표시됩니까?
-
21-08-2019 - |
문제
예를 들어 시리즈를 생성하는 생성기가 있습니다.
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__
, 등.
제휴하지 않습니다 StackOverflow