본문 바로가기
언어 정리/python_lib,일급함수

2_generator

by 알 수 없는 사용자 2022. 6. 13.

참고

https://blog.humminglab.io/posts/python-coroutine-programming-1/

 

Python 비동기 프로그래밍 제대로 이해하기(1/2) - Asyncio, Coroutine

Python2 와 비교하여 python3의 가장 돋보이는 killer feature 는 비동기 프로그래밍 지원이라고 할 수 있다. 이를 위하여 python 3.4에 asyncio 모듈이 추가되었고, python 3.5 에는 native coroutine 지원을 위한 async

blog.humminglab.io

- 이 블로그 참조, 내가 더 궁금한건 더 추가해서 설명함. 

- 거의 따라 쓴 부분이 많은 정도 


목차 

  • iterator
  • yield 키워드와 generator
  • yield from
  • asyncio
  • async, await
  • future

Iterator를 좀더 편하게 사용하는 방법은 다른 언어처럼 yield 를 이용하여 coroutine을 지원하는 것이다. Python 2.2 (PEP 255 – Simple Generator)에서는 이와 같은 lightweight coroutine 지원이 추가되었다. 이를 generator라고 부른다.

 

PEP 255 – Simple Generators | peps.python.org

PEP 255 – Simple Generators Author: nas at arctrix.com (Neil Schemenauer), tim.peters at gmail.com (Tim Peters), magnus at hetland.org (Magnus Lie Hetland) Status: Final Type: Standards Track Requires: 234 Created: 18-May-2001 Python-Version: 2.2 Post-Hi

peps.python.org

 


>>> def test_generator():
...     yield 1
...     yield 2
...     yield 3
...
>>> gen=test_generator()
>>> next(gen)
1
>>> gen.__next__()
2
>>> next(gen)
3
>>> gen.__next__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>

제네레이터 심플 ex)

코드 : 

def test1():
    print('print 1')
    yield 1
    print('print 2')
    yield 2

 

일반 함수 vs 제네레이터함수 

Generator는 함수안에 yield keyword가 있다는 것을 제외하고는 일반 함수와 동일하지만, 이 함수를 호출하면 완전히 다른 동작을 한다.

  • 일반 함수 호출 시: 함수의 body 가 실행됨
  • Generator(yield가 있는 함수) 호출 시: Generator가 실행되는 것이 아니라 이 함수를 감싸는 ‘generator’ 객체가 리턴된다. Generator 객체는 iterator와 동일하게 __next__() 를 가진 객체이다.

+ 생성은 iterator와 generator가 다르지만, 생성된 후의 동작은 완전히 동일하다.


generator 를 안쓰고 직접 함수로 만들면

def test2():
    for i in range(10):
        yield i * 2

== 

if '__next__' in x:   # for iterator or generator
    try:
        while True:
            i = next(x)
            print  i
    except StopIteration:
        break
    else:
        raise
else:  # for list
    idx = 0
    while True
        i = x[idx]
        print i
        idx += 1

generator 컴프리헨션

https://wonhyeok1994.tistory.com/42?category=1054517 

 

List Comprehension 리스트 컴프리헨션 +(딕셔너리 + 튜플)

https://wikidocs.net/22805 1) 리스트 컴프리헨션 ## 리스트 생성하기 기존에 배운 문법으로 1부터 10까지 정수를 순서대로 가지고 있는 리스트를 생성하는코드는 다음과 같습니다. ``` numbers = [] for ... wik

wonhyeok1994.tistory.com

위 블로그 참조


generator Exception 처리

 

generator 안에서 동작 중 발생하는 exception은 일반 함수와 마찬가지로 처리된다. 예를 들어 아래 코드를 실행하였을 때의 결과이다 .

>>> def f():
        return 1/0
>>> def g():
        yield f()  # the zero division exception propagates
        yield 42   # and we'll never get here
>>> k = g()
>>> next(k)
ZeroDivisionError: integer division or modulo by zero
>>> next(k)  # and the generator cannot be resumed
StopIteration

일반 exception과 차이가 나는 부분은 다음과 같이 두가지 이다.

  • 위처럼 한번 exception이 발생한 generator는 더 이상 실행할 수 없다. 위 처럼 next()를 다시 호출해도 42가 리턴되는 것이 아니라 StopIteration으로 generator가 종료되었다고 exception을 발생한다.
  • generator 함수에서는 try/except 는 사용 가능하나, try/except/finally 처럼 finally를 사용할 수 없다.
def f():
    try:
        yield 1
        try:
            yield 2
            1/0
            yield 3  # never get here
        except ZeroDivisionError:
            yield 4
            yield 5
            raise
        except:
            yield 6
            yield 7     # the "raise" above stops this
    except:
        yield 8
    yield 9
    try:
        x = 12
    finally:
        yield 10
    yield 11

a=f()
print(type(f()))
print(type(a))

print(list(f()))

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'언어 정리 > python_lib,일급함수' 카테고리의 다른 글

5_iter_gen_yield기반coroutine 함수기반정리  (0) 2022.06.15
3_yield기반의 coroutine 코루틴  (0) 2022.06.14
1_iterator  (0) 2022.06.12
tts_lib 정리  (0) 2022.05.16
큐_queue_정리_간단  (0) 2022.05.10

댓글