같은 계산이나 출력 코드를 여러 번 복사하고 있다면 함수로 묶을 때입니다. 파이썬 함수는 반복해서 사용할 코드를 하나의 이름으로 묶은 것이며, def로 정의한 뒤 함수 이름에 괄호를 붙여 호출합니다. 계산 결과가 필요할 때는 return으로 호출한 위치에 값을 돌려줍니다.
이 글에서는 직접 만드는 사용자 정의 함수를 기준으로 def, 매개변수, 인자, 기본값, return을 하나씩 실행합니다. 마지막에는 리스트의 점수로 평균과 합격 여부를 계산하는 전체 예제까지 연결합니다.

테스트 환경
Windows
Python 3.9.13 직접 실행
Python 3.14.6 공식 문서 확인
확인일 : 2026년 7월 31일
파이썬 함수란 무엇인가요?
파이썬 함수는 특정 작업을 수행하는 코드를 이름으로 묶은 것입니다. 한 번 정의해 두면 같은 코드를 다시 작성하지 않고 함수 이름으로 여러 번 실행할 수 있습니다.
print()와 len()처럼 Python이 미리 제공하는 것은 내장 함수입니다. 이번 글에서 만들 greet()와 calculate_average()는 사용자가 def로 정의하는 함수입니다.
| 구분 | 예 | 만드는 사람 |
|---|---|---|
| 내장 함수 | print(), len(), sum() |
Python |
| 사용자 정의 함수 | greet(), calculate_average() |
프로그램 작성자 |
함수는 코드가 길어서만 사용하는 것이 아닙니다. 같은 동작에 이름을 붙이면 코드를 읽을 때 무엇을 하는 부분인지 바로 알 수 있고, 계산 방법을 바꿀 때도 함수 내부만 수정하면 됩니다.
def로 함수는 어떻게 만들고 호출하나요?
def 뒤에 함수 이름과 괄호를 쓰고 끝에 콜론을 붙이면 함수 정의가 시작됩니다. 다음 줄부터 실행할 코드는 반드시 들여쓰기합니다.
def greet():
print("안녕하세요!")
greet()
greet()
실행 결과는 다음과 같습니다.
안녕하세요!
안녕하세요!
def greet():는 함수를 정의하는 줄입니다. 이 줄만 실행해서는 "안녕하세요!"가 출력되지 않습니다. 아래의 greet()가 함수 호출이며, 호출할 때마다 들여쓰기된 코드가 실행됩니다.
함수 이름은 변수와 마찬가지로 숫자로 시작할 수 없습니다. 여러 단어를 사용할 때는 calculate_average처럼 소문자와 밑줄을 사용하는 방식이 읽기 편합니다.
반복문을 아직 익히는 중이라면 Python while문 사용법 : 조건 반복문과 break 예제를 먼저 확인해도 좋습니다. 반복해서 실행하는 흐름과 반복할 코드를 함수로 묶는 목적을 구분하기 쉬워집니다.
매개변수와 인자는 무엇이 다른가요?
매개변수는 함수를 정의할 때 받을 값의 이름이고, 인자는 함수를 호출할 때 실제로 전달하는 값입니다. 아래 코드에서 name과 job은 매개변수이고, "민수"와 "디자이너"는 인자입니다.
def introduce(name, job="개발자"):
print(f"{name}님의 직업은 {job}입니다.")
introduce("민수")
introduce("지영", "디자이너")
introduce(job="학생", name="준호")
실행 결과 :
민수님의 직업은 개발자입니다.
지영님의 직업은 디자이너입니다.
준호님의 직업은 학생입니다.
job="개발자"처럼 값을 미리 지정한 매개변수를 기본값 매개변수라고 합니다. 첫 번째 호출은 job을 전달하지 않았기 때문에 기본값인 "개발자"를 사용합니다.
두 번째 호출처럼 인자의 위치에 맞춰 전달할 수도 있고, 세 번째 호출처럼 job="학생" 형태로 매개변수 이름을 지정할 수도 있습니다. 이름을 지정한 키워드 인자는 순서를 바꿔도 어느 매개변수에 들어갈지 분명합니다.
주의하실 점은 기본값이 없는 매개변수는 기본값이 있는 매개변수보다 앞에 두어야 한다는 것입니다. 기본값과 키워드 인자의 세부 규칙은 Python 함수 인수 공식 문서에서도 확인할 수 있습니다. 다음 형태가 기본 순서입니다.
def introduce(name, job="개발자"):
...
return과 print는 무엇이 다른가요?
print()는 화면에 값을 보여주고, return은 함수의 실행 결과를 호출한 위치로 돌려줍니다. 반환받은 값은 변수에 저장하거나 다른 계산에 다시 사용할 수 있습니다.
def add_with_print(a, b):
print(a + b)
def add_with_return(a, b):
return a + b
print_result = add_with_print(10, 20)
return_result = add_with_return(10, 20)
print(f"print 함수의 반환값: {print_result}")
print(f"return으로 받은 값: {return_result}")
print(f"반환값을 다시 계산: {return_result * 2}")
두 함수의 반환값까지 출력하면 차이가 분명하게 보입니다.
30
print 함수의 반환값: None
return으로 받은 값: 30
반환값을 다시 계산: 60
add_with_print()는 계산값 30을 화면에 출력했지만 그 값을 호출한 곳에 돌려주지는 않았습니다. 그래서 print_result에는 None이 저장됩니다.

