이 모듈의 도달 목표

함수로 프로그램 나누기

입력과 반환값이 분명한 함수로 로직을 나누고 작은 함수들을 조합해 재사용 가능한 프로그램을 만듭니다.

결과물 · 함수형 학습 리포트 생성기
약 4~6시간
  • 함수 정의와 호출의 실행 흐름을 설명한다
  • 매개변수와 인자로 함수에 값을 전달한다
  • print와 return의 차이를 구분해 계산 결과를 반환한다
  • 하나의 큰 문제를 역할이 분명한 함수로 분해하고 조합한다
01

함수는 이름 붙인 작업 단위

def로 함수의 이름과 실행할 코드를 정의하고, 이름 뒤에 괄호를 붙여 호출합니다. 함수 본문은 호출될 때마다 실행되므로 같은 로직을 복사하지 않고 재사용할 수 있습니다.

일상에서 보면자주 쓰는 요리법에 이름을 붙여 필요할 때마다 같은 순서로 조리하는 것과 같습니다.
def say_hello():
    print('안녕하세요')

say_hello()
say_hello()
실행 결과
안녕하세요
안녕하세요
한 줄씩 보기
  1. say_hello라는 함수를 정의합니다.
  2. 들여쓴 본문이 함수의 작업입니다.
  3. 함수를 두 번 호출해 같은 작업을 두 번 실행합니다.
직접 값 바꾸기함수 안에 두 번째 print를 추가하고 호출 한 번당 몇 줄이 출력되는지 확인하세요.
흔한 실수함수를 정의하기만 하고 호출하지 않으면 본문은 실행되지 않습니다.

짧은 확인def 블록과 함수 호출 중 실제 작업을 시작하는 것은 어느 쪽일까요?

02

매개변수는 함수가 받을 입력

함수 정의의 매개변수는 호출할 때 전달되는 인자를 받습니다. 매개변수 이름은 함수 안에서만 쓰이며, 호출마다 다른 값을 넣어 같은 계산을 재사용할 수 있습니다.

일상에서 보면주스 기계의 투입구는 같지만 사과를 넣을지 귤을 넣을지 매번 선택하는 것과 같습니다.
def double(number):
    print(number * 2)

double(3)
double(7)
실행 결과
6
14
한 줄씩 보기
  1. number 매개변수 하나를 받습니다.
  2. 받은 값을 두 배로 출력합니다.
  3. 3과 7을 각각 인자로 전달합니다.
직접 값 바꾸기두 수를 받아 곱을 출력하는 multiply(a, b)를 만들어 보세요.
흔한 실수정의한 매개변수 수와 전달한 인자 수가 다르면 TypeError가 발생합니다.

짧은 확인double(5)에서 매개변수와 인자는 각각 무엇일까요?

03

return은 계산 결과를 돌려준다

print는 화면에 값을 보여 주지만 호출한 곳에서 재사용할 결과를 만들지는 않습니다. return은 값을 호출한 곳으로 돌려주고 즉시 함수를 끝냅니다. 계산 함수는 보통 출력보다 반환을 담당합니다.

일상에서 보면print는 전광판에 결과를 보여 주는 일이고, return은 결과물을 손에 건네 다음 작업에 쓰게 하는 일입니다.
def add(a, b):
    return a + b

result = add(3, 4)
print(result * 2)
실행 결과
14
한 줄씩 보기
  1. 두 값을 받는 함수를 정의합니다.
  2. 합계를 호출한 곳에 반환합니다.
  3. 반환값 7을 result에 저장합니다.
  4. 저장한 값을 다음 계산에 사용합니다.
직접 값 바꾸기return a + b를 print(a + b)로 바꾸면 result에 무엇이 저장되는지 확인하세요.
흔한 실수return을 반복문 안에 너무 일찍 두면 첫 반복 후 함수가 종료됩니다.

짧은 확인함수 결과를 다른 계산에 사용하려면 print와 return 중 무엇이 필요할까요?

04

기본값과 여러 반환값

매개변수에 기본값을 지정하면 호출할 때 해당 인자를 생략할 수 있습니다. return에 값을 쉼표로 나열하면 여러 결과를 한 번에 돌려주고 여러 변수로 나누어 받을 수 있습니다.

일상에서 보면주문 옵션을 말하지 않으면 기본 크기를 쓰고, 영수증과 거스름돈을 함께 받는 것과 같습니다.
def score_range(scores, label='점수'):
    return label, min(scores), max(scores)

name, low, high = score_range([80, 65, 95])
print(name, low, high)
실행 결과
점수 65 95
한 줄씩 보기
  1. label의 기본값을 점수로 정합니다.
  2. 이름·최솟값·최댓값을 함께 반환합니다.
  3. 세 반환값을 세 변수로 나눠 받습니다.
직접 값 바꾸기두 번째 인자로 '시험'을 전달해 출력 이름을 바꿔 보세요.
흔한 실수기본값이 있는 매개변수 뒤에 기본값이 없는 매개변수를 둘 수 없습니다.

짧은 확인기본값이 지정된 인자를 호출에서 생략하면 어떤 값이 사용될까요?

05

작은 함수를 조합하면 큰 흐름이 보인다

한 함수가 입력, 계산, 출력까지 모두 맡게 하지 말고 평균 계산, 통과 수 계산, 문장 만들기처럼 역할별로 나눕니다. 각 함수는 한 가지 일을 하고 반환값으로 연결하면 테스트와 수정이 쉬워집니다.

일상에서 보면한 사람이 모든 일을 하는 대신 재료 준비·조리·포장을 나눠 연결하는 작업대와 같습니다.
def average(scores):
    return sum(scores) / len(scores)

def make_message(scores):
    value = average(scores)
    return f'평균: {value:.1f}'

print(make_message([80, 70, 90]))
실행 결과
평균: 80.0
한 줄씩 보기
  1. 평균 계산만 담당하는 함수를 만듭니다.
  2. 메시지 함수가 평균 함수를 호출합니다.
  3. 반환받은 값을 문장으로 바꿉니다.
  4. 최상위 코드가 완성 문장을 출력합니다.
직접 값 바꾸기최고 점수를 반환하는 함수를 추가하고 make_message에서 함께 사용해 보세요.
흔한 실수함수가 전역 변수에 지나치게 의존하면 어떤 입력으로 동작하는지 알기 어렵습니다.

짧은 확인평균 계산 규칙이 바뀌면 어느 함수만 수정하면 될까요?

점수 평균 함수

  1. 점수 목록을 받는 함수 머리를 작성합니다.
  2. 목록의 합계와 길이로 평균을 계산합니다.
  3. print 대신 return으로 결과를 돌려줍니다.
  4. 한 개짜리 목록도 올바르게 처리되는지 확인합니다.
def average(scores):
    return sum(scores) / len(scores)

scores = list(map(int, input().split()))
print(f'평균: {average(scores):.2f}')

핵심을 확인해 볼까요?

5문항 중 4문항 이상 정답이면 완료됩니다. 오답 후에도 다시 제출할 수 있습니다.

1함수 본문이 실제로 실행되는 시점은?
2def double(number)에서 number의 역할은?
3계산 결과를 호출한 곳에서 다시 사용하게 하는 문장은?
4return 문 다음에 같은 함수 본문에 있는 코드는 어떻게 되는가?
5함수를 역할별로 작게 나누는 주된 이점은?