방송대 파이썬프로그래밍기초 7강: 함수의 호출·반환과 매개변수
함수는 코드를 짧게 만드는 문법을 넘어 입력과 결과의 경계를 세우는 도구입니다. 함수가 호출될 때 값과 실행 공간이 어떻게 이동하는지 추적하고, 반환값·지역변수·기본 매개변수·가변 매개변수를 목적에 맞게 설계합니다.
값만 바꿔 반복하는 코드는 함수의 신호다
반지름과 높이만 달리하여 원뿔의 부피를 여러 번 계산한다고 하자. 계산식을 매번 복사하면 변수 이름을 바꾸다 한 곳을 놓치거나, 공식을 수정할 때 모든 복사본을 고쳐야 한다. 반복되는 작업에 이름을 붙이고 달라지는 값만 외부에서 받으면 이런 문제를 줄일 수 있다.
함수는 특정 작업을 수행하는 명령문의 집합이다. 세부 계산을 함수 이름으로 대체하여 추상화하고, 유사한 문제에 재사용할 수 있게 만든다. 파이썬 내부에 이미 마련된 print(), input(), max(), int()는 내장 함수이고, 특정 목적에 맞게 def로 만드는 것은 사용자 정의 함수다.
함수화 판단: 같은 계산이 여러 곳에 반복되는가, 달라지는 값과 고정된 규칙을 분리할 수 있는가, 작업의 결과를 호출한 곳에서 다시 써야 하는가를 묻는다.
함수는 이름·입력·명령 블록·출력으로 읽는다
사용자 정의 함수의 기본 구조는 다음과 같다. 함수 이름은 식별자이며, 괄호 안의 매개변수 목록은 함수가 받을 값을 선언한다. 콜론 다음에 들여쓴 명령 블록이 함수의 실제 작업이다.
def cone_volume(radius, height):
volume = 1 / 3 * 3.14 * radius ** 2 * height
return volume
| 요소 | 코드 | 역할 |
|---|---|---|
| 함수 이름 | cone_volume | 작업을 호출할 수 있는 이름 |
| 형식 매개변수 | radius, height | 호출 시 전달될 값을 받을 지역 이름 |
| 명령 블록 | 들여쓴 계산문 | 입력을 사용하여 함수의 작업 수행 |
| 반환 | return volume | 결과를 호출한 위치로 전달하고 함수 종료 |
함수를 정의하는 것과 실행하는 것은 다르다. def 문은 작업 방법을 등록하고, cone_volume(3, 4)처럼 호출해야 명령 블록이 실행된다. 정의만 해 놓고 결과가 나오지 않는다면 호출이 있는지 먼저 확인한다.
호출 순간에는 인자가 매개변수에 연결되고 별도 실행 공간이 생긴다
매개변수(parameter)는 함수 정의에서 값을 받을 이름이고, 인자(argument)는 호출할 때 실제로 전달하는 값이다. 다음 호출에서 radius와 height는 형식 매개변수, 3과 4는 인자다.
result = cone_volume(3, 4)
print(result)
- 호출: 프로그램이
cone_volume(3, 4)를 만난다. - 값 전달: 3은
radius, 4는height에 위치대로 연결된다. - 함수 공간 생성: 매개변수와
volume같은 지역변수를 위한 실행 공간이 생긴다. - 명령 실행: 함수 블록이 위에서 아래로 실행되어
volume=37.68이 된다. - 반환과 복귀:
return값이 호출 위치로 전달되고, 함수 실행은 끝난다. - 호출부 계속: 반환값이
result에 저장되고 다음 출력문으로 진행한다.
위치가 기준이므로 cone_volume(4, 3)은 반지름 4, 높이 3으로 해석된다. 두 수의 타입이 같아도 역할이 다르므로, 호출부에서 순서를 바꾸면 실행은 되지만 다른 계산이 되는 의미 오류가 생길 수 있다.
호출 원장: 호출마다 ‘인자→매개변수 연결’, ‘지역변수 변화’, ‘반환값’, ‘호출 뒤 저장 위치’를 한 줄씩 기록하면 중첩된 코드도 실행 흐름을 재현할 수 있다.
출력하는 함수와 반환하는 함수는 결과의 사용처가 다르다
반환값이 없는 함수는 내부 작업을 수행한 뒤 종료한다. 예를 들어 계산 결과를 즉시 화면에 보여 주는 함수는 print()로 목적을 끝낼 수 있다.
def print_cone_volume(radius, height):
if radius > 0 and height > 0:
volume = 1 / 3 * 3.14 * radius ** 2 * height
print("원뿔의 부피는", volume, "입니다.")
else:
print("반지름과 높이에 양수를 입력하세요")
반환값이 있는 함수는 계산 결과를 호출한 곳으로 넘긴다. 호출부가 값을 출력할지, 형식을 바꿀지, 다른 계산에 사용할지 결정할 수 있어 재사용성이 높다.
def get_cone_volume(radius, height):
if radius > 0 and height > 0:
return 1 / 3 * 3.14 * radius ** 2 * height
return -1
volume = get_cone_volume(3, 4)
print(format(volume, ">10.3f"))
return을 만나면 값이 전달되는 동시에 함수가 즉시 종료된다. 잘못된 입력에 -1을 반환하는 것은 호출부가 실패를 구분하게 하는 약속이다. 정상적인 부피는 양수라는 조건이 있으므로 이 약속이 모호하지 않다.
선택 기준: 함수의 임무가 ‘지금 화면에 안내’라면 출력형을, 결과를 저장·비교·형식화하거나 다른 계산에 이어 쓸 가능성이 있다면 반환형을 우선 검토한다.
여러 결과는 함께 반환하고 호출부에서 같은 개수로 받는다
원뿔의 부피와 겉넓이를 모두 필요로 한다면 한 번의 함수 호출에서 두 결과를 반환할 수 있다. 반지름이나 높이가 양수가 아니면 두 결과 모두 실패를 뜻하도록 -1, -1을 반환한다.
def cone_volume_surface(radius, height):
if radius > 0 and height > 0:
slant = (radius ** 2 + height ** 2) ** 0.5
volume = 1 / 3 * 3.14 * radius ** 2 * height
surface = 3.14 * radius ** 2 + 3.14 * radius * slant
return volume, surface
return -1, -1
volume, surface = cone_volume_surface(3, 4)
print(volume, surface)
반지름 3, 높이 4이면 빗면은 5, 부피는 37.68, 겉넓이는 75.36이다. 반환 순서가 volume, surface이므로 호출부도 같은 순서로 받아야 한다. surface, volume = ...처럼 이름만 바꾸면 오류 메시지는 없지만 두 값의 의미가 뒤바뀐다.
지역변수는 함수 안에서 살고 전역변수는 프로그램 공간에 남는다
변수의 스코프(scope)는 그 변수를 참조할 수 있는 영역이다. 함수 밖에서 선언한 전역변수는 프로그램의 넓은 영역에서 접근할 수 있고, 함수 안에서 새로 만든 지역변수는 원칙적으로 그 함수 안에서만 접근할 수 있다.
x = 1
def increase(x):
x = x + 1
print("함수 안:", x)
increase(x)
print("함수 밖:", x)
호출 시 전역 공간의 값 1이 형식 매개변수 x에 전달된다. 함수 안의 x는 2가 되어 출력되지만 함수 밖 x는 여전히 1이다. 같은 이름을 사용해도 두 실행 공간의 변수 역할은 다르기 때문이다.
함수 안에서 만든 다른 지역변수를 함수 밖에서 바로 출력하면 참조할 수 없다. 필요한 결과는 return으로 함수 경계를 넘어 전달해야 한다. 이 원칙은 함수가 외부 상태를 예기치 않게 바꾸는 일을 줄여 준다.
오개념 교정: 인자로 변수를 넘겼다는 사실만으로 함수 안의 재할당이 호출부 변수까지 바꾸지는 않는다. 호출 전후의 값을 따로 기록하고, 외부에서 쓸 변화는 반환값으로 받는다.
동시 할당은 여러 값의 배치와 교환을 한 문장으로 표현한다
여러 변수에 값을 동시에 할당할 때는 왼쪽 변수 개수와 오른쪽 값 개수를 맞춰 쉼표로 나열한다.
temperature, season = 27, "summer"
radius, height = height, radius
첫 줄은 27과 "summer"를 위치에 따라 두 변수에 연결한다. 둘째 줄은 오른쪽의 기존 height와 radius 값을 먼저 준비한 뒤 왼쪽에 배치하므로 임시변수 없이 두 값을 교환한다.
학습용 정렬 함수에서는 비교와 교환을 결합할 수 있다. 세 수를 오름차순으로 만드는 과정은 첫째·둘째, 둘째·셋째, 다시 첫째·둘째를 비교하는 세 단계다.
def sort_three(a, b, c):
if a > b:
a, b = b, a
if b > c:
b, c = c, b
if a > b:
a, b = b, a
return a, b, c
low, middle, high = sort_three(59, 1, 103)
print(low, middle, high, sep=", ")
상태는 (59, 1, 103) → (1, 59, 103) → 변화 없음 → 변화 없음으로 진행되어 1, 59, 103이 출력된다. 입력이 (3, 2, 1)이면 첫 두 단계 뒤 (2, 1, 3)이므로 마지막 비교가 꼭 필요하다.
기본 매개변수와 가변 매개변수는 호출 인터페이스를 넓힌다
기본 매개변수는 호출 때 인자가 생략되면 정의에 적힌 기본값을 받는다. 일반 매개변수가 먼저, 기본값이 있는 매개변수가 뒤에 와야 한다.
def hello(name, message="반갑습니다"):
print(name, message)
hello("민준")
hello("서연", "환영합니다")
첫 호출은 기본 메시지를, 둘째 호출은 전달한 메시지를 사용한다. 필수 입력과 선택 입력의 경계를 함수 정의에 드러내는 방식이다.
가변 매개변수는 호출할 때 사용자가 필요한 개수만큼 인자를 전달하게 한다. 이름 앞에 *를 붙이며 한 함수에서 하나만 사용한다. 일반 매개변수가 있다면 그 뒤에 둔다.
def sum_average(*numbers):
total = 0
for number in numbers:
total += number
return total, total / len(numbers)
total, average = sum_average(20, 25, 10, 85, 100, 150)
print(total, average)
여섯 수의 합은 390, 평균은 65다. 입력 개수가 호출마다 달라질 수 있다는 장점이 있지만, 아무 인자도 전달하지 않으면 len(numbers)가 0이 되어 나눗셈 오류가 생긴다. 가변 입력을 설계할 때 허용할 최소 개수도 함께 정해야 한다.
format()은 반환된 실수를 폭·정렬·정밀도에 맞춰 표현한다
함수가 계산을 담당하고 호출부가 표현을 담당하면 같은 결과를 상황에 따라 다르게 보여 줄 수 있다. format(값, 형식 지정자)에서 >는 오른쪽 정렬, 10은 전체 필드 폭, .3은 소수점 이하 자릿수, f는 실수 형식을 뜻한다.
value = 3.141592
print("|" + format(value, ">10.3f") + "|")
수치는 소수점 셋째 자리까지 반올림되어 3.142가 되고, 폭 10칸 안에서 오른쪽에 놓인다. 계산 함수 안에 출력 폭을 고정하지 않으면 표, 보고서, 화면 안내 등 여러 출력 요구에 같은 함수를 재사용할 수 있다.
함수 설계는 계약·공간·복귀의 세 축으로 점검한다
- 계약: 어떤 인자를 몇 개 받고, 각 값이 어떤 의미와 조건을 가지는가?
- 공간: 매개변수와 지역변수가 함수 안에서 어떻게 변하며 외부 상태와 분리되는가?
- 복귀: 무엇을 몇 개 어떤 순서로 반환하며, 호출부는 그 값을 어디에 저장하고 어떻게 사용하는가?
함수가 예상과 다르게 동작하면 호출식의 인자 순서, 함수 안의 지역 상태, return 도달 여부, 호출부의 반환값 배치 순으로 확인한다. 그다음 기본값이 의도치 않게 사용됐는지, 가변 인자의 개수가 유효한지 점검하면 오류 범위를 빠르게 좁힐 수 있다.
함수 완성 기준: 이름만 보고 작업을 짐작할 수 있고, 입력 조건과 실패 결과가 분명하며, 호출부가 내부 계산을 몰라도 반환값을 올바르게 사용할 수 있어야 한다.
핵심 개념 정리
- 함수는 특정 작업을 이름으로 추상화하여 반복을 줄이고 유사한 문제에 재사용하게 한다.
def는 함수를 정의하고, 호출식은 인자를 형식 매개변수에 연결해 명령 블록을 실행한다.- 호출 때 별도 함수 공간이 생기며 지역변수는 그 공간에서만 접근할 수 있다.
- 출력형 함수는 화면 표시로 작업을 끝내고, 반환형 함수는 결과를 호출부의 다음 처리로 넘긴다.
return은 값을 전달하는 동시에 함수를 종료하며 여러 값도 정해진 순서로 반환할 수 있다.- 동시 할당은 여러 값을 위치대로 배치하며
a, b = b, a로 두 값을 교환할 수 있다. - 기본 매개변수는 생략된 인자에 기본값을 제공하고, 가변 매개변수는 호출마다 다른 개수의 값을 받는다.
- 계산과 출력 형식을 분리하면
format()을 이용해 같은 반환값을 다양한 형태로 재사용할 수 있다.
함수 문제를 풀 때는 정의와 호출을 먼저 구분하고 인자를 매개변수에 위치대로 연결한다. 호출마다 생긴 지역 공간에서 값을 한 줄씩 추적한 뒤 return이 어느 값과 시점에 실행되는지 확인한다. 마지막으로 호출부가 반환값의 개수와 순서를 맞게 받는지, 기본값과 가변 입력의 조건을 지켰는지 점검하면 함수의 전체 수명주기를 재현할 수 있다.
예상문제 10선
1. 함수를 사용하는 주된 목적을 가장 잘 설명한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
- ① 오답: 지역변수는 함수 실행 공간에 제한되어 외부 상태와 분리된다.
- ② 오답: 정의는 작업을 등록할 뿐 실제 실행에는 호출이 필요하다.
- ③ 정답: 반복되는 작업을 명명하고 입력을 바꿔 재사용하는 추상화의 목적이다.
- ④ 오답: 좋은 함수는 입력과 출력의 계약을 분명히 한다.
2. def cone_volume(radius, height):와 cone_volume(3, 4)의 용어 연결로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
- ① 오답: 정의에서 값을 받을 이름과 호출에서 전달할 값을 반대로 연결했다.
- ② 오답: 숫자는 호출 인자이고 매개변수는 함수의 지역 이름이다.
- ③ 오답: 괄호 안 두 이름이 모두 매개변수이며 반환값은
return으로 정한다. - ④ 정답: 정의의 입력 자리와 호출의 실제 값을 정확히 구분한다.
3. 반환값이 있는 함수의 호출 흐름으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
- ① 정답: 호출에서 복귀까지 값과 제어가 이동하는 순서를 재현한다.
- ② 오답: 반환은 정의와 호출·실행 뒤에 일어난다.
- ③ 오답: 함수 공간과 지역변수는 호출 뒤 만들어지고 실행 종료 때 사라진다.
- ④ 오답: 호출부의 다음 명령은 함수가 반환한 뒤 계속된다.
4. 계산 결과를 저장한 뒤 표 형식으로도 출력하고 다른 계산에도 쓰려 한다. 가장 알맞은 함수 설계는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
- ① 오답: 고정 출력만 하면 호출부가 결과를 재사용하기 어렵다.
- ② 정답: 계산과 표현을 분리하여 하나의 결과를 여러 목적에 사용할 수 있다.
- ③ 오답: 지역변수는 함수 밖에서 직접 접근할 수 없으므로 반환해야 한다.
- ④ 오답: 정의 복사는 중복을 늘려 함수화의 목적을 훼손한다.
5. 다음 코드의 출력 순서로 옳은 것은?
x = 1
def increase(x):
x = x + 1
print(x)
increase(x)
print(x)
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
- ① 오답: 함수 안 지역 매개변수는 1을 받아 2로 재할당된다.
- ② 오답: 함수 안 출력이 먼저이며 외부
x는 바뀌지 않는다. - ③ 오답: 지역
x의 재할당을 전역x의 변경으로 혼동했다. - ④ 정답: 함수 공간에서는 2, 호출 뒤 전역 공간에서는 기존 값 1이 출력된다.
6. return에 관한 설명으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
- ① 오답: 화면 표시는
print()의 역할이며return뒤 명령은 실행되지 않는다. - ② 오답: 반환은 값을 전달할 뿐 변수의 스코프를 전역으로 바꾸지 않는다.
- ③ 정답: 값 전달과 즉시 종료라는 두 역할을 모두 포함한다.
- ④ 오답: 인자 개수는 매개변수 정의와 호출 방식으로 정한다.
7. sort_three(3, 2, 1)에서 본문의 세 비교·교환을 모두 수행한 반환값은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
- ① 정답:
(3,2,1)→(2,3,1)→(2,1,3)→(1,2,3)으로 변한다. - ② 오답: 두 번째 교환 뒤 마지막 첫째·둘째 비교를 생략한 상태다.
- ③ 오답: 첫 번째 교환만 수행한 중간 상태다.
- ④ 오답: 필요한 교환을 하나도 적용하지 않은 입력 상태다.
8. 기본 매개변수와 가변 매개변수의 차이를 바르게 설명한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
- ① 오답: 가변 매개변수의 목적은 인자 개수를 유동적으로 받는 것이다.
- ② 오답: 두 개념은 스코프 변환이 아니라 함수 호출 인터페이스에 관한 것이다.
- ③ 오답: 반환 여부는
return으로 정하며 두 매개변수 종류와 별개다. - ④ 정답: 생략된 값 처리와 가변 개수 입력이라는 차이를 정확히 구분한다.
9. format(3.141592, ">10.3f")의 형식 지정 의미로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
- ① 오답:
>는 오른쪽 정렬이고 10이 전체 폭이다. - ② 정답: 네 요소의 의미를 순서대로 정확히 해석했다.
- ③ 오답: 가운데 정렬 기호가 아니며
f는 실수 형식이다. - ④ 오답: 폭과 정밀도를 뒤바꾸었고 문자열 형식으로 해석했다.
10. 합과 평균을 구하는 가변 매개변수 함수의 안전성을 높이는 방법으로 가장 적절한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
- ① 오답: 빈 입력이면 개수 0으로 나누는 실행 오류가 생긴다.
- ② 오답: 지역변수는 함수 밖에서 직접 접근할 수 없으므로 결과를 반환해야 한다.
- ③ 정답: 가변 입력의 최소 개수를 검증하고 호출부가 재사용할 두 결과를 전달한다.
- ④ 오답: 가변 매개변수는 한 함수에 하나만 사용하며 빈 입력을 자동 보충하지 않는다.
참고 자료와 작성 기준
이 글은 해당 차시 강의자료를 바탕으로 학습 목적에 맞게 재구성한 비공식 학습자료입니다. 호출 수명주기, 수정한 코드 예제, 실행 추적과 문제 해설은 학습자의 이해를 돕도록 구성하고 검토했습니다.
- 작성·편집: 올에이클래스 학습연구팀
- 주요 근거: 한국방송통신대학교 컴퓨터과학과 「파이썬프로그래밍기초」 강의록 7강 「함수」, 1~34쪽
- 범위 구분: 35쪽의 8강 「컬렉션 1」 예고는 본문에서 제외
- 보충 자료: 외부 자료를 사용하지 않음
- 편집 원칙: 올에이클래스 편집 정책
- 최종 내용 검토: 2026-09-07
댓글
댓글 쓰기