리스트 컴프리헨션은 초기 파이썬 버전에서도 등장했습니다. 이 구문 설탕은 함수형 언어에서 차용되었습니다. 그것은 코드를 컴팩트하게 만들며 때로는 일반 for 루프보다 조금 더 빠르게 작동합니다.
많은 경험이 부족한 개발자들이 리스트 컴프리헨션을 그 특성을 이해하지 못한 채 사용하여 코드의 가독성이 저하되거나 예기치 않은 효과가 발생하는 경우가 있습니다. 또한 새로운 개발자들은 리스트 컴프리헨션과 map/filter/lambda 함수를 차별화하는 데 어려움을 겪습니다.
리스트 컴프리헨션은 원본 시퀀스의 각 요소에 표현식을 적용하여 새 리스트를 빠르게 생성하는 방법입니다:
nums = [1, 2, 3, 4] squares = [x*x for x in nums if x % 2 == 0] # [4, 16]
주요 특징:
리스트 컴프리헨션은 제너레이터를 반환합니까?
아니요, 리스트가 반환됩니다. 제너레이터는 괄호를 사용하여 생성됩니다:
# 이것은 제너레이터입니다: (x*x for x in range(10)) # 이것은 리스트입니다: [x*x for x in range(10)]
리스트 컴프리헨션 내에서 변수에 값을 할당할 수 있습니까?
표준 구문에서는 할당할 수 없습니다. Python 3.8 이상에서는 "월러스" 표현식(:=)을 사용해야 합니다:
[x for x in (y := range(5))] # 오류! [x for x in [(y := i*i) for i in range(5)]] # y는 이 리스트 내에서만 보입니다.
리스트 컴프리헨션 내에서 외부 변수를 변경할 수 있습니까?
리스트 컴프리헨션 내에서 선언된 변수는 로컬 변수이며 외부에서 보이지 않습니다. 이것은 종종 중첩 구조에서 초보자들을 혼란스럽게 합니다.
** 부정적인 사례 개발자가 복잡한 데이터 변환을 한 줄에 중첩된 리스트 컴프리헨션을 사용합니다. 장점: 코드가 컴팩트하며 "나는 파이썬을 알고 있다!"라는 효과 단점: 읽기가 힘들고, 새로운 동료들이 고생하며 디버깅이 고통스러워집니다. ** 긍정적인 사례 개발자가 간단한 리스트 컴프리헨션을 사용하여 짧은 리스트를 필터링하고 변환하며, 복잡한 작업에는 명시적인 함수와 루프를 작성합니다. 장점: 코드가 읽기 쉽고 유지보수 및 확장이 용이합니다. 단점: 일부 경우 코드가 약간 길어지고 추가 변수가 사용될 수 있습니다.