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.