제너레이터 표현식
제너레이터 표현식은 리스트 컴프리헨션과 유사한 문법을 가지지만, 결과를 리스트가 아닌 제너레이터 객체로 반환한다. 제너레이터는 필요한 값을 그때그때 하나씩 생성하므로, 메모리 효율성이 뛰어난 방법이다.
문법과 기본 사용법
제너레이터 표현식은 리스트 컴프리헨션과 매우 비슷하지만, 대괄호 [] 대신 소괄호 () 를 사용한다
(표현식 for 항목 in 반복 가능한 객체 if 조건)
예시 1: 제곱 값을 생성하는 제너레이터 표현식
squares = (x**2 for x in range(1, 6))
print(squares) # <generator object <genexpr> at 0x...>
print(list(squares) # [1, 4, 9, 16, 25]
squares 는 제너레이터 객체로, list() 를 사용하여 실제 값을 리스트로 변환해준다.
예시 2: 조건을 포함한 제너레이터 표현식
even_numbers = (x for x in range(1, 11) if x % 2 == 0)
장점
- 메모리 효율성:
리스트 컴프리헨션은 모든 데이터를 한꺼번에 메모리에 로드하지만, 제너레이터 표현식은 한 번에 하나의 값만 생성하여 메모리를 절약할 수 있다. 특히 데이터가 클 경우 유리하다 - 빠른 초기화:
모든 데이터를 한꺼번에 생성하지 않고, 필요할 때 값을 계산하기 때문에 초기화가 빠르다
주의사항
- 한 번만 사용 가능:
제너레이터는 값을 한 번 생성하면 소모되기 때문에, 한 번 소비한 후 다시 사용하려면 새로운 제너레이터를 생성해야 한다 - 반복 가능한 리스트 변환 필요:
제너레이터에서 생성된 값을 여러 번 사용할 필요가 있을 경우, list() 로 변환하여 리스트로 저장해두는 것이 좋다
예시 3: 제너레이터 재사용 불가
numbers_gen = (x for x in range(1, 6))
print(list(numbers_gen)) # 첫 번째 사용: [1, 2, 3, 4, 5]
print(list(numbers_gen)) # 두 번째 사용: [] (빈 리스트)
언제 제너레이터 표현식을 사용해야 할까?
- 데이터가 매우 클 때: 제너레이터는 필요한 값만 메모리에 생성하므로 큰 데이터셋에 적합하다
- 한 번만 사용할 데이터일 때: 제너레이터는 재사용이 어렵기 때문에 한 번만 사용하고 소모딜 데이터에 적합하다
'Python > 기본' 카테고리의 다른 글
[Python] enumerate (0) | 2024.11.09 |
---|---|
[Python] sorted() 함수 (0) | 2024.11.09 |
[Python] 리스트 컴프리헨션(List Comprehension) (1) | 2024.11.09 |
[Python] match (0) | 2024.11.08 |
[Python] max(), min() 함수 (0) | 2024.11.07 |