복붙노트

[PYTHON] 파이썬 3.3에서 수율과 함께 생성기에서 반환

PYTHON

파이썬 3.3에서 수율과 함께 생성기에서 반환

파이썬 2에서는 함수 정의에서 yield가 반환 될 때 오류가 발생했습니다. 하지만이 코드는 Python 3.3

def f():
  return 3
  yield 2

x = f()
print(x.__next__())

yield가있는 함수에서 return이 사용된다는 오류는 없습니다. 그러나 __next__ 함수가 호출되면 StopIteration 예외가 발생합니다. 왜 그냥 값 3을 돌려주지 않는가? 이 수익은 어떻게 든 무시됩니까?

해결법

  1. ==============================

    1.이것은 Python 3.3의 새로운 기능입니다 (주석 노트에서는 3.2에서도 작동하지 않습니다). 생성기에서 리턴하는 것이 오랫동안 StopIteration ()을 발생시키는 것과 같습니다. 생성기에서 return 은 이제 StopIteration ()을 발생시키는 것과 같습니다. 이러한 이유로 인해 표시되는 예외는 StopIteration : 3으로 인쇄되어야하며 값은 예외 객체의 속성 값을 통해 액세스 할 수 있습니다. 생성기가 (새로운) yield from 구문을 사용하도록 위임 된 경우 그 결과입니다. 자세한 내용은 PEP 380을 참조하십시오.

    이것은 Python 3.3의 새로운 기능입니다 (주석 노트에서는 3.2에서도 작동하지 않습니다). 생성기에서 리턴하는 것이 오랫동안 StopIteration ()을 발생시키는 것과 같습니다. 생성기에서 return 은 이제 StopIteration ()을 발생시키는 것과 같습니다. 이러한 이유로 인해 표시되는 예외는 StopIteration : 3으로 인쇄되어야하며 값은 예외 객체의 속성 값을 통해 액세스 할 수 있습니다. 생성기가 (새로운) yield from 구문을 사용하도록 위임 된 경우 그 결과입니다. 자세한 내용은 PEP 380을 참조하십시오.

    def f():
        return 1
        yield 2
    
    def g():
        x = yield from f()
        print(x)
    
    # g is still a generator so we need to iterate to run it:
    for _ in g():
        pass
    

    이것은 1은 인쇄하지만 2는 인쇄하지 않습니다.

  2. ==============================

    2.반환 값은 무시되지 않지만 생성기는 값만 생성하고 반환은 생성기를 끝내기 만합니다.이 경우 초기에 발생합니다. 이 경우 생성기를 발전시키는 것은 절대로 yield 문에 도달하지 않습니다.

    반환 값은 무시되지 않지만 생성기는 값만 생성하고 반환은 생성기를 끝내기 만합니다.이 경우 초기에 발생합니다. 이 경우 생성기를 발전시키는 것은 절대로 yield 문에 도달하지 않습니다.

    반복자가 양보 할 값의 '끝'에 도달 할 때마다 StopIteration을 발생시켜야합니다. 발전기도 예외는 아닙니다. 그러나 파이썬 3.3에서 어떤 반환 식이라도 예외의 값이됩니다 :

    >>> def gen():
    ...     return 3
    ...     yield 2
    ... 
    >>> try:
    ...     next(gen())
    ... except StopIteration as ex:
    ...     e = ex
    ... 
    >>> e
    StopIteration(3,)
    >>> e.value
    3
    

    .__ next __ ()를 직접 호출하는 대신 next () 함수를 사용하여 이터레이터를 진행하십시오.

    print(next(x))
    
  3. from https://stackoverflow.com/questions/16780002/return-in-generator-together-with-yield-in-python-3-3 by cc-by-sa and MIT license