Python 3에서 generator.next ()가 표시됩니까?


247

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

def triangle_nums():
    '''Generates a series of triangle numbers'''
    tn = 0
    counter = 1
    while True:
        tn += counter
        yield tn
        counter += + 1

파이썬 2에서는 다음과 같은 호출을 할 수 있습니다.

g = triangle_nums()  # get the generator
g.next()             # get the next value

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

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

그러나 루프 반복기 구문은 Python 3에서 작동합니다.

for n in triangle_nums():
    if not exit_cond:
       do_something()...

파이썬 3의 동작의 차이점을 설명하는 것을 아직 찾을 수 없었습니다.

답변:


406

g.next()로 이름이 변경되었습니다 g.__next__(). 특별한 방법이 좋아 : 그 이유는 일관성입니다 __init__()__del__()모든 이중 밑줄 (또는 현재 고장에서 "던더")을 가지고 있고, .next()그 규칙에 대한 몇 가지 예외 중 하나였다. 이것은 파이썬 3.0에서 수정되었습니다. [*]

그러나을 호출하는 대신을 g.__next__()사용하십시오 next(g).

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


python 2가 왜 이러한 방법에 대한 던전 규칙을 피했는지 왜 알 수 있습니까?
Rick은 Monica

아마 감독 일뿐입니다.
Lennart Regebro

클래스에서 __ str __을 덮어 쓰면 어떻습니까? str (obj) 또는 __str __ (obj)을 변경합니까?
NONAME

@NoName과 같은 것은 없으므로 __str__(obj)질문을 실제로 이해하지 못합니다.
Lennart Regebro

1
@NoName 예, 그렇습니다.
Lennart Regebro

144

시험:

next(g)

2와 3 사이의 구문 차이를 보여주는 이 깔끔한 테이블 을 확인하십시오 .


1
@MaikuMori 나는 (이 사이트의 (피어 개정 대기) 링크를 고정 diveintopython3.org이 내려 것 같다 미러 사이트. diveintopython3.ep.io는 아직 살아있다)
gecco

1
링크를 다시 수정했습니다. python3porting.com/differences.html 이 더 완벽합니다.
Lennart Regebro

함수에 대한 방법에서 스위치에 대한 정당성이 있는가, 이상은 g.next()정말해야합니다 g.__next__(), 우리는의 기능을 가진 던더 방법이 아닙니다 무언가가 필요 g.next()?
TC Proctor

11

코드가 Python2 및 Python3에서 실행되어야하는 경우 다음 과 같이 2to3 6 라이브러리를 사용하십시오 .

import six

six.next(g)  # on PY2K: 'g.next()' and onPY3K: 'next(g)'

18
2.6 이전의 Python 버전을 지원해야하는 경우가 아니라면이를 필요로하지 않습니다. 파이썬 2.6과 2.7에는 next내장 함수가 있습니다.
Mark Dickinson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.