어떤 버전의 코드가 더 읽기 쉬운가를 생각해보자.
# 1. 문자열에서 유니코드 코드포인트 리스트 만들기(버전 1)
symbols = "#$%^&"
codes = []
for symbol in symbols:
codes.append(ord(symbol))
print(codes)
# 2. 문자열에서 유니코드 코드포인트 리스트 만들기(버전 2)
symbols = "#$%^&"
codes = [ord(symbol) for symbol in symbols]
print(codes)
1번보다 2번이 의도를 명확하게 보여준다. 시퀀스를 읽어서 개수를 세거나 어떤 항목을 골라내거나 합계를 구하는 등 for 루프는 아주 다양한 일에 사용할 수 있다. 1번에서는 for 루프를 이용해서 리스트를 만든다. 이와 대조적으로 지능형 리스트는 오로지 새로운 리스트를 만드는 일만 한다.
물론 지능형 리스트를 남용해서 이해하기 어려운 코드를 만들 수도 있다. 생성된 리스트를 사용하지 않을 거라면 지능형 리스트 구문을 사용하지 말아야 한다. 그리고 코드를 짧게 만들어야 한다. 지능형 리스트 구문이 두 줄 이상 넘업가는 경우에는 코드를 분할하거나 for 문을 이용해서 작성하는 것이 더 낫다. 경우에 맞게 상식적으로 판단하라.
지능형 리스트, 제너레이터 표현식, 그리고 이와 동급인 지능형 집합과 지능형 딕셔너리는 함수처럼 고유한 지역 범위를 가진다. 표현식 안에서 할당된 변수는 지역 변수지만 주변 범위의 변수를 여전히 참조할 수 있다. 게다가 지역 변수가 주변 범위의 변수를 가리지 않는다.
지능형 리스트는 항목을 필터링 및 변환함으로써 시퀀스나 기타 반복 가능한 자료형으로부터 리스트를 만든다. 다음 절에서 설명하는 것처럼 내장된 filter()와 map() 함수를 사용해서 이와 동일한 작업을 수행할 수는 있지만 가독성은 떨어진다.