def calc_bulk_density(mass, volume):
'''벌크 밀도 반환 = 질량 / 부피'''
assert volume > 0 # 부피는 반드시 양수여야 함
return mass / volume프로그래밍 스타일
- 코딩 스타일 가이드를 준수해야 하는 이유를 이해합니다.
- 코드의 가독성을 높이기 위해 리팩토링을 수행하고 그 이유를 설명할 수 있습니다.
- 파이썬의 표준 코딩 스타일인 PEP 8을 이해하고 적용합니다.
- 어떻게 하면 코드를 더 읽기 쉽게(readable) 만들 수 있나요?
- 다른 프로그래머들은 어떤 규칙에 따라 코드를 작성하나요?
- 프로그램이 실행 중에 스스로 상태를 점검하게 하려면 어떻게 해야 하나요?
코딩 스타일 (Coding style)
일관된 코딩 스타일은 다른 사람(또는 미래의 자신)이 코드를 더 쉽게 읽고 이해할 수 있도록 도와줍니다. 코드는 작성되는 시간보다 읽히는 시간이 훨씬 더 길기 때문입니다. 파이썬의 선(Zen of Python)에서도 “가독성은 중요하다(Readability counts)”라고 명시하고 있습니다. 파이썬 공동체에서는 공식 코딩 스타일 가이드인 PEP 8을 제정하여 권장하고 있습니다.
특히 강조할 만한 몇 가지 사항은 다음과 같습니다:
- 코드에 주석(comments)을 달아, 어떤 가정을 하고 있는지, 알고리즘의 의도가 무엇인지, 그리고 예상되는 입력과 출력이 무엇인지 설명하세요.
- 변수 이름을 지을 때는 의미가 명확하고 직관적인 이름(semantically meaningful variable names)을 선택하세요.
- 들여쓰기를 할 때는 탭(tabs) 대신 공백(spaces)을 사용하세요. 탭 문자는 에디터나 운영체제마다 다르게 해석될 수 있어 코드의 형식이 깨질 위험이 있습니다.
표준 파이썬 스타일 가이드를 준수하세요.
- PEP 8: 파이썬의 공식 코딩 스타일 가이드라인으로, 변수 명명법, 들여쓰기 칸수,
import문 배치 등 상세한 규칙을 다룹니다. PEP 8을 준수하면 다른 개발자들이 여러분의 코드를 이해하기 쉬워지며, 협업 시 일관성을 유지할 수 있습니다. - 코드가 PEP 8을 잘 지키고 있는지 검사하려면 pycodestyle 도구를 사용하거나, 코드를 자동으로 포맷팅해 주는 black과 같은 도구를 활용할 수 있습니다. 주피터 노트북 환경을 위한 nb_black도 있습니다.
- 구글과 같은 일부 조직에서는 PEP 8을 기반으로 수정한 자체 가이드를 사용하기도 합니다. 예를 들어 구글 파이썬 스타일 가이드가 있습니다. 구글은 yapf라는 도구를 만들어 다양한 스타일로 자동 포맷팅을 지원합니다.
- 결국 코딩 스타일에서 가장 중요한 것은 일관성(consistency)입니다. 프로젝트에서 특정 스타일을 따르기로 결정했다면, 모든 협업자가 해당 규칙을 준수하도록 해야 합니다. 일관성 없는 다양한 스타일을 섞어 쓰는 것보다 하나의 규칙을 일관되게 유지하는 것이 코드의 파악과 유지보수에 훨씬 유리합니다.
assert를 사용하여 예상치 못한 오류를 감지하세요.
단언문(Assertions)은 코드 실행 중에 특정 조건이 의도한 대로 유지되고 있는지 확인하는 간단하고 강력한 방법입니다.
만약 assert 뒤의 조건이 False가 되면, 파이썬은 AssertionError를 발생시켜 프로그램을 중단합니다. 에러 메시지에는 어떤 코드에서 문제가 발생했는지 표시되어 원인을 파악하기 쉽습니다. 참고로, 파이썬을 실행할 때 -O (optimize) 옵션을 사용하면 모든 assert 문을 무시하고 실행할 수 있습니다. 주의할 점은 assert를 프로그램의 상태를 변경하는 용도로 사용해서는 안 된다는 것입니다. 예를 들어 단언문 안에서 변수에 값을 대입하는 등의 작업은 피해야 합니다.
독스트링(docstrings)을 사용하여 함수 설명을 작성하세요.
함수 정의 바로 아래에 문자열을 작성하면 파이썬은 이를 해당 함수의 내장 설명서로 인식합니다. 이를 통해 help() 함수로 함수의 사용법을 즉시 확인할 수 있습니다. 이러한 문자열을 독스트링(docstring, 문서화 문자열)이라고 부릅니다.
def average(values):
"입력값들의 평균을 반환합니다. 빈 리스트가 주어지면 None을 반환합니다."
if len(values) == 0:
return None
return sum(values) / len(values)
help(average)Help on function average in module __main__:
average(values)
입력값들의 평균을 반환합니다. 빈 리스트가 주어지면 None을 반환합니다.
독스트링에서는 주로 여러 줄 문자열(multiline strings)을 사용합니다. 여러 줄 문자열은 따옴표 세 개(''' 또는 """)로 감싸서 작성합니다.
"""이 문자열은
여러 줄에 걸쳐서
작성할 수 있습니다.
중간에 빈 줄을 포함할 수도 있습니다."""'이 문자열은\n여러 줄에 걸쳐서\n작성할 수 있습니다.\n\n중간에 빈 줄을 포함할 수도 있습니다.'
어떤 내용이 도움말에 표시될까요?
다음 코드 중에서 help() 함수를 실행했을 때 독스트링으로 표시될 부분은 어디인지 찾아보세요. 또한, 도움말에 표시되지 않거나 실행 시 오류가 발생할 가능성이 있는 부분이 있는지 확인해 보세요.
"여러 시퀀스 간의 최대 편집 거리(edit distance)를 계산합니다."
# 이 주석은 시퀀스 집합 내의 최대 거리를 탐색하는 역할을 설명합니다.
def overall_max(sequences):
'''모든 시퀀스 쌍 중에서 최대 편집 거리를 계산하여 반환합니다.'''
highest = 0
for left in sequences:
for right in sequences:
'''자기 자신과 비교하는 경우는 제외합니다.'''
if left != right:
this = edit_distance(left, right)
highest = max(highest, this)
return highestoverall_max 함수 정의 바로 아래에 있는 '''모든 시퀀스 쌍 중에서 최대 편집 거리를 계산하여 반환합니다.''' 부분만 독스트링으로 인식되어 도움말에 표시됩니다. 함수 외부의 문자열이나 루프 내부의 문자열은 독스트링으로 인식되지 않습니다.
문서화 주석 달기
복잡한 알고리즘이나 수식이 포함된 코드 근처에 주석(comments)을 달면 다른 사람들이 코드를 이해하는 데 큰 도움이 됩니다. 이는 미래의 자신에게도 유용합니다.
반면, 독스트링(docstrings)은 함수나 클래스가 어떤 입력을 받고 어떤 결과를 반환하는지, 그리고 어떤 목적으로 만들어졌는지 설명할 때 사용합니다. 사용자가 help()를 사용했을 때 나타나는 내용입니다.
다음 함수의 주석을 독스트링으로 변환해 보세요.
def middle(a, b, c):
# 세 값 중 중간값을 반환합니다.
# 세 값은 서로 비교 가능해야 한다고 가정합니다.
values = [a, b, c]
values.sort()
return values[1]def middle(a, b, c):
'''세 값 중 중간값을 반환합니다.
세 값은 서로 비교 가능해야 한다고 가정합니다.'''
values = [a, b, c]
values.sort()
return values[1]코드 가독성 개선하기
- 아래 코드를 읽고 어떤 결과가 나올지 예측해 보세요.
- 코드를 실행하여 예측이 맞았는지 확인해 보세요.
- 코드의 가독성을 높이기 위해 리팩토링을 수행해 보세요. 변경할 때마다 코드를 실행하여 기능이 변하지 않았는지 확인하세요.
- 여러분이 수정한 코드와 동료의 코드를 비교해 보세요. 어떤 점이 같고 어떤 점이 다른가요?
n = 10
s = 'et cetera'
print(s)
i = 0
while i < n:
# print('at', j)
new = ''
for j in range(len(s)):
left = j-1
right = (j+1)%len(s)
if s[left]==s[right]: new = new + '-'
else: new = new + '*'
s=''.join(new)
print(s)
i += 1다음은 가독성을 높인 예시 답안입니다.
def transform_string(input_string, iterations):
"""
입력된 문자열을 지정된 횟수만큼 변형하여 출력합니다.
변형 규칙: 인접한 두 문자가 같으면 '-', 다르면 '*'를 사용합니다.
"""
print(input_string)
length = len(input_string)
current = input_string
for _ in range(iterations):
new_chars = []
for i in range(length):
left = i - 1
right = (i + 1) % length
if current[left] == current[right]:
new_chars.append('-')
else:
new_chars.append('*')
current = ''.join(new_chars)
print(current)
transform_string('et cetera', 10)- 파이썬 표준 코딩 스타일(PEP 8)을 준수하세요.
- 함수의 목적과 사용법을 설명하기 위해 독스트링(docstrings)을 사용하세요.