Effective Python으로 Pythonic한 코딩을 해보자.
Effective Python은 파이썬을 Pythonic하게(파이썬스럽게) 작성하는 것에 대한 책이다. 저자는 이렇게 말한다.
파이썬다운 스타일은 컴파일러가 생성하거나 강요하는 것이 아니다. 사용자들이 파이썬 언어를 수년간 사용하고 다른 이와 협업하면서 자연스럽게 생겨난 것이다. 파이썬 프로그래머들은 복잡함보다는 단순함을 선호하고 가독성을 극대화하기 위해 명료한 것을 좋아한다.
파이썬은 다른 프로그래밍 언어보다 직관적이고 간편하다는 장점을 가진다고 생각한다. 간편하다는 특성 상 파이썬을 잘 사용하지 못하는 경우가 많다. 개인적으로 나는 소위 말하는 “못생긴 코드”를 너무나 싫어한다. 싫어하다 못해 혐오한다. 이러한 생각만을 가진 채 “예쁜 코드”를 작성할 줄 몰랐다.
이번 기회에 어떻게 하면 파이썬을 파이썬스럽게 이쁘게 작성할 수 있는지 알아보자. 책에 있는 모든 내용을 다루진 않고, 내가 중요하다고 생각하는 내용들을 정리할 것이다. 또한, 이 글을 읽기 위해서는 파이썬을 어느정도 알고 있다고 가정한다.
PEP 8 스타일 가이드를 따르자.
다른 프로그래머들과 협업하기 위해선 일관된 코드 스타일이 중요하다. 파이썬에서는 PEP 8라는 표준격인 스타일 가이드가 있으므로, 이를 따르자.
map
과 filter
대신 리스트 컴프리헨션을 사용하자.
리스트 컴프리헨션은 일반적인 for
문보다 빠르다. 따라서 간단한 코드라면 리스트 컴프리헨션을 사용하자.
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
squares = [x**2 for x in a]
컴프리헨션이 클 때는 제너레이터 표현식을 고려하자.
제너레이터는 iterator
객체를 생성하는 함수이다. 이터레이터는 데이터를 모두 메모리에 올리지 않고 그때그때 계산하므로 메모리 관리에 좋다. 따라서 메모리 부담이 있다면 제너레이터를 사용하자.
squares_gen = (x**2 for x in a)
이터레이터를 병렬로 처리하려면 zip
을 사용하자.
zip은 이터레이터 두 개 이상을 하나의 제너레이터로 감싼다. zip 제너레이터는 각 이터레이터로부터 다음 값을 담은 튜플을 얻어온다.
names = ['Cecilia', 'Lise', 'Marie']
letters = [len(n) for n in names]
for name, count in zip(names, letters):
print(name, count)
for
와 while
루프 뒤에는 else
블록을 쓰지 말자.
for-else와 while-else에서의 else는 ‘해당 루프가 끝나면’ 실행하는 블록이다.
반면에 if-else와 try-except-else-finally는 ‘이전 블록이 실패하지 않으면’ 실행하는 블록이다. 따라서 이를 혼동할 수 있으므로 되도록이면 for와 while 루프 뒤에는 else 블록을 쓰지 말자.
대신에 헬퍼 함수에서 찾으려는 조건을 찾았을 때 바로 return
을 하는 방법과, 찾으려는 대상을 찾았는지 알려주는 결과 변수를 사용하는 것이다. 뭔가를 찾았으면 즉시 break
로 루프를 중단한다.