상세 컨텐츠

본문 제목

[Python] 제너레이터 표현식(generator expressions) 연습 예제

Python

by Corn/sec 2025. 2. 5. 20:22

본문

작성: Corn/sec, ChatGPT, 편집: Corn/sec

 

Python에서 데이터를 다룰 때, 리스트 컴프리헨션과 함께 **제너레이터 표현식(generator expressions)**을 활용하면 메모리를 절약하고 성능을 향상시킬 수 있습니다.
이번 포스팅에서는 제너레이터 표현식이 무엇인지, 기존 for문과 리스트 컴프리헨션과 비교하며 활용법을 익히는 방법을 자세히 알아보겠습니다. 🚀

 

# 제너레이터 표현식을 프로그래머스에서도 활용 하실 수 있습니다. #

[프로그래머스 풀이]: Lv.1 / 약수의 합

 

 


1️⃣ 제너레이터 표현식이란?

제너레이터 표현식은 리스트 컴프리헨션과 유사하지만, 리스트를 생성하는 대신, 이터레이터(iterator)를 반환하는 표현식입니다. 즉, 필요한 순간에 값을 생성하여 메모리 사용을 최적화할 수 있습니다.

# 리스트 컴프리헨션
lst = [x**2 for x in range(10)]  # 모든 값을 메모리에 저장

# 제너레이터 표현식
gen = (x**2 for x in range(10))  # 필요할 때마다 값을 생성

리스트 vs. 제너레이터 표현식의 차이

  • 리스트 컴프리헨션: [ ]를 사용하며, 리스트를 즉시 생성하고 메모리에 저장.
  • 제너레이터 표현식: ( )를 사용하며, 필요할 때 값을 하나씩 생성하여 반환.

🔹 실행 예제

print(sum(x**2 for x in range(10)))  # 0^2 + 1^2 + ... + 9^2 = 285

2️⃣ 기존 for문을 제너레이터 표현식으로 변환하기

📌 리스트의 합 구하기

✅ 기존 for문 사용

def sum_list(lst):
    total = 0
    for num in lst:
        total += num
    return total

✅ 제너레이터 표현식 예제 정답

더보기
def sum_list(lst):
    return sum(num for num in lst)

불필요한 변수(total)를 제거하고 메모리 사용을 줄이며 코드 가독성을 높임.


📌 리스트에서 짝수만 더하기

✅ 기존 for문 사용

def sum_even(lst):
    total = 0
    for num in lst:
        if num % 2 == 0:
            total += num
    return total

✅ 제너레이터 표현식 예제 정답

더보기
def sum_even(lst):
    return sum(num for num in lst if num % 2 == 0)

 

조건문을 추가하여 짝수만 필터링.


📌 문자열 길이의 합 구하기

✅ 기존 for문 사용

def total_length(words):
    total = 0
    for word in words:
        total += len(word)
    return total

✅ 제너레이터 표현식 예제 정답

더보기
def total_length(words):
    return sum(len(word) for word in words)

불필요한 변수를 줄이고, 간결한 코드 작성 가능.

 


📌 10보다 큰 숫자만 합 구하기

✅ 기존 for문 사용

def sum_greater_than_10(lst):
    total = 0
    for num in lst:
        if num > 10:
            total += num
    return total

✅ 제너레이터 표현식 예제 정답

더보기
def sum_greater_than_10(lst):
    return sum(num for num in lst if num > 10)

 

필터링 조건을 추가하여 메모리 절약.


📌 리스트에서 3의 배수 개수 세기

✅ 기존 for문 사용

def count_multiples_of_3(lst):
    count = 0
    for num in lst:
        if num % 3 == 0:
            count += 1
    return count

✅ 제너레이터 표현식 예제 정답

더보기
def count_multiples_of_3(lst):
    return sum(1 for num in lst if num % 3 == 0)

 카운트할 때도 sum(1 for ...)을 사용하면 간결하게 해결 가능.


3️⃣ 제너레이터 표현식의 장점

메모리 효율성 → 한 번에 하나씩 값을 생성하여 메모리 낭비 최소화
빠른 실행 속도 → 리스트를 미리 생성하지 않으므로 연산 속도 향상
가독성 향상 → 코드가 간결해지고, 불필요한 변수를 줄일 수 있음

📌 리스트 컴프리헨션 vs. 제너레이터 표현식 비교

방식 메모리 사용 속도 추천 상황

리스트 컴프리헨션 높음 빠름 작은 크기의 데이터 처리
제너레이터 표현식 낮음 빠름 대용량 데이터 처리

🎯 결론

  • 리스트 컴프리헨션은 한 번에 모든 데이터를 생성해야 할 때 사용하면 좋다.
  • 제너레이터 표현식은 대량의 데이터를 처리할 때 메모리를 절약하면서 빠르게 처리할 수 있다.
  • 일반 for문을 제너레이터 표현식으로 변환하면 코드가 더욱 간결해지고 성능이 향상된다.

 

관련글 더보기