Part 1: 수학 공부를 위한 파이썬 첫걸음
Chapter 6: 코드를 재사용하는 마법 (The Magic of Reusable Code - Functions)
학습 목표
- 동일하거나 유사한 작업을 수행하는 코드 블록을 함수(Function)로 정의할 수 있다.
- 함수를 정의할 때
def
키워드를 사용하고, 함수를 실행할 때 함수 이름을 호출하는 방법을 이해한다. - 함수에 값을 전달하는 매개변수(Parameter)와 함수가 결과를 반환하는
return
문의 역할을 이해한다. - 함수를 사용하여 코드를 더 간결하고, 재사용 가능하며, 이해하기 쉽게 만들 수 있다는 장점을 안다.
- (선택) 함수 설명문(Docstring)을 작성하여 함수의 기능을 설명할 수 있다.
1. 똑같은 코드를 또? 함수로 만들자!
프로그래밍을 하다 보면 특정 작업을 여러 곳에서 반복적으로 수행해야 할 때가 많습니다. 예를 들어, 두 점 사이의 거리를 구하는 계산이나, 특정 조건에 따라 값을 판별하는 로직 등이 그렇습니다. 이런 코드를 필요할 때마다 복사해서 붙여넣는다면 코드가 길어지고, 나중에 수정할 일이 생겼을 때 모든 부분을 찾아 고쳐야 하는 불편함이 생깁니다.
함수(Function)는 이렇게 특정 작업을 수행하는 코드 블록에 이름을 붙여놓고, 필요할 때마다 그 이름만 불러서 실행할 수 있게 해주는 마법 같은 도구입니다. 함수를 사용하면 다음과 같은 장점이 있습니다.
- 재사용성: 한 번 만들어두면 어디서든 필요할 때 호출하여 사용할 수 있습니다.
- 간결성: 반복되는 코드가 줄어들어 전체 코드가 짧고 깔끔해집니다.
- 가독성: 함수 이름만 보고도 어떤 작업을 하는 코드인지 쉽게 파악할 수 있습니다. (이름을 잘 짓는 것이 중요!)
- 유지보수: 특정 기능에 수정이 필요할 때 해당 함수만 고치면 되므로 관리가 용이합니다.
우리는 이미 print()
, len()
, input()
, range()
등 파이썬에 내장된 함수들을 사용해왔습니다. 이제 우리 스스로 필요한 함수를 직접 만들어 사용하는 방법을 배워봅시다!
2. 나만의 함수 만들기: def
와 return
파이썬에서 함수를 만드는 것을 함수 정의(Function Definition)라고 하며, def
키워드를 사용합니다.
def 함수이름(매개변수1, 매개변수2, ...):
"""함수 설명문 (Docstring - 선택 사항)"""
# 함수가 수행할 코드 블록 (반드시 들여쓰기!)
# ...
return 결과값
def
: 함수 정의를 시작한다는 키워드입니다.함수이름
: 함수를 호출할 때 사용할 이름입니다. 변수 이름 규칙과 동일하며, 함수의 기능을 잘 나타내는 동사 형태로 짓는 것이 좋습니다 (예:calculate_area
,print_report
).매개변수(Parameter)
: 함수가 호출될 때 외부로부터 값을 전달받기 위한 변수들입니다. 괄호()
안에 콤마(,
)로 구분하여 적습니다. 매개변수가 필요 없으면 빈 괄호()
만 씁니다.- 콜론(
:
): 함수 정의부 끝을 나타냅니다. 함수 설명문(Docstring)
: 함수가 어떤 기능을 하는지, 매개변수는 무엇인지, 무엇을 반환하는지 등을 설명하는 문자열입니다. 큰따옴표 세 개("""Docstring"""
)로 감싸서 작성하며, 필수는 아니지만 작성하는 것이 좋은 습관입니다.함수 본문(Body)
: 함수가 실제로 수행할 코드를 들여쓰기하여 작성합니다.return 결과값
: 함수가 작업을 수행한 후 호출한 곳으로 돌려줄 값(결과)입니다.return
문이 실행되면 함수는 즉시 종료되고결과값
을 반환합니다. 결과값을 돌려줄 필요가 없는 함수는return
문을 생략할 수 있으며, 이 경우 함수는None
이라는 특별한 값을 반환합니다.
함수 호출 (Function Call):
정의된 함수를 실행하려면 함수 이름과 함께 괄호 ()
안에 필요한 인자(Argument)를 넣어 호출합니다.
함수이름(인자1, 인자2, ...)
인자(Argument)
: 함수를 호출할 때 매개변수에 실제로 전달되는 값입니다. 매개변수의 순서와 개수에 맞게 전달해야 합니다.
예제 1: 간단한 인사 함수
# 함수 정의
def greet(name):
"""입력받은 이름에게 인사하는 함수"""
print(f"안녕하세요, {name}님!") # f-string 사용 (문자열 안에 변수 값 넣기)
# 함수 호출
greet("철수") # name 매개변수에 "철수"라는 인자가 전달됨
greet("영희")
실행 결과:
안녕하세요, 철수님!
안녕하세요, 영희님!
이 greet
함수는 결과를 반환하지 않으므로 return
문이 없습니다.
예제 2: 두 숫자를 더하는 함수 (결과 반환)
# 함수 정의
def add_numbers(a, b):
"""두 숫자 a와 b를 더한 결과를 반환하는 함수"""
sum_result = a + b
return sum_result # 계산된 합계를 반환
# 함수 호출 및 결과 사용
result1 = add_numbers(10, 5) # a에 10, b에 5가 전달됨. 함수는 15를 반환.
print(f"10 + 5 = {result1}")
result2 = add_numbers(-3, 8)
print(f"-3 + 8 = {result2}")
# 반환값을 바로 사용할 수도 있음
print(f"100 + 200 = {add_numbers(100, 200)}")
실행 결과:
10 + 5 = 15
-3 + 8 = 5
100 + 200 = 300
이 add_numbers
함수는 return
문을 사용하여 계산 결과를 호출한 곳으로 돌려줍니다. 반환된 값은 변수에 저장하거나 다른 계산에 바로 사용할 수 있습니다.
3. 함수로 수학 공식 구현하기
함수는 수학 공식을 코드로 구현하고 재사용하는 데 매우 유용합니다.
예제 3: 원의 넓이 계산 함수
import math # math.pi 사용 위해 import
def circle_area(radius):
"""반지름 radius를 입력받아 원의 넓이를 계산하여 반환"""
if radius < 0:
print("오류: 반지름은 음수가 될 수 없습니다.")
return None # 오류 발생 시 None 반환
area = math.pi * radius**2
return area
# 함수 호출
area1 = circle_area(5)
if area1 is not None: # 반환값이 None이 아닐 때만 출력
print(f"반지름 5인 원의 넓이: {area1:.4f}")
area2 = circle_area(10)
if area2 is not None:
print(f"반지름 10인 원의 넓이: {area2:.4f}")
area_invalid = circle_area(-3) # 오류 메시지 출력됨
print(f"잘못된 반지름 입력 결과: {area_invalid}")
예제 4: 두 점 사이의 거리 계산 함수 (Chapter 9에서 다시 활용)
import math
def distance_between_points(x1, y1, x2, y2):
"""두 점 (x1, y1)과 (x2, y2) 사이의 거리를 계산하여 반환"""
dx = x2 - x1
dy = y2 - y1
distance_sq = dx**2 + dy**2
return math.sqrt(distance_sq)
# 함수 호출
p1_x, p1_y = 1, 2
p2_x, p2_y = 4, 6
dist = distance_between_points(p1_x, p1_y, p2_x, p2_y)
print(f"점 ({p1_x}, {p1_y})와 점 ({p2_x}, {p2_y}) 사이의 거리: {dist:.4f}") # 피타고라스 정리: 3^2 + 4^2 = 5^2 -> 거리 5
4. 왜 함수를 사용할까? 정리
함수를 사용하는 것은 좋은 프로그래밍 습관의 핵심입니다.
- 코드 재사용: 같은 계산 로직을 여러 번 작성할 필요가 없습니다.
- 가독성 향상:
calculate_distance()
같은 이름은 그 코드가 무엇을 하는지 명확히 알려줍니다. - 구조화: 복잡한 문제를 여러 개의 작은 함수로 나누어 해결하면 전체 구조를 파악하기 쉽습니다.
- 테스트 용이성: 각 함수가 올바르게 작동하는지 독립적으로 테스트하기 쉽습니다.
- 협업: 여러 사람이 각자 맡은 함수를 개발하여 협업하기 좋습니다.
앞으로 더 복잡한 수학 문제를 파이썬으로 해결할 때, 함수는 여러분의 가장 강력한 무기 중 하나가 될 것입니다.
직접 해보기 (Follow Along Exercise)
섭씨 온도(Celsius)를 화씨 온도(Fahrenheit)로 변환하는 함수 celsius_to_fahrenheit(celsius)
를 만들어보세요. 변환 공식은 F = (9/5) * C + 32
입니다. 함수를 정의한 후, 섭씨 0도, 25도, 100도를 각각 화씨로 변환하여 출력해보세요.
# 직접 함수를 정의하고 호출해보세요!
def celsius_to_fahrenheit(celsius):
"""섭씨 온도를 화씨 온도로 변환하여 반환"""
fahrenheit = (9/5) * celsius + 32
return fahrenheit
# 함수 호출 및 결과 출력
f0 = celsius_to_fahrenheit(0)
print(f"섭씨 0도는 화씨 {f0}도 입니다.")
f25 = celsius_to_fahrenheit(25)
print(f"섭씨 25도는 화씨 {f25}도 입니다.")
f100 = celsius_to_fahrenheit(100)
print(f"섭씨 100도는 화씨 {f100}도 입니다.")
연습 문제
- 정수 하나를 매개변수로 받아, 그 수가 짝수이면
True
를, 홀수이면False
를 반환하는 함수is_even(number)
를 정의하고 테스트해보세요. (%
연산자 활용) - 밑변(base)과 높이(height)를 매개변수로 받아 삼각형의 넓이를 계산하여 반환하는 함수
triangle_area(base, height)
를 정의하고 테스트해보세요. - 세 개의 숫자
a, b, c
를 매개변수로 받아 그중 가장 큰 수를 찾아 반환하는 함수find_max(a, b, c)
를 정의하고 테스트해보세요. (if-elif-else
문 활용,max()
내장 함수는 사용하지 말 것) - (심화) 정수
n
을 매개변수로 받아 1부터n
까지의 합계를 계산하여 반환하는 함수sum_up_to_n(n)
을for
반복문을 사용하여 정의하고 테스트해보세요.
이것으로 Part 1 (Chapter 1~6)의 상세 내용이 끝났습니다. 이 내용들을 바탕으로 학생들이 파이썬 기초를 탄탄히 다지고, 이를 수학 문제 해결에 적용하는 첫걸음을 뗄 수 있기를 바랍니다.
COMMENTS