YUDA't

<파이썬; 코딩의 기술>이라는 책에서 1장 '파이썬다운 생각'을 요약해봤다.

참고로 python3 기준이다.




사용 중인 파이썬의 버전을 알자

요즘은 대부분 python3을 사용하니 이 부분은 넘어가도 될 듯하다.

새로운 프로젝트를 시작한다면 python3을 사용할 것을 권장한다.


PEP 8 스타일의 가이드를 따르자

파이썬 개선 제안서(Python Enhancement Proposal) #8, 다른 말로 PEP 8은 파이썬 코드를 어떻게 구성할지 알려주는 스타일 가이드다.

일관성 있는 코드를 짜서 유지보수성과 가독성, 그리고 협업 가능성을 높이자.


bytes, str, unicode의 차이점을 알자

python3에서 bytes는 8비트 값을 저장하고, str은 유니코드 문자를 저장한다.

python2에서 str은 8비트 값을 저장하고, unicode는 유니코드 문자를 저장한다.

헬퍼 함수를 사용해 처리할 입력값이 원하는 문자 시퀀스 타입(8비트, 유니코드, utf-8 등)으로 되어있게 한다.


복잡한 표현식 대신 헬퍼 함수를 작성하자

이렇게 읽기 힘든 표현식을 쓸 바에는 코드 몇 줄을 더 늘려 보기 쉬운 식을 만들자.

또, 이 로직을 반복해야 한다면 헬퍼 함수를 작성하는 것도 좋은 방법이다.

red = int(my_values.get('red', [''])[0] or 0)


시퀀스를 슬라이스하는 방법을 알자

슬라이스는 의외로 유용하게 쓰이는 기능이다.


한 슬라이스에 start, end, stride를 함께 쓰지 말자

a[-2:2:-2]와 같이, 슬라이싱 문법의 stride는 혼란을 일으킬 수 있다. stride를 사용해야 한다면 양수 값을 사용하고, start와 end는 생략하는 것이 좋다. 이 셋을 꼭 함께 사용해야 한다면 stride를 적용한 결과를 변수에 할당하고 이 변수를 슬라이스한 결과를 다른 변수에 할당하여 사용하자.

b = a[::2]
c = b[1:-1]


map과 filter 대신 리스트 컴프리헨션을 사용하자

간단한 연산에서는 리스트 컴프리헨션이 map보다 명확하다. map을 쓰려면 계산에 필요한 lambda 함수를 생성해야 해서 깔끔해보이지 않는다. 참고로 dict와 set도 컴프리헨션 표현식을 지원한다.

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
squares = [x**2 for x in a]        # list comprehension
squares = map(lambda x:x**2, a)    # map, lambda


리스트 컴프리헨션에서는 표현식을 두 개 이상 쓰지 말자.

요새 몇 번 쓴 적 있는데...조심해야겠다. 읽는 사람이 이해만 가능하다면 상관 없을 테지만 표현식이 두 개 이상이 되면 대부분 한눈에 이해하기 힘들다.


range보다는 enumerate를 사용하자

ㅇㅋ


for와 while 루프 뒤에는 else 블록을 쓰지 말자

for, while 루프 뒤에 else를 쓸 수 있다는 건 처음 알았는데.


try/except/else/finally에서 각 블록의 장점을 이용하자

finally 블록: 예외를 전달하고 싶지만, 예외가 발생해도 정리 코드를 실행하고 싶을 때 사용

else 블록: try 블록이 예외를 일으키지 않으면 else 블록이 실행된다. else 블록을 사용하면 try 블록의 코드를 최소로 줄이고 가독성을 높일 수 있다. try-except-else 이게 은근 중독성 있다.