컴퓨터/프로그래밍

[Python] 이터레이터 Iterator / 제너레이터 Generator / Iterable

옆동네애옹이 2024. 9. 4. 13:53
728x90

Iterator/Generator에 대해 알아보쟝

https://wikidocs.net/16068

먼저 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)로 값 꺼내기

마지막 실행에서 stop iteration 예외 발생

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 사용 예시

https://wikidocs.net/16070

728x90