Type something to search...

5회차: 함수(Function)

5회차: 함수(Function)

선수 학습: 4회차 (반복문)


학습 목표

  • 함수(Function)의 개념과 필요성을 이해한다.
  • def(데프)로 함수를 정의하고 호출할 수 있다.
  • 매개변수(Parameter)와 반환값(Return Value)을 활용할 수 있다.
  • 지역변수(Local Variable)와 전역변수(Global Variable)를 이해한다.

5.1. 함수란?

5.1.1. 함수의 개념

함수(Function)는 특정 작업을 수행하는 코드 묶음이다. 한 번 정의해두면 필요할 때마다 이름만 불러서 실행할 수 있다.

일상의 예를 들면, 세탁기를 생각할 수 있다. 세탁기의 “표준 세탁” 버튼을 누르면 물 넣기 → 세제 투입 → 세탁 → 헹굼 → 탈수까지 모든 과정이 자동으로 실행된다. 매번 모든 단계를 수동으로 할 필요가 없다. 파이썬의 함수도 마찬가지이다.

5.1.2. 함수가 없을 때의 문제점

친구 3명의 점수를 평균 계산하는 코드를 함수 없이 작성한다고 가정한다.

1
# 홍길동 성적
2
s1 = 80
3
s2 = 90
4
s3 = 70
5
avg = (s1 + s2 + s3) / 3
6
print(f"홍길동 평균: {avg:.1f}")
7
8
# 김영희 성적
9
s1 = 95
10
s2 = 85
11
s3 = 75
12
avg = (s1 + s2 + s3) / 3
13
print(f"김영희 평균: {avg:.1f}")
14
15
# 이철수 성적
16
s1 = 60
17
s2 = 70
18
s3 = 65
19
avg = (s1 + s2 + s3) / 3
20
print(f"이철수 평균: {avg:.1f}")

위 코드는 같은 계산 구조가 3번 반복된다. 만약 평균 계산 방식을 바꾸고 싶다면 3곳을 모두 수정해야 한다. 함수를 사용하면 이 문제를 해결할 수 있다.


5.2. 함수 정의와 호출

5.2.1. 함수 만들기 — def(데프)

def 키워드로 함수를 정의한다.

1
def 함수이름():
2
실행할 코드

5.2.2. 함수 정의와 호출 예시

1
def greet():
2
print("안녕하세요!")
3
print("파이썬 수업에 오신 것을 환영합니다.")
4
5
greet()
6
greet()
7
greet()
설명
1def 키워드 뒤에 함수 이름 greet 를 쓰고 괄호 () 와 콜론 : 으로 마친다.
2~3함수가 호출될 때 실행될 코드를 들여쓰기하여 작성한다. 이 부분을 함수 본문(Body) 이라 한다.
5~7greet() 처럼 함수 이름 뒤에 () 를 붙이면 함수를 호출(Call) 한다. 3번 호출했으므로 함수 본문이 3번 실행된다.

실행 결과

1
안녕하세요!
2
파이썬 수업에 오신 것을 환영합니다.
3
안녕하세요!
4
파이썬 수업에 오신 것을 환영합니다.
5
안녕하세요!
6
파이썬 수업에 오신 것을 환영합니다.

참고

함수는 정의만 해도 실행되지 않는다. 반드시 호출해야 실행된다. 함수를 정의하는 것은 레시피를 작성하는 것이고, 호출하는 것은 그 레시피대로 실제로 요리하는 것이다.


5.3. 매개변수(Parameter)와 인수(Argument)

5.3.1. 매개변수란?

함수를 호출할 때 외부에서 값을 전달받을 수 있다. 이 값을 받기 위해 함수 괄호 안에 선언하는 변수를 매개변수(Parameter) 라 한다.

1
def greet(name):
2
print(f"안녕하세요, {name}님!")
3
4
greet("홍길동")
5
greet("김영희")
6
greet("이철수")
설명
1함수 괄호 안의 name 이 매개변수이다. 함수 안에서만 사용할 수 있는 변수이다.
2매개변수 name 을 f-string 안에서 사용한다.
4"홍길동" 을 전달하여 호출한다. 함수 안에서 name = "홍길동" 이 된다.
5"김영희" 를 전달하여 호출한다. name = "김영희" 가 된다.
6"이철수" 를 전달하여 호출한다. name = "이철수" 가 된다.

실행 결과

1
안녕하세요, 홍길동님!
2
안녕하세요, 김영희님!
3
안녕하세요, 이철수님!