반면 add_with_return()은 30을 반환합니다. return_result에 저장한 뒤 * 2 계산에도 다시 사용할 수 있습니다. 단순히 사람에게 결과를 보여줄 때는 print(), 다른 코드가 결과를 이어서 사용해야 할 때는 return이라고 구분하면 됩니다.
return이 없는 함수는 무엇을 반환하나요?
함수에 return이 없거나 반환할 값 없이 return만 실행하면 None을 반환합니다. None은 값이 없음을 나타내는 Python의 특별한 객체이며, 이 동작은 Python 함수 정의 공식 문서에 명시되어 있습니다.
def show_message(message):
print(message)
result = show_message("함수가 실행됐습니다.")
print(f"함수의 반환값: {result}")
실행 결과:
함수가 실행됐습니다.
함수의 반환값: None
화면에 문장이 출력됐다고 해서 그 문장이 반환된 것은 아닙니다. 함수 결과를 변수에 넣어 계산하거나 비교하려면 필요한 값을 return으로 명시해야 합니다.
missing required positional argument 오류는 왜 발생하나요?
필수 매개변수보다 적은 수의 인자를 전달하면 TypeError와 함께 missing required positional argument 메시지가 발생합니다. 어떤 매개변수가 빠졌는지 오류 메시지의 마지막 부분에서 확인할 수 있습니다.
def calculate_price(price, quantity):
return price * quantity
total = calculate_price(5000)
print(total)
위 코드를 직접 실행하면 다음 오류가 발생합니다.
TypeError: calculate_price() missing 1 required positional argument: 'quantity'

