본문 바로가기
Programming/Python

[Python] 제네레이터 (Generator)

by goatlab 2023. 6. 16.
728x90
반응형
SMALL

제네레이터 (Generator)

 

 

제너레이터 (generator)는 파이썬에서 특별한 종류의 이터레이터 (iterator)를 직접 만들 때 사용하는 코드이다. 함수 내부에 yield 키워드를 사용하면 해당 함수는 제너레이터 함수가 된다. 함수가 다시 호출될 때마다 이전에 중단된 위치에서 실행을 계속한다. 일반 함수와 달리 함수를 호출해도 함수 내부의 코드가 실행되지 않는다. 제너레이터 객체는 next() 함수를 사용해 함수 내부의 코드를 실행한다. yield 키워드 부분까지만 실행하며, next() 함수의 리턴값으로  yield 키워드 뒤에 입력한 값이 출력된다.

 

제너레이터 객체는 함수의 코드를 조금씩 실행할 때 사용한다. 이것으로 제네레이터는 필요한 값만 생성하므로 큰 데이터 집합을 처리할 때 메모리를 절약할 수 있다. 제네레이터는 요청에 따라 값이 생성되므로 필요한 값만 계산하여 시간을 절약할 수 있다.

 

def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

runner = fibonacci(10)

print(next(runner)) 
print("=====")
print(runner) 
print(next(runner))
print("=====")

for num in runner:
    print(num)

 

반복자 (Iterator)

 

iterable 객체는 반복 가능한 객체이다. 대표적으로 iterable한 타입은 list, dict, set, str, bytes, tuple, range가 있다. for in 반복문, Range, enumerate에서 iterable한 타입과 iterable한 타입을 확인하는 방법이 있다.

 

a = [1, 2, 3]
a_iter = iter(a)
type(a_iter)
<class 'list_iterator'>
b = {1, 2, 3}
dir(b)
['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__init_subclass__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']
b_iter = b.__iter__()
type(b_iter)
<class 'set_iterator'>

 

Yield

 

yield 문은 제네레이터 함수에서 제네레이터 객체이다. 이것은 요소를 반환하는 데 사용된다.

 

def generate_alphabet(start_letter, end_letter):
    # def ord(__c: str | bytes) -> int
    start = ord(start_letter)
    end = ord(end_letter)
    while start <= end:
        yield chr(start)
        start += 1

runner = generate_alphabet('A', 'F')

for letter in runner:
    print(letter)

 

enumerate()

 

enumerate() 함수는 인자로 넘어온 목록을 기준으로 인덱스와 원소를 차례대로 접근하게 해주는 반복자 (iterator) 객체를 반환해주는 함수이다.

 

a = [6, 2, 3, 4, 5]
enumerate(a)

a = ['a1', 'a2', 'a3']

for i, v in enumerate(a):
  print(i, v)

 

https://towardsmachinelearning.org/iterators-and-generators-in-python/

 

Iterators and Generators in Python - TowardsMachineLearning

Iterators :- An iterator is an object that can be iterated upon, meaning that you can traverse through all the values. Technically, in Python, an iterator is an object which implements the iterator protocol, which consist of the methods __iter__() and _

towardsmachinelearning.org

 

728x90
반응형
LIST