티스토리 뷰
[generator expression]
- generator 는 링크드 리스트 처럼 순차적으로만 접근이 가능하고 리스트나 튜플처럼 인덱싱으로 접근할 수 없다
ns = (n for n in range(10))
이런식으로 생성할 수 있다.
단 이건 튜플 컴프리헨션이 아니다, 혼동 없길 바란다.
print(ns.__next__())
print(ns.__next__())
print(ns.__next__())
위의 코드로 순차적으로 접근 할 수 있다.
for n in ns:
print(n)
이런식으로도 접근이 가능하다.
객체의 사이즈도 특징인데 list 와 동일 요소를 가지고 있는 경우 더 차이가 있다.
import sys
ns1 = (n for n in range(1000))
ns2 = [n for n in range(1000)]
print(sys.getsizeof(ns1), sys.getsizeof(ns2))
위와 같이 0~999 까지 요소를 가지고 있는 경우 객체의 사이즈를 측정해 보자
64 4516
리스트 대비 사이즈에서 이점이 있고 요소의 갯수와 상관없이 동일하다
lazy 하게 동작해서 순차적으로 접근해야만하는 단점이 있지만, 인덱싱할 필요가 없는 경우 유용하다.
아래 코드 처럼 제네레이터는 한번 소비하면 2번째 for문의 루프에서는 동작하지 않는다.
g = (i for i in range(11) if i % 2)
for i in g:
print(i)
for i in g:
print(i)
[lazy evalution]
리스트에는 0으로 나누면 요소를 미리 계산해서 만들기 때문에 에러가 나지만
제네레이터에서는 0으로 나눈 값을 요소로 해도 나중에 계산하기 때문에 에러가 나지 않는다.
gs = (i/0 for i in range(n))
ls = [i/0 for i in range(n)]
[yield]
def square(n):
for i in range(n):
yield i*i
for c in square(10):
print(c)
여기서 yield 는 return 과 비슷하지만 다른 의미를 지닌다.
yield 가 실행되면 next() 가 실행된 쪽으로 값을 반환해 주고 함수는 종료하지 않는다.
함수 내부에서 사용된 데이터는 그대로 유지되고 다음 next() 가 불리면 이어서 작동한다.
0
1
4
9
16
25
36
49
64
81
함수형으로 호출하면 소비 되더라도 여러번 재사용이 가능하다.
def generator(n):
for i in range(n+1):
if i % 2:
yield i
for i in generator(10):
print(i)
for i in generator(10):
print(i)
[itertools.tee]
import itertools
def generator(n):
for i in range(n+1):
if i % 2:
yield i
g1, g2 = itertools.tee(generator(10), 2)
for i in g1:
print(i)
for i in g2:
print(i)
여러번 소비할 경우나 복사본이 필요 한 경우에는 tee() 함수를 사용해 보자
인자에 복사할 제네레이터와 몇개를 원하는지 써주면
언패킹된 상태로 리턴값을 받을 수 있다.
g1, g2 는 동일한 복사본이다.
'python lecture > basic' 카테고리의 다른 글
[edu] 스택 (리스트, 클래스) (0) | 2019.01.22 |
---|---|
[edu] 큐 (리스트, 클래스) (0) | 2019.01.22 |
[edu] 두 수 계산하기(사칙연산, 계산기, lazy) (0) | 2019.01.17 |
[edu] 슬라이싱 (slice, slicing) (0) | 2019.01.17 |
[edu] for, comprehension, function 예제 모음 (0) | 2019.01.17 |
- Total
- Today
- Yesterday
- Tistory
- 파이썬 프로그래밍
- django
- PuTTYGen
- 장고 플러스친구 자동응답
- virtualenv
- chatbot
- gitignore
- 엑셀 비교
- 모바일 스킨 적용
- 파이썬
- django chatbot
- 장고
- 장고 카톡 자동응답
- wsgi
- 문서 비교
- 모바일 테마 적용
- 플러스친구 자동응답
- 파이썬 강좌
- admin.py
- GIT
- Python
- 파이썬 입문
- pycrypto
- 문과 코딩
- 면접답변
- 면접정답
- gitlab
- 파이썬 독학
- 이미지 비교
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |