← 파이썬 강의 목록으로
🌱
기초 (Basic)
def · return · 기본값 · 키워드 인수 · 스코프

9주차 — 함수 기초

def 로 함수를 정의하고 호출, 매개변수와 인수의 차이, 기본값/키워드 인수, return으로 값 반환, 그리고 지역/전역 변수의 스코프를 익힙니다.

함수defreturnscope
소요 시간
2시간
난이도
📊 완전 초보
선수 조건
🎯 8주차
결과물
재사용 가능한 함수로 깔끔하게 분리된 작은 프로그램

이 강의에서 배우는 것

  • 1def 로 함수를 정의하고 호출한다
  • 2매개변수와 인수의 차이를 안다
  • 3기본값 매개변수, 키워드 인수를 사용한다
  • 4return 으로 값을 반환한다
  • 5변수의 스코프(지역/전역)를 이해한다

1. 함수란

같은 동작을 여러 번 쓰지 않고 이름 붙여 재사용. 코드를 짧고 명확하게 만든다.

python
def greet(name):
    print(f"안녕, {name}!")

greet("홍길동")
greet("김영희")

2. 매개변수와 인수

  • 매개변수(parameter): 함수 정의의 변수 (name)
  • 인수(argument): 함수 호출 시 전달하는 값 ("홍길동")
python
def add(a, b):       # a, b: 매개변수
    return a + b

result = add(3, 5)   # 3, 5: 인수

3. return

함수가 값을 돌려줍니다. return 만나면 즉시 종료.

python
def square(x):
    return x * x

n = square(5)   # 25

return 없으면 자동으로 None 반환.

4. 기본값 매개변수

호출 시 인수 생략하면 기본값 사용.

python
def greet(name, greeting="안녕"):
    return f"{greeting}, {name}님!"

print(greet("길동"))                # 안녕, 길동님!
print(greet("Alice", "Hello"))     # Hello, Alice님!

5. 키워드 인수

순서 대신 이름으로 전달.

python
def make_user(name, age, city):
    return {"name": name, "age": age, "city": city}

# 위치 인수
u1 = make_user("홍길동", 20, "서울")

# 키워드 인수 (순서 무관, 가독성 좋음)
u2 = make_user(city="부산", name="김영희", age=25)

6. 여러 값 반환 (튜플)

python
def min_max(nums):
    return min(nums), max(nums)

lo, hi = min_max([3, 1, 4, 1, 5])
print(lo, hi)   # 1 5

7. 변수 스코프

함수 안에서 만든 변수는 지역 변수 — 밖에서 안 보임.

python
def f():
    x = 10        # 지역
    print(x)

f()
# print(x)        # NameError

함수 안에서 전역 변수를 수정하려면 global 키워드:

python
total = 0
def add(n):
    global total
    total += n

(가능하면 global 은 피하고, 함수가 값을 받아서 반환하는 형태 권장.)

8. 자주 하는 실수

1) 함수 호출에 () 빠뜨림

python
def hi():
    print("hi")
hi    # 함수 객체. 실행 안 됨
hi()  # 실행

2) return 없는데 결과 사용

python
def show(x):
    print(x)
y = show(5)   # y = None

3) 기본값에 가변 객체

python
def add_to(item, lst=[]):    # ⚠️ 함정!
    lst.append(item)
    return lst
add_to(1)   # [1]
add_to(2)   # [1, 2] — 같은 리스트 공유

→ 기본값은 None 으로 두고 함수 안에서 새로 생성:

python
def add_to(item, lst=None):
    if lst is None:
        lst = []
    ...

4) 이름 충돌

python
def list():        # 내장 list 가려짐
    ...

→ print, list, sum 같은 내장 이름은 변수·함수명으로 쓰지 말 것.

9. FAQ

Q1. 함수는 몇 줄이 적절한가요?

권장 5~30줄. 너무 길면 더 작은 함수로 분리.

Q2. print 와 return 의 차이?

print 는 화면에 출력, return 은 값을 반환. 함수가 값 자체가 필요할 때는 return.

Q3. 함수 안에서 함수를 호출할 수 있나요?

네. 자신을 호출(재귀)도 가능 (중급에서 다룸).

💻 예제 (examples)

실제로 실행해 결과를 확인할 수 있는 예제 코드입니다.

01_basic_function.py정의와 호출
CODE
def greet(name):
    print(f"안녕, {name}!")

