파이썬프로그래밍기초 7강 - 함수
함수의 개념과 정의·호출 과정을 이해하고 매개변수와 인자, 반환값의 역할을 구분한다. 값 전달과 변수의 스코프, 기본 매개변수와 가변 매개변수, 동시 할당과 실수 형식화를 활용하여 재사용 가능한 프로그램을 작성한다.
제1장 함수의 개념
1. 함수가 필요한 이유
함수는 특정 작업을 수행하는 명령문의 집합이다. 반복되는 코드를 함수 이름으로 대신하면 같은 명령을 여러 곳에 복사하지 않고 필요할 때 호출할 수 있다. 유사한 유형의 문제를 해결할 수 있도록 프로그램을 작은 기능 단위로 설계하고 추상화하는 도구라고 할 수 있다.
원뿔 계산을 서로 다른 반지름과 높이에 대해 반복한다면 입력값만 바뀌고 계산식은 같다. 계산 코드를 매번 작성하면 코드가 길어지고 수정할 곳도 많아진다. 계산 과정을 함수로 만들면 반지름과 높이를 전달하는 것만으로 같은 작업을 재사용할 수 있다.
2. 내장 함수와 사용자 정의 함수
함수는 정의 주체에 따라 내장 함수와 사용자 정의 함수로 구분한다. 내장 함수는 파이썬에 이미 만들어져 있는 함수로 print(), input(), max(), int() 등이 있다. 사용자 정의 함수는 사용자의 목적에 따라 직접 정의한 함수이다.
| 구분 | 의미 | 예 |
|---|---|---|
| 내장 함수 | 파이썬이 기본으로 제공하는 함수 | print(), input(), max() |
| 사용자 정의 함수 | 특정 목적을 위해 프로그래머가 정의한 함수 | prt_cone_vol(), rtn_cone_vol() |
3. 반환값에 따른 분류
반환값이 없는 함수는 함수 내부의 작업을 수행한 뒤 종료한다. 화면 출력처럼 작업 자체가 목적일 때 사용할 수 있다. 반환값이 있는 함수는 실행 결과를 호출한 곳으로 돌려준다. 반환된 값은 변수에 저장하거나 다른 계산과 함수 호출의 재료로 사용할 수 있다.
출력과 반환은 다르다
print()는 값을 화면에 보여 주고, return은 값을 함수 호출 지점으로 전달한다. 출력했다고 해서 그 값이 자동으로 반환되는 것은 아니다.
제2장 함수의 정의와 호출
1. 함수 정의 구문
사용자 정의 함수는 def 키워드로 시작한다. 함수 이름 뒤 괄호에는 매개변수 목록을 쓰고 콜론을 붙인다. 함수에 포함되는 명령문 블록은 반드시 들여쓰기한다.
def 함수이름(매개변수목록):
명령문
함수 이름은 식별자 규칙을 따른다. 매개변수 목록은 0개 이상일 수 있으며, 함수 내부에서는 매개변수를 일반 변수처럼 사용한다.
2. 반환값이 없는 원뿔 계산 함수
def prt_cone_vol(r, h):
if r > 0 and h > 0:
vol = 1 / 3 * 3.14 * r ** 2 * h
print("원뿔의 부피는", vol, "입니다.")
else:
print("반지름과 높이는 양수여야 합니다.")
r과 h가 모두 양수이면 부피를 계산해 출력하고, 그렇지 않으면 안내 문구를 출력한다. 함수의 목적이 결과를 직접 화면에 표시하는 것이므로 명시적인 return이 없다.
3. 매개변수와 인자
매개변수(parameter)는 함수 정의에서 입력값을 받아들이도록 선언한 변수이다. 인자(argument)는 함수를 호출할 때 실제로 전달하는 값이다. 다음 호출에서 r과 h는 매개변수이고 30과 50은 인자이다.
prt_cone_vol(30, 50)
호출이 일어나면 인자가 대응되는 매개변수에 전달되고 함수의 명령문 블록이 실행된다. 함수가 종료되면 실행 흐름은 호출문 다음으로 돌아온다.
4. 숫자 역순 출력 함수
입력한 네 자리 숫자를 역순으로 출력하는 작업도 함수로 분리할 수 있다. 정수 연산을 이용하면 마지막 자리부터 차례로 분리할 수 있다.
def reverse_number(num):
d1 = num % 10
num = num // 10
d2 = num % 10
num = num // 10
d3 = num % 10
d4 = num // 10
print(d1, d2, d3, d4, sep="")
number = int(input("역순으로 출력할 숫자를 입력하세요: "))
reverse_number(number)
4567을 입력하면 나머지 연산으로 7, 6, 5를 차례로 얻고 마지막 몫에서 4를 얻어 7654를 출력한다.
제3장 반환값이 있는 함수
1. return의 역할
반환값이 있는 함수는 return 키워드 뒤에 돌려줄 값을 지정한다. 함수가 return을 실행하면 해당 값을 호출 지점에 전달하고 함수 실행을 즉시 종료한다. 한 함수 안에 여러 return 문이 있을 수 있지만 한 번의 호출에서는 실행 흐름이 도달한 하나의 return만 수행된다.
def rtn_cone_vol(r, h):
if r > 0 and h > 0:
return 1 / 3 * 3.14 * r ** 2 * h
else:
return -1
정상적인 양수 입력에는 계산된 부피를 반환하고, 잘못된 입력에는 -1을 반환한다. 반환값을 사용하면 계산과 출력 형식을 분리할 수 있어 같은 함수를 다양한 상황에서 활용할 수 있다.
2. 실수 데이터 형식화
format() 함수는 값을 지정한 형식의 문자열로 만든다. 예를 들어 >10.3f에서 >는 오른쪽 정렬, 10은 전체 필드 폭, .3은 소수점 이하 세 자리, f는 고정소수점 실수 형식을 뜻한다.
rad = 10
hei = 50
print(format(rtn_cone_vol(rad, hei), ">10.3f"))
| 요소 | 의미 |
|---|---|
> | 필드 안에서 오른쪽 정렬 |
10 | 출력에 사용할 전체 필드 폭 |
.3 | 소수점 이하 세 자리 |
f | 고정소수점 실수 형식 |
3. 여러 값을 반환하기
파이썬 함수는 쉼표로 구분하여 여러 값을 한꺼번에 반환할 수 있다. 원뿔의 부피와 겉넓이를 함께 계산하는 함수는 두 결과를 동시에 돌려줄 수 있다.
def rtn_cone_vol_surf(r, h):
if r > 0 and h > 0:
sla = pow(r ** 2 + h ** 2, 0.5)
vol = 1 / 3 * 3.14 * r ** 2 * h
surf = 3.14 * r ** 2 + 3.14 * r * sla
return vol, surf
else:
return -1, -1
volume, surface = rtn_cone_vol_surf(20, 30)
반환된 두 값은 동시 할당을 이용해 volume과 surface에 각각 저장할 수 있다.
제4장 동시 할당과 교환
1. 동시 할당
동시 할당은 복수의 변수에 값을 한 문장으로 할당하는 기능이다. 변수의 개수와 오른쪽 값의 개수가 대응해야 한다.
temp, season = 27, "summer"
위 문장에서 temp에는 27, season에는 "summer"가 저장된다. 여러 값을 반환하는 함수의 결과를 받을 때도 같은 원리를 사용한다.
2. 값의 교환
다른 언어에서는 임시 변수를 사용해 두 값을 교환하는 경우가 많다. 파이썬에서는 동시 할당으로 두 변수의 값을 간단히 맞바꿀 수 있다.
rad, hei = hei, rad
오른쪽의 기존 값들이 먼저 묶인 뒤 왼쪽 변수에 대응하여 할당되므로 별도의 임시 변수 없이 교환된다.
3. 세 수 정렬에 적용
세 값을 오름차순으로 만들 때 두 값의 크기를 비교하고 필요하면 교환하는 작업을 반복할 수 있다.
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
first, second, third = sort_three(59, 1, 103)
print(first, second, third, sep=", ")
59, 1, 103을 전달하면 1, 59, 103이 반환된다. 함수의 반환값과 동시 할당, 교환을 함께 사용하는 예이다.
제5장 함수 실행과 변수의 스코프
1. 함수 호출과 실행 공간
함수가 호출되면 함수 실행을 위한 별도의 공간이 만들어지고 매개변수와 함수 내부 변수가 그 공간에서 사용된다. 함수 실행이 끝나면 호출 지점으로 돌아온다. 이 과정에서 호출 정보와 지역 데이터는 호출 스택을 통해 관리된다.
2. 값의 전달
강의록은 함수 호출 시 값이 형식 매개변수에 전달되는 과정을 설명한다. 다음 예에서 함수 내부의 x와 프로그램 공간의 x는 서로 다른 영역에 존재한다.
x = 1
print("x의 값은", x)
def inc(x):
x = x + 1
print("x의 값은", x)
inc(x)
print("x의 값은", x)
함수 안에서는 매개변수 x가 2가 되어 출력되지만 함수 호출 후 바깥쪽 x는 여전히 1이다. 함수 안의 지역 변수 변경이 같은 이름의 전역 변수에 자동 반영되는 것은 아니다.
3. 변수의 스코프
스코프(scope)는 프로그램에서 변수가 참조될 수 있는 영역이다. 전역변수는 함수 외부에서 선언되어 프로그램 전체 영역에서 접근할 수 있다. 지역변수는 선언된 함수 내부에서만 접근할 수 있다.
| 구분 | 선언 위치 | 참조 범위 |
|---|---|---|
| 전역변수 | 함수 외부 | 프로그램의 전역 영역 |
| 지역변수 | 함수 내부 | 선언된 함수 내부 |
이름이 같아도 다른 변수
전역 영역과 함수 내부에 같은 이름의 변수가 있으면 스코프에 따라 서로 다른 변수로 취급될 수 있다. 함수 내부에서는 지역변수가 우선 참조된다.
제6장 기본·가변 매개변수
1. 기본 매개변수
기본 매개변수는 함수 호출 시 인자가 전달되지 않았을 때 함수 정의에 지정된 기본값을 사용하는 매개변수이다. 자주 사용하는 값을 기본으로 두고 필요한 호출에서만 다른 값을 전달할 수 있다.
def hello(name, msg="반갑습니다"):
print(name, msg)
hello("파이썬")
hello("파이썬", "환영합니다")
첫 호출은 기본 메시지를 사용하고 두 번째 호출은 전달된 메시지로 기본값을 대체한다. 기본값이 없는 일반 매개변수는 기본 매개변수보다 앞에 배치해야 한다.
2. print 함수의 기본 매개변수
print()의 sep도 기본 매개변수의 예이다. 값을 생략하면 공백이 사용되지만 sep=""처럼 전달하면 데이터 사이의 공백을 없앨 수 있다.
print("Hello", "I love Python")
print("Hello", "I love Python", sep="")
3. 가변 매개변수
가변 매개변수는 함수를 호출할 때 사용자가 원하는 개수만큼 인자를 전달할 수 있게 한다. 함수 정의에서 매개변수 이름 앞에 별표를 붙이며, 전달된 값들은 함수 내부에서 하나의 묶음으로 처리한다. 가변 매개변수는 하나만 사용할 수 있고 일반 매개변수보다 뒤에 배치한다.
def var_sum_avg(*numbers):
total = sum(numbers)
average = total / len(numbers)
return total, average
total, average = var_sum_avg(20, 25, 10, 85, 100, 150)
print(total, average)
호출마다 숫자의 개수가 달라도 같은 함수로 합과 평균을 구할 수 있다. 단, 인자가 하나도 없으면 평균 계산에서 0으로 나누는 문제가 생기므로 실제 프로그램에서는 입력 개수를 확인하는 처리가 필요하다.
매개변수 배치 규칙
기본값이 없는 일반 매개변수를 먼저, 기본 매개변수를 그다음에 둔다. 별표를 붙인 가변 매개변수는 일반 매개변수 뒤에 배치하며 한 함수에서 하나만 사용한다.
핵심 개념 정리
7강 핵심 요약
- 함수는 특정 작업을 수행하는 명령문의 집합이며 코드의 재사용과 추상화를 돕는다.
- 내장 함수는 파이썬이 제공하고 사용자 정의 함수는 프로그래머가 목적에 맞게 만든다.
def로 함수를 정의하고 매개변수에 전달할 실제 값을 인자라고 한다.- 반환값 없는 함수는 작업 후 종료하고, 반환값 있는 함수는
return으로 결과를 전달한다. format()의 형식 지정자로 정렬, 필드 폭, 소수 자릿수와 타입을 지정한다.- 파이썬은 여러 값을 동시에 할당·반환할 수 있으며 동시 할당으로 값을 교환할 수 있다.
- 함수 호출 시 별도 실행 공간이 만들어지고 지역 변수는 함수 내부 스코프를 갖는다.
- 기본 매개변수는 인자 생략 시 기본값을 사용하고 가변 매개변수는 여러 인자를 받는다.
최종 정리
함수는 입력을 매개변수로 받고 명령문을 실행한 뒤 필요하면 결과를 반환하는 독립적인 작업 단위이다. 함수 정의와 호출, 반환, 스코프, 다양한 매개변수의 규칙을 이해하면 중복을 줄이고 재사용성과 이해 가능성이 높은 프로그램을 만들 수 있다.
예상문제 20선
1. 함수의 가장 적절한 정의는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
함수는 특정 작업을 하나의 이름으로 묶은 명령문의 집합이다.
2. 다음 중 파이썬 내장 함수는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
print는 파이썬이 기본 제공하는 내장 함수이고 나머지는 강의에서 정의한 사용자 함수이다.
3. 사용자 정의 함수를 시작하는 키워드는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
파이썬은 def 키워드 다음에 함수 이름과 매개변수 목록을 작성하여 함수를 정의한다.
4. 매개변수(parameter)와 인자(argument)의 설명으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
함수 정의의 입력 변수는 매개변수, 실제 호출에서 전달하는 값은 인자이다.
5. return 문이 실행될 때 일어나는 일은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
return은 결과를 호출 지점으로 돌려주고 현재 함수 실행을 끝낸다.
6. print와 return의 차이로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
화면에 보여 주는 것과 프로그램이 후속 계산에 사용할 값을 돌려주는 것은 서로 다른 기능이다.
7. 형식 지정자 >10.3f에서 10의 의미는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
10은 값을 표현할 전체 필드 폭이며 .3은 소수점 이하 자릿수이다.
8. 형식 지정자 >10.3f의 출력 특성은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
>는 오른쪽 정렬, .3은 소수점 이하 세 자리, f는 실수 형식이다.
9. 다음 동시 할당 후 temp의 값은?temp, season = 27, "summer"
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
왼쪽과 오른쪽 값이 위치에 따라 대응하여 temp에는 27이 저장된다.
10. 두 변수의 값을 교환하는 파이썬 문장은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
파이썬 동시 할당은 오른쪽의 기존 값을 묶은 뒤 왼쪽 변수에 각각 할당하여 값을 교환한다.
11. 함수가 return vol, surf를 실행했을 때 적절한 수신 방법은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
여러 반환값은 동시 할당으로 대응되는 여러 변수에 받을 수 있다.
12. 함수 호출 시 만들어지는 함수 내부의 실행 데이터와 관련된 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
함수 호출 정보와 지역 데이터는 함수 실행 공간과 호출 스택을 통해 관리된다.
13. 다음 실행 후 마지막에 출력되는 전역 x는?x=1, inc(x)에서 함수 내부 x에 1을 더함
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
함수 내부 매개변수 x의 변경은 별도 지역 영역에서 이루어져 바깥쪽 x는 1로 유지된다.
14. 지역변수의 스코프는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
지역변수는 선언된 함수 내부에서만 참조할 수 있다.
15. 기본 매개변수의 설명으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
기본 매개변수는 호출 시 해당 인자가 없으면 미리 정한 기본값을 사용한다.
16. 기본 매개변수의 배치 규칙으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
기본값이 없는 매개변수를 먼저 작성하고 기본 매개변수를 뒤에 배치한다.
17. 가변 매개변수를 정의하는 표기는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
매개변수 이름 앞에 별표를 붙이면 호출 시 여러 개의 위치 인자를 받을 수 있다.
18. 가변 매개변수의 장점은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
가변 매개변수는 호출마다 필요한 개수만큼 인자를 받아 하나의 묶음으로 처리한다.
19. var_sum_avg(20, 25, 10)에서 가변 매개변수가 받는 값의 개수는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
호출에서 쉼표로 구분해 전달한 20, 25, 10의 세 값이 가변 매개변수에 묶인다.
20. 함수 사용의 효과로 가장 적절한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
함수는 관련 코드를 이름 있는 단위로 묶어 중복을 줄이고 여러 상황에서 재사용하게 한다.
댓글
댓글 쓰기