함수는 price와 quantity 두 값을 요구하지만 호출할 때 5000 하나만 전달했습니다. 수량을 두 번째 인자로 전달하면 해결됩니다.
total = calculate_price(5000, 3)
print(total)
15000
호출할 때마다 수량을 입력받지 않아도 되는 함수라면 quantity=1처럼 기본값을 줄 수도 있습니다. 다만 누락을 숨기면 안 되는 값이라면 기본값을 억지로 넣기보다 호출 코드를 고치는 편이 안전합니다.
리스트 점수로 평균과 합격 여부 계산하기
이제 함수 두 개를 연결해 점수 목록의 평균과 합격 여부를 계산해 보겠습니다. calculate_average()는 숫자를 계산해 반환하고, get_result()는 평균을 받아 판정 문자열을 반환합니다.
def calculate_average(scores):
if not scores:
raise ValueError("점수 목록이 비어 있습니다.")
total = 0
for score in scores:
total += score
return total / len(scores)
def get_result(average, pass_score=60):
if average >= pass_score:
return "합격"
return "불합격"
student_scores = [85, 72, 90, 68]
average = calculate_average(student_scores)
result = get_result(average)
print(f"점수: {student_scores}")
print(f"평균: {average:.1f}")
print(f"결과: {result}")
실행 결과 :
점수: [85, 72, 90, 68]
평균: 78.8
결과: 합격
calculate_average(student_scores)에서 리스트 전체를 인자로 전달했습니다. 함수 내부의 for문이 각 점수를 더하고, 합계를 len(scores)로 나눈 값을 반환합니다.
get_result()에는 반환받은 평균을 다시 인자로 전달했습니다. 합격 기준은 기본값 60을 사용하지만 get_result(average, 80)처럼 호출하면 기준을 바꿀 수 있습니다.
빈 리스트를 전달하면 평균을 계산할 수 없습니다. 예제에서는 나눗셈 전에 if not scores:로 확인하고, 호출한 코드가 원인을 바로 알 수 있도록 ValueError와 설명을 발생시켰습니다. 의미가 다른 임의의 평균값을 반환하는 것보다 잘못된 입력을 분명하게 알리는 방식입니다.
리스트의 생성과 항목 추가가 익숙하지 않다면 파이썬 리스트 사용법 : 생성, 추가, 삭제, 정렬 예제를, 반복 과정을 다시 확인하려면 Python for문 사용법 : range 반복문과 리스트 반복 예제를 함께 보면 코드 흐름을 이해하기 쉽습니다.
함수를 만들 때 먼저 확인할 세 가지
첫째, 함수는 호출되기 전에 정의되어 있어야 합니다. Python은 코드를 위에서 아래로 실행하므로 def가 실행되기 전에 함수를 호출하면 NameError가 발생할 수 있습니다.
둘째, 함수 본문은 같은 깊이로 들여쓰기해야 합니다. 들여쓰기가 빠지거나 맞지 않으면 IndentationError가 발생할 수 있으며 함수가 실행되기 전에 코드 해석이 중단됩니다.
셋째, 화면 출력과 값 반환을 구분해야 합니다. 함수 안에서 출력만 하고 바깥에서 결과를 계산하려 하면 None 때문에 예상하지 못한 오류가 이어질 수 있습니다. 호출한 코드가 값을 다시 사용해야 한다면 return을 선택하면 됩니다.
사용자에게 점수를 입력받아 이 예제에 전달하려면 Python input 사용법 : 문자열과 숫자 입력받기 예제의 정수 변환 부분을 연결할 수 있습니다.
함수를 처음 만들 때는 def, 호출, 매개변수, return 네 부분을 한꺼번에 복잡하게 구성하지 않는 것이 좋습니다. 인자 하나를 받아 반환하는 짧은 함수부터 실행하고, 반환값을 변수에 저장한 뒤 실제 값이 들어왔는지 출력해 보면 막히는 위치를 빠르게 찾을 수 있습니다.
참고한 공식 문서
'IT프로그래밍 > 파이썬' 카테고리의 다른 글
| 파이썬 산술 연산자 기초 : /, //, %는 무엇이 다를까 (0) | 2026.08.08 |
|---|---|
| 파이썬 변수 기초 : 값에 이름을 붙이면 무엇이 편해질까 (0) | 2026.08.07 |
| 파이썬 자료형 기초 : 숫자 10과 문자열 '10'은 왜 다를까 (0) | 2026.08.05 |
| 파이썬 코드 실행 순서 : 위에서 아래로 읽는 첫 번째 원리 (0) | 2026.08.04 |
| 파이썬 리스트 사용법 : 생성, 추가, 삭제, 정렬 예제 (0) | 2026.07.30 |
| Python Install Manager 사용법 : Python 3.14 처음 설치부터 실행까지 (0) | 2026.07.20 |
| Python PATH 설정 확인 방법 : python 명령어가 인식되지 않을 때 (0) | 2026.07.12 |
| Python if문 사용법 : 조건문 예제와 비교 연산자 (0) | 2026.07.08 |
댓글