참고
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 |
댓글