호출할 때 전달하는 값 "홍길동", "김영희", "이철수"인수(Argument) 라 한다.

5.3.2. 여러 개의 매개변수

매개변수는 쉼표(,)로 구분하여 여러 개를 사용할 수 있다.

1
def intro(name, job, lv):
2
print(f"이름: {name} | 직업: {job} | 레벨: {lv}")
3
4
intro("홍길동", "전사", 30)
5
intro("김영희", "마법사", 25)
설명
1세 개의 매개변수를 쉼표로 구분하여 선언한다.
4세 인수를 순서대로 전달한다. name="홍길동", job="전사", lv=30 이 된다.

실행 결과

1
이름: 홍길동 | 직업: 전사 | 레벨: 30
2
이름: 김영희 | 직업: 마법사 | 레벨: 25

5.4. 반환값(Return Value)

5.4.1. return이란?

return 키워드는 함수 실행 결과를 호출한 곳으로 돌려보낸다.

지금까지 함수 안에서 print() 로 출력만 했다. 하지만 계산 결과를 다른 변수에 저장하거나 다른 계산에 사용하려면 return 으로 값을 반환해야 한다.

5.4.2. return 기본 사용법

1
def add(a, b):
2
result = a + b
3
return result
4
5
x = add(10, 20)
6
print(x)
7
print(add(5, 7))
8
print(add(3, 4) + add(1, 2))
설명
1두 개의 매개변수 a, b 를 받는 함수를 정의한다.
2a + b 의 결과를 result 에 저장한다.
3return resultresult 값을 호출한 곳으로 돌려보낸다.
5add(10, 20)30 을 반환한다. 이 값이 x 에 저장된다.
6x 의 값 30 을 출력한다.
7add(5, 7)12 를 반환한다. 이 반환값이 바로 print() 에 전달된다.
8add(3, 4)7, add(1, 2)3 을 반환한다. 7 + 3 = 10 을 출력한다.

실행 결과

1
30
2
12
3
10

5.4.3. print 와 return 의 차이

1
def calc_print(a, b):
2
print(a + b) # 화면에 출력만 한다. 값을 돌려주지 않는다.
3
4
def calc_return(a, b):
5
return a + b # 계산 결과를 돌려준다.
6
7
result1 = calc_print(3, 4)
8
result2 = calc_return(3, 4)
9
10
print("calc_print 반환값:", result1)
11
print("calc_return 반환값:", result2)
설명
7calc_print(3, 4)7 을 화면에 출력하지만, 아무것도 돌려주지 않는다. result1 에는 None 이 저장된다.
8calc_return(3, 4)7result2 에 저장한다.

실행 결과

1
7
2
calc_print 반환값: None
3
calc_return 반환값: 7

요약

계산 결과를 나중에 사용해야 한다면 return 을 사용한다. 단순히 출력만 하고 끝내려면 print 를 사용한다. 실무에서는 대부분 return 을 사용한다.

5.4.4. 여러 값 반환하기

return 뒤에 쉼표로 구분하면 여러 값을 한 번에 반환할 수 있다.

1
def min_max(nums):
2
return min(nums), max(nums)
3
4
scores = [85, 92, 78, 95, 60]
5
low, high = min_max(scores)
6
print(f"최저: {low}점, 최고: {high}점")
설명
2min(nums) 는 리스트에서 최솟값, max(nums) 는 최댓값을 반환하는 내장 함수이다. 두 값을 묶어서 반환한다.
5반환된 두 값을 low, high 두 변수에 나누어 저장한다.

실행 결과

1
최저: 60점, 최고: 95점

5.5. 기본값(Default) 매개변수

5.5.1. 기본값이란?

매개변수에 기본값을 미리 지정할 수 있다. 함수를 호출할 때 해당 인수를 전달하지 않으면 기본값이 사용된다.

1
def intro(name, job="모험가", lv=1):
2
print(f"이름: {name} | 직업: {job} | 레벨: {lv}")
3
4
intro("홍길동")
5
intro("김영희", "마법사")
6
intro("이철수", "전사", 50)
설명
1job 의 기본값은 "모험가", lv 의 기본값은 1 이다.
4name 만 전달했으므로 job="모험가", lv=1 이 사용된다.
5namejob 을 전달했으므로 lv=1 기본값이 사용된다.
6세 값 모두 전달했으므로 기본값이 사용되지 않는다.

실행 결과

