파이썬답게 생각하기

파이썬 커뮤니티는 어떤 고유한 스타일을 따르는 코드를 가리킬 때 ‘파이썬다운(Pythonic)’이라는 형용사를 사용합니다.

개인적으로 파이썬으로 코드를 작성할 때 가장 신경써야할 부분은 가독성이라고 생각합니다. 가독성은 사실 협업을 위해서라면 모든 코드에서 반드시 갖춰야 할 요소입니다. 그러나 그중에서도 파이썬으로 코드를 작성할 때 만큼은 더욱 이 가독성을 신경써줘야 한다 생각하는데 그 이유는, 실무에서 파이썬은 어떤 새로운 아이디어를 본격적으로 제품화하기 전에 간단히 프로토타입을 만들기 위한 언어로 참 좋은 언어입니다. 그래서 저는 개인적으로 파이썬은 다음에 누가 보더라도 명확하게 이해할 수 있도록 코드를 작성해야 한다고 생각합니다.

따라서 가독성이 높은 코드를 작성하기 위해서는 자기만 이해할 수 있는 코드가 아닌 파이썬 개발자들이 모두 지향하는 방식으로 코드를 작성해야 한다고 생각하며, 이 책이 그러한 관점에서 좋은 길잡이가 될 수 있을거라 생각합니다.

Better Way 1: 사용 중인 파이썬의 버전을 알아두라

사용하는 파이썬의 버전을 정확히 알고 싶으면 –version 플래그를 사용하라.

$ python --version
Python 2.7.10

파이썬3는 보통 python3라는 이름을 사용한다.

$ python3 --version
Python 3.8.0

파이썬 코드에서 현재 실행 중인 파이썬 버전을 알고 싶다면

import sys

# 첫 번쨰 방법
print(sys.version)

# 두 번째 방법
print(sys.version_info)

Better Way 2: PEP 8 스타일 가이드를 따르라

PEP(Python Enhancement Proposal) #8은 파이썬 코드를 어떤 형식으로 작성할 지 알려주는 스타일 가이드다. 문법만 올바르다면 어떤 방식으로든 원하는 파이썬 코드를 작성해도 좋지만, 일관된 스타일을 사용하면 가독성을 더 높일 수 있다.
PEP 8은 깔끔한 파이썬 코드를 작성하는 방법을 아주 자세히 알려준다. PEP 8 온라인 가이드

Better Way 4: 문자열 포맷팅을 할 때는 f-문자열을 통한 인터폴레이션을 사용하라

포맷팅은 미리 정의된 문자열에 데이터 값을 끼워 넣어서 사람이 보기 좋은 문자열로 저장하는 과정이다.

C스타일 형식 문자열

이 방식은 형식 문자열(ex. “안녕 ~”)에 있는 형식 지정자(format specifier)(ex. %s, %d)와 데이터 값의 순서를 바꾸면 오류가 발생해서 좌우를 잘 확인하여야 한다. 가독성도 떨어져서 좋은 방식이 아니다.

'안녕 나는 %s라고 해' % 'Peter'

'안녕 내 이름은 %s이고, 나이는 %d야' % ('Peter', 20)

내장 함수 format과 문자열 메소드 format

파이썬 3부터는 %를 사용하는 오래된 C스타일 형식화 문자열 보다 더 표현력이 좋은 고급 문자열 형식화 기능이 도입됐다.

# 내장 함수 format
>>> a = 1234.5678
>>> formatted = format(a, '.2f')
>>> print(formatted)
1234.57

# str타입의 format메소드
>>> key = 'my_var'
>>> value = 1.234
>>> formatted = '{}={}'.format(key, value)
>>> print(formatted)
my_var = 1.234

# 위치 인덱스를 전달할 수도 있다.
formatted = '{1} = {0}'.format(key, value)

f-문자열

파이썬 3.6부터는 인터폴레이션을 통한 형식 문자열(줄여서 f-문자열이라고 부름)이 도입됐다. 현재 가장 선호되는 방식이다.

key = 'my_var'
value = 1.234

formatted = f'{key} = {value}'

# 옵션 주는 방법

>>> f_string = f'{key:<10} = {value:.2f}'
>>> print(f_string)
my_var     = 1.23

Better Way 6: 인덱스를 사용하는 대신 대입을 사용해 데이터를 언패킹하라

인덱스로 시퀀스 데이터에 접근하면 명시적이지 않아 가독성이 떨어진다. 언패킹하면 훨씬 가독성이 좋아진다.

person_list = [('kevin', 20), ('mike', 21), ('suzan', 20), ('steve', 25)]

# 지양되는 방식
for i in range(len(person_list)):
    name = person_list[i][0]
    age = person_list[i][1]

# 더 나은 방식
for name, age in person_list:

Better Way 9: for-else, while-else문 대신 함수(def-return)를 사용하라

for나 while과 같은 반복문이 break에 의해 중간에 종료되지 않고 끝까지 순회한 후에 비로소 종료되면 뒤에 else문을 실행하는 구문이 있다. (저는 사실 이 방법을 자주 사용합니다..)

a, b = 4, 9

for i in range(2, min(a, b) + 1):
    if a % i == 0 and b % i == 0:
        print('서로소 아님')
        break
else:
    print('서로소')

근데 이러한 방식으로 작성하는 코드는 가독성이 떨어진다. (그런가..?) 그래서 for-else같은 구문 보다는 함수를 사용하는 편이 낫다. 함수는 return문을 만나면 값을 return하고 함수를 곧바로 종료하기 때문에 break와 같은 효과를 가진다고 볼 수 있다.

def coprime(a, b):
    for i in range(2, min(a, b) + 1):
        if a % i == 0 and b % i == 0:
            return False
    return True

Tags:

Categories:

Updated: