안녕세계
[Python] iterator 와 generator 본문
[Python] iterator 와 generator
Junhong Kim 2019. 1. 17. 23:32Iterator
collection(list, tuple, set, dict), 문자열 등은 for문을 사용해여 데이터를 하나씩 처리할 수 있습니다.
이 처럼 데이터를 하나씩 처리할 수 있는 collection이나 sequence를 Iterable Object
라고 합니다.
# List Iterable
for n in [1, 2, 3]:
print(n)
# String Iterable
for x in 'HelloWorld':
print(x)
파이썬 built-in 함수 iter(<Iterable Object>)는 iterator
를 리턴합니다.
iterator는 next()
를 사용하여 다음 element를 가져옵니다.
만약, 더이상 next() element가 없을 경우 StopIteration Exception
을 발생시킵니다.
m_list = [1, 2, 3]
i = iter(m_list)
print(next(i)) # 1
print(next(i)) # 2
print(next(i)) # 3
print(next(i))
# Traceback (most recent call last):
# File "exp-iterator.py" line 10, in <module>
# print(next(i))
# StopIteration
Generator
Generator는 Iterator를 생성하는 함수로 함수안에 yield
를 사용하여 데이터를 하나씩 리턴합니다.
Generator 함수가 호출되면 함수 실행 중 처음 만나는 yield에서 값을 리턴합니다.
이후 Generator 함수가 호출되면 직전에 실행되었던 yield 문에서 부터 다음 yield 문을 만날때 까지 실행합니다.
Generator 함수를 변수에 할당하면 변수는 Generator 객체가 됩니다.
# Generator 함수
def gen():
yield 1
yield 2
yield 3test
# Generator 객체
g = gen()
print(type(g))
# <class 'generator'>
print(next(g)) # 1
print(next(g)) # 2
print(next(g)) # 3
for i in gen():
print(i)
# 1
# 2
# 3
Generator 표현식
Generator 표현식은 List Comprehension과 유사하여 Generator Comprehension이라고도 불립니다.
Generator 표현식은 ()
를 사용하며 Generator 객체를 리턴
합니다.
실행은 하지 않고 Generator 표현식만 가지며 yield 방식으로 Lazy Operation(게으른 연산)
을 수행합니다.
# Generator 표현식
g = (n*n for in range(100))
# Generator 객체
print(type(g))
# <class 'generator'>
# Lazy Operation 수행
for i in range(5):
print(next(g))
# 1
# 4
# 9
# 25
# 36
# 모두 출력
for n in g:
print(n)
References
http://pythonstudy.xyz/python/article/23-Iterator%EC%99%80-Generator
https://stackoverflow.com/questions/1733004/python-next-function
'Language > Python' 카테고리의 다른 글
[Python] HTTP 요청 라이브러리 (requests) (0) | 2019.01.22 |
---|---|
[Python] tuple을 dict로 변환 (0) | 2019.01.19 |
[Python] switch 문 구현 (0) | 2019.01.16 |
[Python] 단순복사 vs 얕은복사 vs 깊은복사 (0) | 2019.01.15 |
[Python] list에서 element 개수 세기 (0) | 2019.01.14 |