제네레이터 (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/
'Programming > Python' 카테고리의 다른 글
[Python] time 모듈 (0) | 2023.06.19 |
---|---|
[Python] 함수 데코레이터 (Function Decorator) (0) | 2023.06.16 |
[Python] 다형성 (Polymorphism) (2) (0) | 2023.06.15 |
[Python] 다형성 (Polymorphism) (1) (0) | 2023.06.12 |
[Python] 네임 스페이스 (Namespace) (0) | 2023.06.12 |