5. Iterable, Iterator, Generator
2024년 12월 17일1분 미만
5. Iterable, Iterator, Generator
5.1 Iterable
- Iterable의 정의:
__iter__
또는__getitem__
을 구현한 객체.for
문과iter()
함수와의 관계.
- 실습: 커스텀 Iterable 클래스 구현.
- Iterables Docs
5.2 Iterator
- Iterator의 정의:
__iter__
와__next__
메서드를 구현한 객체.StopIteration
예외 처리와 반복 종료.
- 실습: 커스텀 Iterator 클래스 작성.
5.3 Generator
- Generator의 정의:
yield
키워드로 구현.- 상태를 유지하며 값을 생성하는 함수.
- Generator Expressions:
- 리스트 내포와 유사한 문법.
- 차이점: 메모리 효율성과 즉시 실행.
- Generators Docs
5.4 반복문
순회. enumerate, zip
- enumerate
- Iterable의 인덱스와 값을 동시에 가져옴.
my_list = ['a', 'b', 'c']
for index, value in enumerate(my_list):
print(index, value)
# 0, a
# 1, b
# 2, c
- zip
- 여러 Iterable을 병렬로 순회함.
names = ['Alice', 'Bob']
scores = [90, 85]
for name, score in zip(names, scores):
print(name, score)
# Alice, 90
# Bob, 85
List Comprehension
[expression for item in iterable if condition]
- 기본 반복문으로 리스트 생성
numbers = [1, 2, 3, 4, 5]
squared_numbers = [num ** 2 for num in numbers]
print(squared_numbers) # [1, 4, 9, 16, 25]
- 조건을 사용한 필터링
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = [num for num in numbers if num % 2 == 0]
print(even_numbers) # [2, 4, 6]
- 문자열 처리
words = ['hello', 'world']
uppercase_words = [word.upper() for word in words]
print(uppercase_words) # ['HELLO', 'WORLD']
map
map(function, iterable1, ...) # 단, 가장 짧은 iterable 길이 만큼
map은 iterable
객체를 순환하며 일괄적으로 함수를 적용시킨다. 다만, map은 lazy evaluation
을 사용하는 iterator
이다.
팁
lazy evaluation
lazy evaluation
은 값을 미리 계산하지 않고, 필요할 때 계산한다. 이는 데이터를 즉시 한 번에 처리하는 List Comprehension
과는 차이를 보이며, 필요시에 로드하기에 메모리를 절약하는데 유리하다. 또한, List Comprehension
에 비해 빠를 수 있는데, map
은 c언어로 최적화가 되어있고, List Comprehension
은 python 상에서 동작하기 때문이다.
words = ['hello', 'world']
uppercase_words = map(lambda x: x.upper(), words)
print(uppercase_words) # <map object at 0xf955f93d5b0>
print(type(uppercase_words)) # <class 'map'>
print(list(uppercase_words)) # ['HELLO', 'WORLD']
numbers1 = [1, 2, 3, 4, 5, 6]
numbers2 = [9, 8, 7, 6, 5, 4]
mul = map(lambda x, y: x*y, numbers1, numbers2)
print(list(mul)) # [9, 16, 21, 24, 25, 24]