1
이름: 홍길동 | 직업: 모험가 | 레벨: 1
2
이름: 김영희 | 직업: 마법사 | 레벨: 1
3
이름: 이철수 | 직업: 전사 | 레벨: 50

참고

기본값이 있는 매개변수는 반드시 기본값이 없는 매개변수보다 뒤에 위치해야 한다. def f(job="모험가", name): 처럼 쓰면 오류가 발생한다.


5.6. 지역변수(Local Variable)와 전역변수(Global Variable)

5.6.1. 지역변수

함수 안에서 만든 변수는 지역변수(Local Variable) 이다. 함수 안에서만 사용할 수 있으며 함수가 종료되면 사라진다.

1
def calc():
2
x = 100 # 지역변수
3
print("함수 안:", x)
4
5
calc()
6
# print(x) # ← 오류! 함수 밖에서는 x를 사용할 수 없다.
설명
2x = 100calc 함수 안에서 만들어진 지역변수이다.
3함수 안에서는 x 를 사용할 수 있다.
6주석 처리된 줄처럼 함수 밖에서 x 를 사용하면 NameError 오류가 발생한다.

5.6.2. 전역변수

함수 밖에서 만든 변수는 전역변수(Global Variable) 이다. 코드 어디서든 사용할 수 있다.

1
title = "파이썬 게임" # 전역변수
2
3
def show_title():
4
print(title) # 함수 안에서 전역변수 사용 가능
5
6
show_title()
7
print(title) # 함수 밖에서도 사용 가능

5.7. 종합 예제: 계산기 프로그램

1
def add(a, b):
2
return a + b
3
4
def sub(a, b):
5
return a - b
6
7
def mul(a, b):
8
return a * b
9
10
def div(a, b):
11
if b == 0:
12
return "0으로 나눌 수 없습니다."
13
return a / b
14
15
def calc(a, b, op):
16
if op == "+":
17
return add(a, b)
18
elif op == "-":
19
return sub(a, b)
20
elif op == "*":
21
return mul(a, b)
22
elif op == "/":
23
return div(a, b)
24
else:
25
return "알 수 없는 연산자입니다."
26
27
a = float(input("첫 번째 숫자: "))
28
b = float(input("두 번째 숫자: "))
29
op = input("연산자 (+, -, *, /): ")
30
31
result = calc(a, b, op)
32
print(f"결과: {result}")
설명
1~2더하기 함수. 두 수를 더한 결과를 반환한다.
4~5빼기 함수. 두 수를 뺀 결과를 반환한다.
7~8곱하기 함수. 두 수를 곱한 결과를 반환한다.
10~12나누기 함수. b 가 0이면 오류 문자열을 반환하고, 아니면 나눗셈 결과를 반환한다.
14~23연산자에 따라 알맞은 함수를 호출하여 결과를 반환하는 통합 계산 함수이다.
25~27사용자에게 두 숫자와 연산자를 입력받는다.
29~30calc() 함수를 호출하여 결과를 출력한다.

5.8. 실습 과제

과제 1. 섭씨-화씨 변환기

섭씨(℃)를 화씨(℉)로, 화씨를 섭씨로 변환하는 함수를 각각 만들고, 사용자에게 값을 입력받아 두 결과를 모두 출력한다.

  • 섭씨 → 화씨 공식: 화씨 = 섭씨 × 9 / 5 + 32
  • 화씨 → 섭씨 공식: 섭씨 = (화씨 - 32) × 5 / 9
1
def to_f(c):
2
return c * 9 / 5 + 32
3
4
def to_c(f):
5
return (f - 32) * 5 / 9
6
7
temp = float(input("섭씨 온도를 입력하세요: "))
8
f = to_f(temp)
9
c_back = to_c(f)
10
11
print(f"섭씨 {temp:.1f}℃ → 화씨 {f:.1f}℉")
12
print(f"화씨 {f:.1f}℉ → 섭씨 {c_back:.1f}℃")

과제 2. 평균 계산기 함수 개선

3개의 점수를 매개변수로 받아 평균을 반환하는 함수를 만들고, 함수를 3회 호출하여 각 학생의 평균을 출력한다.

1
def avg3(s1, s2, s3):
2
return (s1 + s2 + s3) / 3
3
4
print(f"홍길동 평균: {avg3(80, 90, 70):.1f}")
5
print(f"김영희 평균: {avg3(95, 85, 75):.1f}")
6
print(f"이철수 평균: {avg3(60, 70, 65):.1f}")