def add(a, b):
    return a + b

greet("홍길동")
greet("김영희")
print(add(3, 5))
▶ 실행 결과
안녕, 홍길동!
안녕, 김영희!
8
02_default_args.py기본값 + 키워드 인수
CODE
def greet(name, greeting="안녕"):
    return f"{greeting}, {name}님!"

print(greet("길동"))
print(greet("Alice", "Hello"))
print(greet(name="민수", greeting="반가워"))
▶ 실행 결과
안녕, 길동님!
Hello, Alice님!
반가워, 민수님!
03_return.pyreturn / 여러 값 반환
CODE
def square(x):
    return x * x

def min_max(nums):
    return min(nums), max(nums)

print(square(5))

lo, hi = min_max([3, 1, 4, 1, 5])
print(lo, hi)
▶ 실행 결과
25
1 5
04_scope.py지역 변수 / global
CODE
total = 0

def add(n):
    global total
    total += n

add(10)
add(20)
print(total)   # 30

def local_demo():
    x = 100
    print(x)

local_demo()
# print(x)  # NameError
▶ 실행 결과
30
100

📝 과제 (exercises)

직접 풀어보고, 막힐 때 정답을 펼쳐 비교해보세요.

과제 1

계산기 함수 모음

목표: 사칙연산 함수를 만들고 메뉴형 계산기로 사용한다.

요구사항
  • 함수 4개: add, sub, mul, div
  • div 는 0으로 나누면 None 반환 (또는 메시지)
  • main 흐름: 메뉴 → 두 수 입력 → 결과 출력 → 종료
입출력 예시
[메뉴] 1.+ 2.- 3.* 4./ 5.종료
선택: 1
첫 번째 수: 10
두 번째 수: 5
결과: 15
정답 코드 펼치기 / 접기
SOLUTION
def add(a, b): return a + b
def sub(a, b): return a - b
def mul(a, b): return a * b
def div(a, b):
    if b == 0:
        return None
    return a / b

while True:
    print("\n[메뉴] 1.+ 2.- 3.* 4./ 5.종료")
    choice = input("선택: ")
    if choice == "5":
        break
    a = float(input("첫 번째 수: "))
    b = float(input("두 번째 수: "))
    if choice == "1":
        print("결과:", add(a, b))
    elif choice == "2":
        print("결과:", sub(a, b))
    elif choice == "3":
        print("결과:", mul(a, b))
    elif choice == "4":
        result = div(a, b)
        print("결과:", "0으로 나눌 수 없습니다" if result is None else result)
▶ 실행 결과
[메뉴] 1.+ 2.- 3.* 4./ 5.종료
선택: 1
첫 번째 수: 10
두 번째 수: 5
결과: 15.0
과제 2

입력 검증 함수

목표: is_valid_age(value) 함수를 만든다.

요구사항
  • 0~120 사이의 정수면 True, 아니면 False
  • 문자열이 들어와도 처리 ("abc" → False)
입출력 예시
True
True
True
False
False
False
정답 코드 펼치기 / 접기
SOLUTION
def is_valid_age(value):
    try:
        n = int(value)
    except (ValueError, TypeError):
        return False
    return 0 <= n <= 120

print(is_valid_age(20))
print(is_valid_age(0))
print(is_valid_age(120))
print(is_valid_age(-1))
print(is_valid_age(150))
print(is_valid_age("abc"))
▶ 실행 결과
True
True
True
False
False
False
과제 3

소수 판별 함수

목표: is_prime(n) 함수를 작성하고, 1~50 중 소수만 출력한다.

요구사항
  • 1과 0 이하: 소수 아님
  • 2: 소수
  • 짝수(2 제외): 소수 아님
  • 그 외: 3부터 √n 까지 홀수로 나누어 보기
입출력 예시
1~50 사이의 소수:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
정답 코드 펼치기 / 접기
SOLUTION
def is_prime(n):
    if n <= 1:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    i = 3
    while i * i <= n:
        if n % i == 0:
            return False
        i += 2
    return True

primes = [str(n) for n in range(1, 51) if is_prime(n)]
print("1~50 사이의 소수:")
print(" ".join(primes))
▶ 실행 결과
1~50 사이의 소수:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
예제 코드 / 강의 자료

전체 강의 자료와 예제 코드는 GitHub에서 자유롭게 받아볼 수 있습니다.

GitHub에서 보기 ↗