5장: 함수 — 코드를 묶어서 이름 붙이기¶
함수란?¶
함수(function)는 코드 묶음에 이름을 붙인 것입니다.
같은 작업을 여러 번 해야 할 때, 코드를 반복하지 않고 한 번 정의해서 여러 번 호출합니다.
수학 함수와 파이썬 함수¶
수학에서 f(x) = 2x 는 "x를 받아서 2배를 돌려준다"는 규칙입니다.
def f(x):
return x * 2
print(f(3)) # 6
print(f(10)) # 20
함수를 한 번 정의하면 몇 번이든 호출할 수 있습니다.
우리가 이미 쓰던 함수들 — 내장 함수¶
파이썬에는 처음부터 준비된 내장 함수(built-in functions)가 있습니다.
설치도, import도 필요 없이 바로 씁니다.
print(abs(-5)) # 5
print(len("Python")) # 6
print(min(3, 1, 4)) # 1
print(max(3, 1, 4)) # 4
print(int("42")) # 42
print(str(3.14)) # 3.14
print(float("2.5")) # 2.5
print(list(range(3))) # [0, 1, 2]
함수의 세 가지 종류¶
| 종류 | 설명 | 사용법 |
|---|---|---|
| 내장 함수 | 파이썬에 기본 포함 | 그냥 사용 |
| 표준 라이브러리 | 파이썬 설치 시 함께 포함 | import 후 사용 |
| 외부 라이브러리 | 별도 설치 필요 | pip install 후 import |
| 사용자 정의 | 직접 만든 함수 | def로 정의 후 호출 |
모듈 — import로 불러오기¶
표준 라이브러리 함수는 import로 불러와야 합니다.
import math
print(math.sqrt(16)) # 4.0
print(math.pi) # 3.141592653589793
import random
print(random.randint(1, 6)) # 1~6 사이 정수 (주사위)
import 세 가지 방식¶
import math # 모듈 전체 불러오기
print(math.sqrt(9)) # → 모듈명.함수명()
from math import sqrt # 특정 함수만 불러오기
print(sqrt(9)) # → 함수명()만으로 사용
import math as m # 별칭 붙이기
print(m.sqrt(9)) # → 별칭.함수명()
함수 정의하기 — def¶
def 함수이름(매개변수):
실행할 코드
return 반환값
def greet(name):
return "안녕, " + name + "!"
result = greet("지민")
print(result) # 안녕, 지민!
DRY 원칙 — 반복하지 마라¶
# 나쁜 예: 같은 코드가 반복됨
print("환영합니다, 지민님!")
print("환영합니다, 수지님!")
print("환영합니다, 태민님!")
# 좋은 예: 함수로 묶음
def welcome(name):
print(f"환영합니다, {name}님!")
welcome("지민")
welcome("수지")
welcome("태민")
DRY = Don't Repeat Yourself — 같은 코드를 두 번 쓰지 마세요.
함수 실행 과정¶
함수가 호출될 때 파이썬은 4단계를 거칩니다.
1. 인수(argument) 평가
2. 새 네임스페이스(namespace) 생성
3. 매개변수에 값 전달
4. 함수 본문 실행
def add(a, b):
total = a + b
return total
result = add(3, 5)
print(result) # 8
호출: add(3, 5)
→ a = 3, b = 5 (새 네임스페이스)
→ total = 8
→ return 8
result = 8
지역 변수와 전역 변수 — 스코프¶
함수 안에서 만든 변수는 함수 밖에서 보이지 않습니다.
x = 10 # 전역 변수 (global)
def f():
y = 20 # 지역 변수 (local)
print(x) # 전역 변수는 함수 안에서 읽을 수 있음
print(y)
f()
# print(y) # 오류! y는 함수 밖에서 접근 불가
10
20
| 지역 변수 | 전역 변수 | |
|---|---|---|
| 정의 위치 | 함수 안 | 함수 밖 |
| 접근 범위 | 해당 함수 안에서만 | 어디서든 읽기 가능 |
| 생존 시간 | 함수 실행 중에만 | 프로그램이 끝날 때까지 |
global 키워드¶
함수 안에서 전역 변수를 수정하려면 global을 선언해야 합니다.
count = 0
def increment():
global count # count는 전역 변수임을 선언
count += 1
increment()
increment()
print(count) # 2
global 없이 수정하면 UnboundLocalError가 발생합니다.
count = 0
def bad_increment():
count += 1 # 오류! local variable referenced before assignment
bad_increment()
return값이 없을 때 — None¶
return을 쓰지 않거나 return만 쓰면 함수는 None을 반환합니다.
def say_hello():
print("Hello!")
result = say_hello()
print(result) # None
Hello!
None
None은 "아무것도 없음"을 나타내는 파이썬의 특별한 값입니다.
print(type(None)) # <class 'NoneType'>
print(None == 0) # False
print(None == "") # False
매개변수와 인수¶
| 용어 | 위치 | 예시 |
|---|---|---|
| 매개변수(parameter) | 함수 정의 | def greet(name): 의 name |
| 인수(argument) | 함수 호출 | greet("Alice") 의 "Alice" |
def bmi(height, weight): # height, weight: 매개변수
return weight / (height ** 2)
result = bmi(1.70, 80) # 1.70, 80: 인수
print(round(result, 1)) # 27.7
기본값(default value)¶
매개변수에 기본값을 줄 수 있습니다.
def greet(name, lang="ko"):
if lang == "ko":
return f"안녕, {name}!"
else:
return f"Hello, {name}!"
print(greet("지민")) # 안녕, 지민! (lang 생략 → 기본값 "ko")
print(greet("Alice", "en")) # Hello, Alice!
실습 미션¶
미션 1: 섭씨 ↔ 화씨 변환¶
def celsius_to_fahrenheit(c):
# 공식: F = C × 9/5 + 32
pass
def fahrenheit_to_celsius(f):
# 공식: C = (F - 32) × 5/9
pass
print(celsius_to_fahrenheit(0)) # 32.0
print(celsius_to_fahrenheit(100)) # 212.0
print(fahrenheit_to_celsius(98.6)) # 37.0
미션 2: 최대공약수 (GCD)¶
def gcd(a, b):
# 유클리드 알고리즘으로 최대공약수를 구하세요
# while b != 0:
# a, b = b, a % b
pass
print(gcd(48, 18)) # 6
print(gcd(100, 75)) # 25
미션 3: 숫자 유효성 검사¶
def is_valid_score(score):
# 0~100 사이이면 True, 아니면 False를 반환하세요
pass
print(is_valid_score(85)) # True
print(is_valid_score(-1)) # False
print(is_valid_score(101)) # False
미션 4: 여러 값 반환¶
import math
def circle_info(r):
# 반지름 r을 받아 (둘레, 넓이)를 tuple로 반환하세요
# 둘레 = 2πr, 넓이 = πr²
pass
circumference, area = circle_info(5)
print(round(circumference, 2)) # 31.42
print(round(area, 2)) # 78.54
미션 5 (심화): 재귀 함수¶
def factorial(n):
# n! = n × (n-1) × ... × 1
# 재귀로 구현하세요
pass
print(factorial(5)) # 120
print(factorial(0)) # 1
핵심 요약¶
| 개념 | 설명 |
|---|---|
def 이름(매개변수): |
함수 정의 |
return 값 |
값을 반환하고 함수 종료 |
| 내장 함수 | abs(), len(), min(), max() 등 — import 불필요 |
import |
표준/외부 라이브러리 불러오기 |
| 지역 변수 | 함수 안에서만 존재 |
| 전역 변수 | 함수 밖, 프로그램 전체에서 접근 |
global |
함수 안에서 전역 변수 수정 허용 |
None |
return이 없을 때 반환되는 값 |
| 매개변수 | 함수 정의 시 이름 붙인 입력 |
| 인수 | 함수 호출 시 전달하는 실제 값 |
| DRY | Don't Repeat Yourself — 반복을 함수로 줄임 |