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, 85List 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]