지능형 리스트(list comprehension)와 제너레이터 표현식

CHOJUNGHO96·2023년 11월 8일
0

파이썬

목록 보기
2/5

지능형 리스트의 가독성 (List Comprehension Readability)

지능형 리스트(list comprehension)는 코드를 간결하게 만드는 파이썬의 강력한 기능 중 하나입니다. 복잡한 반복문과 조건문을 한 줄의 코드로 줄일 수 있어, 코드의 가독성을 크게 향상시킵니다. 이러한 간결함은 코드를 작성하는 데 드는 시간을 단축시키고, 나중에 코드를 다시 읽거나 다른 사람이 리뷰할 때 이해하기 쉽게 만들어 줍니다. 기존의 반복문을 사용한 코드는 여러 줄에 걸쳐 있을 수 있지만, 지능형 리스트를 사용하면 단 한 줄로 표현이 가능합니다. 이는 특히 데이터 처리와 변환 작업을 할 때 매우 유용합니다.

# 숫자 리스트를 받아 각 숫자에 10을 곱한 새 리스트를 생성
numbers = [1, 2, 3, 4, 5]
multiplied = [x * 10 for x in numbers]
print(multiplied)  # 출력: [10, 20, 30, 40, 50]

# 기존의 반복문을 사용한 코드
multiplied_old_way = []
for x in numbers:
    multiplied_old_way.append(x * 10)
print(multiplied_old_way)  # 출력: [10, 20, 30, 40, 50]



지능형 리스트와 map()/filter() 비교

map()과 filter() 함수는 함수형 프로그래밍에서 영감을 받은 파이썬의 기본 함수들입니다. map()은 모든 요소에 함수를 적용할 때, filter()는 주어진 함수의 조건을 만족하는 요소만을 선택할 때 사용합니다. 그러나 이 함수들은 각각의 용도에 맞게 사용되며, 때때로 코드를 읽기 어렵게 만들 수 있습니다. 반면, 지능형 리스트는 이 두 기능을 하나의 간결한 구문으로 통합하여 코드의 가독성을 향상시키고, 같은 작업을 더 명확하게 표현할 수 있습니다.

# map()과 filter()를 사용한 코드
numbers = [1, 2, 3, 4, 5]
squared = map(lambda x: x ** 2, numbers)
even_squared = filter(lambda x: x % 2 == 0, squared)
print(list(even_squared))  # 출력: [4, 16]

# 지능형 리스트를 사용한 코드
even_squared_comp = [x ** 2 for x in numbers if x % 2 == 0]
print(even_squared_comp)  # 출력: [4, 16]



데카르트 곱 (Cartesian Product)

데카르트 곱은 여러 집합에 대한 모든 가능한 조합을 만들어내는 수학적 연산입니다. 프로그래밍에서 데카르트 곱은 여러 그룹의 데이터에 대해 가능한 모든 조합을 생성할 때 유용합니다. 지능형 리스트를 활용하면, 중첩된 반복문을 사용하여 이러한 조합을 간단하게 표현할 수 있습니다. 이 방법은 데이터베이스의 조인, 여러 파라미터의 조합을 테스트하는 경우 등 다양한 상황에서 사용될 수 있습니다.

# 두 개의 리스트를 이용한 데카르트 곱 예제
colors = ['red', 'blue', 'green']
objects = ['house', 'car', 'tree']
combinations = [(color, object) for color in colors for object in objects]
print(combinations)
# 출력: [('red', 'house'), ('red', 'car'), ('red', 'tree'), ... ('green', 'tree')]



제너레이터 표현식 (Generator Expressions)

제너레이터 표현식은 리스트 컴프리헨션과 유사하게 작성되지만, 대괄호 대신 괄호를 사용합니다. 이 표현식은 전체 리스트를 메모리에 한 번에 로드하는 대신, 필요할 때마다 리스트의 요소를 하나씩 '생성'합니다. 이는 특히 큰 데이터 세트를 다룰 때 유용하며, 메모리 사용을 줄이고 성능을 향상시킬 수 있습니다. 제너레이터는 '지연 평가(lazy evaluation)'를 통해 값을 생성하기 때문에, 데이터가 무한하거나 예측할 수 없는 상황에서도 사용될 수 있습니다.

# 제너레이터 표현식을 사용한 코드
numbers = range(10)
lazy_squares = (x ** 2 for x in numbers)
for square in lazy_squares:
    print(square, end=' ')  # 출력: 0 1 4 9 16 25 36 49 64 81
profile
백엔드개발자

0개의 댓글