제너레이터 표현식
간결한 지연 파이프라인 작성하기
제너레이터 표현식은(는) CoddyKit의 무료 Python Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Python Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Python Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
리스트 컴프리헨션에서 제너레이터 표현식으로
제너레이터 표현식은 리스트 컴프리헨션과 비슷하지만 대괄호 대신 괄호를 사용합니다. 전체 리스트를 만드는 대신 지연 방식으로 값을 생성합니다.
list_comp = [x * x for x in range(5)]
gen_expr = (x * x for x in range(5))
print(list_comp)
print(gen_expr)
print(list(gen_expr))메모리 사용량 비교
리스트 컴프리헨션은 모든 요소를 미리 메모리에 할당합니다. 제너레이터 표현식은 값을 요청할 때까지 거의 아무것도 보관하지 않습니다. 두 방식의 크기를 비교해 보세요.
import sys
lst = [x for x in range(10000)]
gen = (x for x in range(10000))
print('list bytes:', sys.getsizeof(lst))
print('gen bytes:', sys.getsizeof(gen))제너레이터 표현식 반복하기
제너레이터 표현식은 모든 반복자와 같은 방식으로 소비합니다. for 반복문이나 next()를 사용하거나 함수에 전달하면 됩니다.
gen = (c.upper() for c in 'hello')
for ch in gen:
print(ch)if로 필터링하기
컴프리헨션에서처럼 if 절을 추가하면 조건에 맞는 항목만 남길 수 있습니다.
evens = (n for n in range(10) if n % 2 == 0)
print(list(evens))함수에 직접 전달하기
제너레이터 표현식이 함수의 유일한 인수라면 바깥쪽 괄호를 생략할 수 있습니다. 이렇게 하면 코드가 깔끔해지고 임시 리스트를 만들지 않아도 됩니다.
total = sum(x * x for x in range(5))
print(total)
biggest = max(len(w) for w in ['a', 'abc', 'ab'])
print(biggest)한 번만 사용한다는 점 기억하기
제너레이터 표현식은 제너레이터 함수와 마찬가지로 한 번 순회하면 모두 소비됩니다. 두 번째 순회에서는 아무것도 생성하지 않습니다.
gen = (x for x in range(3))
print(list(gen))
print(list(gen))표현식 연결하기
한 제너레이터 표현식의 결과를 다른 제너레이터 표현식에 전달하여 지연 방식의 pipeline을 만들 수 있습니다. 최종 소비자가 값을 요청하기 전까지는 아무것도 계산되지 않습니다.
nums = (n for n in range(10))
evens = (n for n in nums if n % 2 == 0)
doubled = (n * 2 for n in evens)
print(list(doubled))any()와 all()
제너레이터 표현식은 any()와 all()에서 특히 유용합니다. 결과를 알 수 있는 즉시 중단하는 단락 평가가 가능하기 때문입니다.
words = ['cat', 'dog', 'elephant']
print(any(len(w) > 5 for w in words))
print(all(len(w) >= 3 for w in words))중첩 반복문
컴프리헨션과 마찬가지로 제너레이터 표현식은 여러 for 절을 지원하며, 왼쪽에서 오른쪽으로 읽습니다.
pairs = ((x, y) for x in range(2) for y in range(2))
print(list(pairs))지연 방식 pipeline 예제
간단한 텍스트 처리 pipeline의 예입니다. 각 단계가 지연 방식으로 동작하므로 큰 파일도 전체를 메모리에 불러오지 않고 스트리밍할 수 있습니다.
lines = [' alpha ', '', ' beta', 'gamma ']
stripped = (line.strip() for line in lines)
nonempty = (line for line in stripped if line)
print(list(nonempty))어떤 방식을 선택할까요
데이터를 여러 번 사용하거나 인덱싱이 필요하다면 리스트 컴프리헨션을 사용하세요. 한 번만 순서대로 처리하거나 데이터가 많다면 제너레이터 표현식을 사용하세요.
data = range(6)
as_list = [x + 1 for x in data]
print(as_list[0], as_list[-1])
total = sum(x + 1 for x in data)
print(total)빠른 확인
제너레이터 표현식에 대한 이해도를 확인해 보세요.
복습
제너레이터 표현식을 배웠습니다.
- 리스트 컴프리헨션을 지연 방식으로 대체할 때 괄호를 사용합니다.
- 메모리를 절약하고
if필터와 중첩 반복문을 지원합니다. sum,any,all및 연결 작업과 잘 어울립니다.- 한 번만 사용할 수 있습니다.
다음은 yield from으로 제너레이터를 구성하는 방법입니다.
자주 묻는 질문
“제너레이터 표현식” 강의는 무료인가요?
네 — “제너레이터 표현식” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Python Academy 강의 전체를 잠금 해제할 수 있습니다. Python Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“제너레이터 표현식”에서 뭘 배우나요?
간결한 지연 파이프라인 작성하기 브라우저에서 직접 실행하는 실습 코드로 Python Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Python Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Python Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“제너레이터 표현식” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Python Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Python Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 반복자 프로토콜
- 제너레이터 함수
- 제너레이터 표현식
- yield from과 위임