Iterator/Generator에 대해 알아보쟝
먼저 Iterable이란:
파이썬 자료구조로, 반복 가능한 객체 (list, dict, set, str, bytes, tuple, range)
Iterator
값을 '차례대로' 꺼낼 수 있는 객체. 즉 Iterable한 객체를 의미한다.
iterable한 객체를 1. 내장함수 또는 2. iterable객체의 메소드로 객체를 생성할 수 있음.
iterator 객체 생성하기
내장함수 iter() 사용해 생성
a = [1, 2, 3] # list
a_iter = iter(a)
type(a_iter) # <class 'list_iterator'>
iterable 객체의 매직 메소드로 생성
b = {1, 2, 3} # set
b_iter = b.__iter__()
type(b_iter) # <class 'set_iterator'>
iterator 사용
next(iterator)로 값 꺼내기
iterable 객체의 매직 메소드로 꺼내기
Generator
iterator를 생성해주는 함수. 함수 안에 yield 키워드를 사용함
특징
- iterable한 순서가 지정됨 (모든 generator는 iterator)
- 느슨하게 평가됨 (순서의 다음 값은 필요에 따라 계산됨)
- 함수의 내부 로컬 변수를 통해 내부 상태가 유지됨
- 무한한 순서가 있는 객체 모델링 가능 (명확한 끝이 없는 data stream)
- 자연스러운 스트림 처리를 위 파이프라인으로 구성
생성
yield 키워드 통해 만들기
# 함수 생성
def test_gen():
yield 1
yield 2
yield 3
# 함수 호출
gen = test_generator()
type(gen) # <class 'generator'>
이렇게 생성한 genertaor는 iterable한 객체가 되며 for문에서 사용 가능해진다
def test_gen():
yield 1
yield 2
yield 3
gen = test_gen()
for i in test_gen():
print(i)
1, 2, 3이 차례로 줄바꿈되어 출력됨.
generator 동작 알아보기
함수를 이렇게 생성하면:
def test_generator():
print('yield 1 전')
yield 1
print('yield 2 전')
yield 2
print('yield 3 전')
yield 3
print('yield 3 후')
generator 사용 방식
무한한 순서가 있는 객체 모델링 가능 -> 무한적 data stream!
def infinite_generator():
count = 0
while True:
count += 1
yield count
generator 객체를 생성하고 호출할 때마다, 무한정으로 숫자가 1씩 올라가 출력된다.
=> generator를 실행할때마다 느슨하게 평가되며 내부의 변수가 유지되기 때문!
* 우리가 알고 있는 리스트, Set, Dictionary의 표현식의 내부도 사실 generator
yield from
- python 3.3 이상부터 사용 가능.
기존 yield가 값을 뱉기 위해서는 for문 사용해야 했으나, for문 대신 iterable한 객체를 yield할 때는 yield from iterable로 값 전달 가능
iterable 사용 예시
'컴퓨터 > 프로그래밍' 카테고리의 다른 글
[Python] 파이썬 기초 1: Basic operator & 파이썬 변수 (2) | 2024.09.04 |
---|---|
[Python] List Comprehension 리스트 표현식 (0) | 2024.09.04 |
[Python] Docstring 개념 & 사용법 (1) | 2024.09.04 |
[Python] 환경 변수에 Key, Token 저장해서 사용하기 & .gitignore로 무시 (0) | 2024.09.03 |
[프로그래밍] 정적 vs 동적 프로그래밍 언어 (0) | 2024.01.16 |