Chapter02_2 지능형 리스트와 제너레이터 표현식

매일 공부(ML)·2022년 11월 1일
0

Fluent Python

목록 보기
5/130

시퀀스

지능형 리스트와 제너레이터 표현식

지능형 리스트나 제너레이터 표현식을 사용하면 가독성이 좋고 때론 실행 속도가 빠른 코드를 짤 수 있고 시퀀스를 간단히 생성할 수 있다.


지능형 리스트와 가독성

#둘 중에 가독성이 좋아보이는 코드는?

#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()함수를 이용해서 수행할 수 있는 작업은 기능적으로 문제가 있는 파이썬 람다를 억지로 끼워넣지 않고도 지능형 리스트를 이용해서 모두 구현할 수 있다.

#지능형 리스트와 맵/필터 구성으로 만든 동일 리스트
"""
속도 측면에서 보면, 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])
  • 제너레이터 표현식이 함수에 보내는 단 하나의 인수라면 괄호 안에 또 괄호를 넣을 필요가 없다.
  • 배열 생성자는 인수를 두 개 받으므로 제너레이터 표현식 앞 뒤에 반드시 괄호를 넣어야하고 배열 생성자의 첫 번째 인수는 배열에 들어갈 숫자들을 저장할 자료형을 지정한다.
profile
성장을 도울 아카이빙 블로그

0개의 댓글