
파이썬 · 약 4분
Python 함수: return과 구간 합계의 경계 조건
함수의 출력과 반환값을 비교하고, None·기본 인수·range의 끝값 규칙을 구간 합계 예제로 익힙니다.
Wolfgadeok · 업데이트
화면에 출력하는 것과 값을 돌려주는 것
함수는 자주 쓰는 동작을 이름으로 묶는 도구입니다. def 다음 줄부터 들여쓴 부분이 함수 본문이고, 호출하면 그 본문이 실행됩니다. 값을 돌려주는 함수와 출력만 하는 함수를 나란히 실행하면 반환값의 역할을 확인할 수 있습니다. return 100은 호출한 곳에 100을 전달하지만 return만 쓰거나 끝까지 실행되면 반환값은 None입니다.
print는 사람이 볼 수 있도록 출력하는 동작입니다. 함수 안에서 print(100)을 썼다고 그 함수가 숫자 100을 반환하지는 않습니다. 계산 함수가 결과를 return하고, 호출자가 출력 여부를 결정하도록 나누면 테스트와 재사용이 쉬워집니다. 아래 show_number는 설명을 위해 출력만 하는 함수이고 get_number는 값을 돌려주는 함수입니다.
예제 · python
def show_number():
print(100)
def get_number():
return 100
shown = show_number()
value = get_number()
assert shown is None
assert value == 100
print(value + 20) # 120합계 함수의 끝값을 분명히 약속하기
range는 끝값을 포함하지 않습니다. 따라서 0부터 100까지 포함하여 더하려면 range(0, 101)을 사용합니다. 끝값을 나타내는 변수 end를 쓴다면 range의 종료 인수에 end + 1을 전달합니다. 다만 step이 음수인 경우까지 지원하려면 같은 식을 그대로 쓰면 안 됩니다. 여기서는 학습 범위를 명확히 하여 start부터 end까지, 양수 간격으로 증가하는 합계만 지원합니다.
step이 0이거나 음수이면 오류로 알리고, start가 end보다 크면 더할 수가 없어 0이 됩니다. 아래 함수는 정수 인수를 받는 예제입니다. end는 상한이며 간격이 정확히 도달하지 않으면 마지막으로 더한 수가 end보다 작을 수 있습니다. 테스트를 읽으면 이런 계약이 코드보다 먼저 드러납니다.
예제 · python
def sum_inclusive(start=0, end=100, step=1):
if step <= 0:
raise ValueError("step must be positive")
total = 0
for number in range(start, end + 1, step):
total += number
return total
assert sum_inclusive() == 5050
assert sum_inclusive(0, 100, 10) == 550
assert sum_inclusive(end=100, step=2) == 2550
assert sum_inclusive(5, 3) == 0
assert sum_inclusive(0, 5, 2) == 6이름과 테스트가 설명을 대신하게 만들기
함수 이름에 inclusive를 붙인 이유는 끝값을 포함하려는 약속을 드러내기 위해서입니다. 라이브러리에 이미 있는 sum(range(...))를 사용할 수도 있지만, 입문 실습에서는 반복문과 누적 변수가 어떤 역할을 하는지 직접 추적해 보는 것이 유용합니다. 누적 변수는 매 호출마다 0에서 시작해야 이전 호출의 결과가 섞이지 않습니다.
같은 이름의 함수를 한 파일에서 반복 정의하면 마지막 정의가 이전 정의를 가립니다. 여러 구현을 비교할 때는 서로 다른 이름으로 정의하거나 한 예제씩 실행하여 어떤 함수가 호출되는지 확인하세요. 기본값이 있는 인수는 이름을 지정해 호출하면 의미가 잘 드러납니다. 앞으로 리스트 같은 가변 객체를 기본값으로 넣을 때는 호출 사이에 공유되는 문제도 따로 학습해야 합니다.
참고 자료
예제는 학습용이며, 모든 환경에서 실행 검증된 완성 프로젝트는 아닙니다. 적용 전 사용 중인 버전과 프로젝트 환경에서 동작을 확인하세요.