파이썬 교재 · 9편 / 27편

파이썬 함수 만들기 — def·인자·return

같은 코드를 두 번 쓴 순간이 함수를 만들 시점.

입문읽는 시간 7분2026-05-13
def 로 함수를 정의하고 다양한 인자로 호출하는 코드 화면

여기까지 우리는 "코드를 직선으로 적어 위에서 아래로 실행" 했습니다. 학생 한 명 학점 계산은 7편 if 로 끝났지만, 30명을 처리하면 똑같은 코드 30 덩어리가 생깁니다. 두 번째로 쓰는 순간이 함수를 만들 시점이라는 격언이 있는데(DRY — Don't Repeat Yourself), 파이썬에서 그 단위가 바로 함수(function).

9편을 마치면 ① def 로 함수 정의 ② 인자 받기와 return ③ 기본값과 키워드 인자 ④ docstring 한 줄로 문서화 ⑤ 변수 범위(scope) 의 기본 — 다섯 가지를 손에 익힙니다. 입문 단계 후반의 가장 큰 도약입니다.

def — 함수 정의의 기본 모양

def square(n):
    return n * n

# 호출
square(5)        # 25
square(square(3))  # 81 — 함수 결과를 또 함수에 (4편 합성)

네 가지 구성 요소.

  • def — "여기서부터 함수다" 키워드
  • 이름 + 괄호 + 콜론square(n):. 이름은 변수와 같은 규칙(snake_case 권장)
  • 들여쓰기 블록 — if·for 와 같은 규칙. 4칸 들여쓰기로 함수 안 코드 묶음
  • return — 호출자에게 값을 돌려줌. 없으면 None 반환

함수는 정의했다고 실행되는 게 아닙니다. def square(n): ... 만 있으면 "이런 함수가 있다" 등록만. 실제 실행은 square(5) 같은 호출이 있어야. 입문자가 자주 헷갈리는 지점이에요.

인자와 return — 데이터를 받아 결과를 돌려준다

함수는 작은 박스로 비유됩니다. 위로 입력이 들어가고(인자), 아래로 결과가 나옵니다(return).

def grade(score):
    if score >= 90:
        return "A"      # return 만나면 함수 즉시 종료
    if score >= 80:
        return "B"
    if score >= 70:
        return "C"
    return "F"

grade(95)     # 'A'
grade(72)     # 'C'

# 30명 처리도 한 줄 반복으로 끝
scores = [82, 91, 75, 88, 60, 95]
grades = [grade(s) for s in scores]
print(grades)   # ['B', 'A', 'C', 'B', 'F', 'A']

중요한 두 가지. ① return 을 만나면 함수가 그 자리에서 끝입니다. 90점 이상이면 "A" 반환 후 다음 if 는 실행조차 안 해요. 그래서 7편의 elif 사슬을 일렬 if + return 으로 풀어 쓸 수 있습니다. ② return 없으면 자동으로 None 반환 — print 만 하고 끝나는 함수는 None 을 돌려준다는 사실을 잊지 마세요.

# 여러 값 반환 — 튜플로 묶임
def stats(nums):
    return min(nums), max(nums), sum(nums) / len(nums)

lo, hi, avg = stats([82, 91, 75, 88])
print(f"최저 {lo} / 최고 {hi} / 평균 {avg:.1f}")
# 최저 75 / 최고 91 / 평균 84.0

여러 값을 돌려주고 싶을 때 쉼표로 나열하면 자동으로 튜플이 됩니다. 받는 쪽도 변수 셋을 쉼표로 펼쳐서 한 번에 받아요 — 6편 items 와 같은 언패킹.

기본값·키워드 인자 — 함수를 유연하게

인자가 늘면 호출이 번잡해집니다. 기본값키워드 호출이 해결.

def greet(name, msg="안녕", emoji="👋"):
    return f"{emoji} {msg}, {name}님!"

# 모든 형태가 한 함수에서 동작
greet("준성")                              # '👋 안녕, 준성님!'
greet("수민", "반가워")                     # '👋 반가워, 수민님!'
greet("지훈", emoji="🎉")                  # '🎉 안녕, 지훈님!'
greet(name="민서", emoji="🌸", msg="환영")  # 순서 무관

두 패턴을 같이 쓸 때 규칙 — 위치 인자가 먼저, 키워드 인자가 뒤. greet(emoji="🎉", "지훈") 은 SyntaxError. 익숙해지면 호출이 일종의 영어 문장처럼 읽혀요.

⚠️ 기본값 함정 — 가변 객체는 절대 기본값으로 쓰지 마세요. def add(item, bag=[]) 처럼 빈 리스트를 기본값으로 쓰면 모든 호출이 같은 리스트를 공유합니다. 두 번째 호출이 첫 번째 결과를 이어받는 미친 버그. def add(item, bag=None): bag = bag or [] 로 회피.

docstring·스코프·재사용 패턴

docstring — 함수의 첫 줄에 설명

def grade(score):
    """점수(0-100)를 학점(A·B·C·F) 으로 변환한다.

    >>> grade(85)
    'B'
    """
    if score >= 90: return "A"
    if score >= 80: return "B"
    if score >= 70: return "C"
    return "F"

help(grade)        # 위 docstring 이 출력됨
grade.__doc__      # 같은 결과

코드 주석(#) 과 다르게 docstring 은 함수의 일부로 저장됩니다. help()·IDE 자동완성·문서 생성기가 다 활용해요. 한 줄짜리라도 적는 습관이 입문자의 큰 차이를 만듭니다.

변수 범위 — 함수 안과 밖은 다른 세상

x = 10                # 전역(global)

def f():
    x = 99            # 지역(local) — 함수 안에서만 유효
    print(x)          # 99

f()
print(x)              # 10 — 함수 밖은 안 바뀜

함수 안에서 변수를 만들면 그건 그 함수만의 것. 밖의 동명 변수에 영향을 안 줍니다. 이 스코프 분리가 함수의 가장 큰 가치 — 30개 함수가 같은 코드에 있어도 서로 변수가 안 섞여요.

📌 함수 만들기 3가지 신호

① 같은 코드를 두 번 이상 복붙했다 ② 한 화면에 들어오는 코드 덩어리가 30줄 넘는다 ③ "이건 무엇을 한다" 한 줄로 이름을 붙일 수 있다. 셋 중 하나라도 ✓ 면 함수로 뽑으세요. 처음엔 어색하지만 한 달이면 모든 작업을 함수 단위로 생각하게 됩니다.

다음 미션 — REPL 에서: ① 섭씨를 화씨로 바꾸는 c2f 함수 (식: F = C × 9/5 + 32) ② 리스트 받아 평균만 돌려주는 avg 함수 (한 줄) ③ 이름 받아 인사하는 함수에 기본값 추가해 한국어·영어 둘 다 지원.

다음 편 미리보기

10편 — "리스트 컴프리헨션": [x*2 for x in nums if x > 0]. for 와 if 를 한 줄로 압축하는 파이썬의 시그니처. 입문자의 첫 큰 도약.

📚 27편 파이썬 교재 시리즈 — 9/27편
← 8편 "반복문" · 다음: 10편 "리스트 컴프리헨션"

© 2026 주나이테크(주) @JUNAITECH