지능형 리스트나 제너레이터 표현식을 사용하면 가독성이 좋고 때론 실행 속도가 빠른 코드를 짤 수 있고 시퀀스를 간단히 생성할 수 있다.
#둘 중에 가독성이 좋아보이는 코드는?
#1번
symbols = 'qscvbn'
codes = []
for symbol in symbols:
codes.append(ord(symbol))
codes # [36,162,163, 165, 8364, 164]
#2번
symbols = 'qscvbn'
codes = [ord(symbol) for symbol in symbols]
codes # [36,162,163,165,8364,164]
생성된 리스트를 사용하지 않을 것이라면 지능형 리스트 구문을 사용하지 말아야하고 코드를 짧게 만들어야 하므로 지능형 리스트 구문이 두 줄 이상 넘어가는 경우에는 코드를 분할하거나 for문을 이용해서 작성하는 것이 더 낫다.
map()와 filter()함수를 이용해서 수행할 수 있는 작업은 기능적으로 문제가 있는 파이썬 람다를 억지로 끼워넣지 않고도 지능형 리스트를 이용해서 모두 구현할 수 있다.
#지능형 리스트와 맵/필터 구성으로 만든 동일 리스트
"""
속도 측면에서 보면, map()/ filter()를 조합한 방법이 지능형 리스트보다 빠르다고 생각한다.
"""
symbols = 'qscvbn'
beyond_ascii = [ord(s) for s in symbols if ord(s) > 127]
beyond_ascii # [162,163,165,8364, 164]
beyond_ascii = list(filter(lambda c: c > 127, map(ord, symbols))
beyond_ascii # [162,163,165,8364, 164]
지능형 리슽는 두 개 이상의 반복 가능한 자료형의 데카르트 곱을 나타내는 일련의 리스트를 만들 수 있다.
colors = ['black', 'white']
sizes = ['S', 'M', 'L']
tshirts = [(color, size) for color in colors for size in sizes]
tshirts
for color in colors:
for size in sizes:
print((color, size))
tshirts = [(color, size) for size in sizes
for color in colors]
tshirts
튜풀, 배열 등의 시퀀스형을 초기화하려면 지능형 리스트를 사용할 수 있고, 다른 생성자에 전달할 리스트를 통째로 만들지 않고 반복자 프로토콜을 이용해서 항목을 하나씩 생성하는 제너레이터 표현식은 메모리를 더 적게 사용한다.
제너레이터 표현식은 지능형 리스트와 동일 구문을 사용하지만, 대괄호 대신 괄호를 사용한다.
symbols = 'qscvbn'
tuple(ord(symbol) for symbol in symbols
(36,162,163,165,8364, 164)
import array
array.array('I', (ord(symbol) for symbol in symbols)
array('I', [36,162,163,165,8364,164])