2026. 5. 14. 09:10ㆍAI/Python
사용자 정의 함수란?
사용자가 특정 작업을 수행하기 위해 직접 작성한 함수를 의미한다.
Python에는 많은 내장 함수들이 있지만, 때로는 우리의 요구사항에 맞게 동작하는 함수를 직접 만들어야 한다.
def 함수명(매개변수 1, 매개변수 2, ...):
.... 함수 행동
return 결과값
함수 객체를 메모리에 생성하고, 그 함수 객체에 함수명 이름(변수 이름)을 붙이는 방식으로 동작한다.
def hello():
print("안녕하세요")
a = hello # 함수를 복사한 것이 아니라, 같은 함수 객체를 참조하는 이름을 하나 더 만든다
a() // "안녕하세요" == hello()
함수 객체
function object
l----- 함수 이름
l----- 매개변수 정보
l----- 실행할 코드 정보
l----- 기본 값 정보
l----- 전역 네임 스페이스 정보
l----- 클로저 정보
print(a) # 함수 객체 : 함수 자체를 나타내는 객체
print(a.__code__) # 코드 객체: 함수 안에서 실행할 실제 바이트 코드 정보
함수 호출 시 메모리에서 벌어지는 과정
def add(a, b):
return a + b
print(add(3,5)) # 8
1) add 이름이 가리키는 함수 객체를 찾는다.
2) 함수 실행을 위한 새 공간을 만든다.
3) 매개변수 a, b에 값을 연결한다.
4) 함수 본문을 실행한다.
5) 리턴 값을 반환한다.
6) 함수 실행 공간을 제거한다. (메모리에서 제거)
이 때 만들어지는 새 공간을 스택 프레임(Stack Frame) 혹은 함수 호출 프레임이라고 한다.
함수 호출 프레임
Python에서 함수가 호출될 때마다 생성되는 독립적인 실행공간으로써
해당 함수의 매개변수, 지역변수, 반환 주소, 실행 상태 등을 저장하는 구조이다.
이 프레임은 스택 형태로 관리되어 함수가 호출될 때 쌓이고, 실행이 끝나면 제거되며
이를 통해 함수 간 변수 충돌 없이 안전하게 실행된다.
즉, 같은 함수를 여러 번 호출하더라도 매번 새로운 프레임이 만들어지므로
각 호출은 서로 영향을 주지 않고 독립적으로 동작한다.
함수 만들기
매개변수와 반환 값이 없는 함수
힙 영역에 저장되므로, 프로그램을 종료되지 않는 한 계속 메모리에 할당되어 있다.
def func1():
print("처음으로 만드는 함수!")
func1() # 함수 호출
매개변수가 있고 반환 값이 없는 함수
def func2(num):
print(f"입력 받은 숫자: {num}")
func2(10)
def func3(start, end):
sum = 0
for i in range(start, end + 1):
sum += i
print(f"{start}부터 {end}까지의 합: {sum}")
func1(1,10)
# 함수 안의 지역 변수는 매번 새로 만들어져서 새로운 함수 호출 프레임이 만들어지고 함수가 끝나면 사라진다
반환 값이 있는 함수
def fun4():
return '🎃'
temp = func4()
print(temp) # 🎃
기본값이 설정된 함수의 매개변수
def func6(num1 = 0, num2 = 0):
sum = num1 + num2
return sum
print(func6(10, 3))
print(func6(num2 = 3))
가변 매개변수
함수를 호출할 때 *를 사용하면 시퀀스(리스트, 튜플)의 요소를 개별적인 위치 인자로 풀어서 전달할 수 있다.
def func6(*args):
return args
print(func7()) # ()
print(func7(10)) # (10,)
def func8(a, b, c):
return a + b + c
numbers = [1, 2, 3]
print(func7(*numbers)) # 6
키워드 매개변수
일반적으로 기본값이 설정된 매개변수와 함께 사용되며, 함수의 매개변수에 기본값을 설정하면
함수를 호출할 때 해당 매개변수를 생략할 수 있다.
def func9(id, name, age):
print(id)
print(name)
print(age)
# 매개변수명과 딕셔너리 키가 같아야 함
# 딕셔너리 키는 반드시 문자열 형태
dic1 = {'age': 25, 'id': 'banana', 'name': '반하나'}
func9(**dic1)
변수 범위
변수 스코프는 해당 변수가 프로그램 내에서 참조 되고 변경될 수 있는 영역을 의미한다.
지역 변수 : 가장 내부의 범위로, 함수 내에서 정의된 변수로써 함수내에서만 접근할 수 있다.
전역 변수: 스크립트 전체에서 사용되는 범위로, 함수의 외부에 정의된 변수이다.
* 전역변수는 모든 함수에서 접근할 수 있으나 함수 내부에서 수정시 global 키워드가 필요
클로저 변수: 내부 함수가 외부 함수의 지역 변수를 사용하면, Python은 그 값을 바로 삭제하지 않고 클로저 공간에 보관한다.
클로저 공간
내부 함수가 외부 함수의 변수를 계속 사용할 수 있도록 그 값을 따로 저장해두는 메모리 영역이다.
일반적으로 함수가 끝나면 그 안의 지역 변수는 사라지나, 내부 함수가 외부 함수의 변수를 참조하고 있으면 지우지 않고
객체 안에 __closure__라는 형태로 보관한다.
이 때 저장되는 값은 보통 ceil 객체로 감싸져 유지되며 내부 함수는 실행될 때 이 클로저 공간을 통해 외부 변수에 접근한다.
콜백 함수
다른 함수에 인자로 전달 되어 특정 시점이나 조건이 되었을 때 나중에 호출되는 함수이다.
함수도 객체이므로 변수처럼 전달할 수 있으며 이를 활용해 어떤 작업이 끝난 뒤 실행할 동작을 미리 정의한다.
다른 함수에 맡겨두었다가 필요할 때 호출되도록 하는 함수이다.
def say_hello(name):
print(f"{name}님 안녕하세요")
def execute(callback):
print("작업 시작")
callback("김사과")
print("작업 종료")
execute(say_hello)
람다 함수
이름 없이 간단한 함수를 한 줄로 정의할 수 있는 익명 함수로, 주로 짧고 일회성으로 사용되는
연산을 표현할 때 활용된다. 일반 함수에 비해 구조는 제한적이나 코드가 간결해지고
특히 sorted, map, filter 같은 함수에서 콜백 함수로 자주 사용된다.
lambda 매개변수: 반환 표현식
'AI > Python' 카테고리의 다른 글
| Python의 기본 - 객체 지향 프로그래밍의 패러다임 (9) (0) | 2026.05.17 |
|---|---|
| Python의 기본 - 프로그래밍 방법론 (8) (0) | 2026.05.15 |
| Python의 기본 - 제어문 (6) (0) | 2026.05.14 |
| Python의 기본 - 튜플, 세트, 딕셔너리 (5) (0) | 2026.04.29 |
| Python의 기본 - 콜렉션 타입 중 리스트 (4) (0) | 2026.04.27 |