안녕세계

[Python] iterator 와 generator 본문

[Python] iterator 와 generator

Junhong Kim 2019. 1. 17. 23:32
728x90
반응형

Iterator

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


728x90
반응형
Comments