P2-8.5 함수(function)와 작은 재사용¶
Section ID:
P2-8.5Version:v2026.09.15
함수 정의와 호출¶
일반적으로 함수(function)는 입력을 받아 어떤 처리를 하고 결과를 돌려주는 단위입니다. 수학에서는 입력과 출력의 관계를 강조하고, 프로그래밍에서는 그 관계를 실제 실행 가능한 코드로 표현합니다.
Python에서는 def로 함수에 이름을 붙이고, 필요한 입력 이름을 매개변수(parameter)로 적습니다.
점수 82가 기준 60 이상인지 판단하면 pass가 출력됩니다. 아래 코드는 함수 없이 조건문으로 판정합니다.
이 판단을 한 번만 쓴다면 그대로 둘 수 있습니다. 하지만 점수 여러 개에 대해 계속 같은 판단을 해야 한다면 코드가 반복됩니다.
통과 판정에 pass_or_fail이라는 이름을 붙이면 점수만 바꿔 호출할 수 있습니다. 아래 출력은 pass, fail입니다.
pass_or_fail은 함수 이름입니다. score는 함수 안에서 사용할 입력 이름입니다. return은 결과를 호출한 자리로 돌려주고 현재 함수 실행을 끝냅니다. 따라서 82를 넣으면 "pass"를 반환한 뒤 아래의 return "fail"은 실행하지 않습니다.
수학의 함수와 Python 함수¶
수학에서 함수는 보통 입력과 출력의 관계로 설명합니다.
수학의 함수 \(f(x)=x+1\)를 Python으로 표현하면 다음과 같습니다. 인자 3을 전달하면 4가 출력됩니다.
| 관점 | 수학의 함수 | Python 함수 |
|---|---|---|
| 중심 관심 | 입력과 출력의 관계 | 실행되는 코드와 결과 |
| 표현 | \(f(x) = x + 1\) | def f(x): return x + 1 |
| 부작용(side effect) | 보통 순수한 관계로 다룸 | 출력, 파일 저장, 리스트 변경 같은 동작을 할 수 있음 |
| 오류 | 정의역 밖이면 수학적으로 다룸 | 타입 오류, 키 오류, 실행 오류가 날 수 있음 |
AI 실습에서는 두 관점이 모두 필요합니다.
- 손실 함수(loss function)는 수학적 관계로 이해해야 합니다.
- Python 함수는 그 계산을 코드로 재사용하게 해 줍니다.
- 라이브러리 함수는 내부 구현을 몰라도 입력과 출력 계약을 믿고 사용할 수 있게 해 줍니다.
매개변수와 인자¶
매개변수(parameter)는 함수 정의에서 입력을 부르는 이름이고, 인자(argument)는 호출할 때 전달하는 값입니다.
점수 80에 보너스 5를 더하면 반환값은 85입니다. 함수 정의의 score, bonus는 매개변수이고 호출에 넣은 80, 5는 인자입니다.
| 구분 | 위치 | 예시 |
|---|---|---|
| 매개변수(parameter) | 함수를 정의할 때 쓰는 이름 | score, bonus |
| 인자(argument) | 함수를 호출할 때 넣는 실제 값 | 80, 5 |
| 반환값(return value) | 함수가 돌려주는 결과 | 85 |
반환과 출력¶
return은 함수가 계산한 결과를 호출한 자리로 돌려주는 문법입니다.
100점 만점 점수 82를 100으로 나누어 반환합니다. 호출한 쪽에서 받은 0.82를 normalized에 저장하고 출력합니다.
normalize_score(82)가 실행되면 0.82가 결과로 돌아옵니다. 그 결과를 normalized라는 이름에 붙였습니다.
print()와 return은 다릅니다.
show_score(82)는 화면에 82를 출력합니다. 하지만 return이 없으므로 함수의 반환값은 None이며, print(result)는 None을 출력합니다.
함수가 return 없이 끝나면 None을 반환합니다. 화면에 나타난 82가 result에 저장되는 것은 아닙니다. result + 1을 계산하면 None과 정수를 더할 수 없어 TypeError가 발생합니다.
반복 계산의 재사용¶
반복되는 계산에 이름을 붙이면 코드의 의도가 드러납니다.
점수 네 개에 normalize_score()를 적용하면 [0.82, 0.75, 0.91, 0.68]이 출력됩니다. 반복문은 점수를 하나씩 꺼내고 함수는 각 점수를 100으로 나눕니다.
계산식이 간단할 때는 굳이 함수로 나누지 않아도 됩니다. 하지만 같은 계산을 여러 곳에서 쓰거나, 이름을 붙이면 의도가 더 분명해질 때 함수가 유용합니다.
데이터 한 건을 처리하는 함수¶
AI 실습에서는 데이터 한 건(sample)을 처리하는 함수를 자주 만들 수 있습니다.
샘플에 "text"와 "label" 키가 모두 있는지 검사합니다. 아래 입력은 두 키가 있으므로 True가 출력됩니다.
이 함수는 키 존재 여부만 검사합니다. {"text": "", "label": None}도 두 키가 있으므로 True입니다. 텍스트가 비어 있는지, 라벨이 허용된 값인지까지 검사하는 함수는 아닙니다.
여러 샘플에 대해 사용할 수 있습니다.
샘플 세 개에 같은 키 검사를 적용합니다. 두 번째 샘플에는 "label" 키가 없으므로 첫 번째와 세 번째 딕셔너리만 결과 리스트에 남습니다.
매개변수 기본값¶
함수 매개변수에는 기본값(default value)을 줄 수 있습니다.
기본 기준 60을 사용하면 점수 82는 pass이고, threshold=90을 지정하면 fail입니다. 다음 두 호출은 기준값만 다릅니다.
첫 번째 호출은 기준값을 따로 주지 않았으므로 60을 사용합니다. 두 번째 호출은 threshold=90을 직접 지정합니다.
AI 도구와 라이브러리에서도 이런 형태를 자주 봅니다.
batch_size=32learning_rate=0.001shuffle=Truemax_tokens=100
기본값은 편리하지만, 기본값이 무엇인지 모르고 쓰면 코드의 행동을 오해할 수 있습니다. 그래서 라이브러리 문서에서 기본값을 확인하는 습관이 필요합니다.
함수 객체 전달¶
Python 함수도 객체(object)이며, 함수 이름은 그 객체를 가리킵니다.
normalize = normalize_score는 함수 객체에 이름을 하나 더 붙입니다. normalize(82)의 출력도 0.82입니다.
normalize는 새 계산을 만든 것이 아니라 normalize_score 함수 객체를 다른 이름으로 가리킨 것입니다. normalize_score는 함수 객체이고, normalize_score(82)는 함수를 실행한 결과라는 차이가 있습니다.
점수 [82, 75, 91]과 처리 함수 normalize_score를 함께 전달합니다. apply_to_scores()는 각 점수에 전달받은 함수를 적용하여 [0.82, 0.75, 0.91]을 반환하고, 바깥 print()가 이를 출력합니다.
이 예시에서 apply_to_scores()는 점수 목록과 함수를 함께 받습니다. 그리고 각 점수에 그 함수를 적용합니다. function(score)를 실행할 때 전달받은 함수가 호출됩니다.
이런 방식은 이후 데이터 처리와 AI 라이브러리에서 자주 보입니다.
- 정렬 기준을 함수로 넘깁니다.
- 전처리 함수를 반복 처리에 넘깁니다.
- 평가 함수(metric function)를 학습 코드에 넘깁니다.
- 콜백(callback) 함수로 특정 시점의 동작을 지정합니다.
함수와 메서드¶
function(value)는 함수 이름으로 호출하고, value.method()는 객체에서 메서드를 찾아 호출합니다.
함수(function)는 독립적으로 정의된 처리 단위입니다. 메서드(method)는 어떤 객체(object)에 붙어 호출되는 함수처럼 보입니다.
문자열 " AI is Useful "에 공백 제거와 소문자 변환을 적용합니다. clean_text(text)는 ai is useful, text.strip()은 AI is Useful, text.lower()는 양끝 공백이 남은 ai is useful을 출력합니다.
여기서 clean_text(text)는 독립 함수 호출이고, strip()과 lower()는 문자열 객체가 제공하는 메서드입니다. 함수처럼 괄호를 붙여 호출하지만, 메서드 앞에는 대상 객체가 있습니다.
| 표현 | 입문용 설명 | 예시 |
|---|---|---|
| 함수(function) | 이름 붙은 독립 처리 단위 | clean_text(text) |
| 메서드(method) | 값 또는 객체에 붙어 호출되는 함수 형태 | text.strip() |
처리 단계 분리¶
작은 함수는 입력, 처리, 출력이 분명합니다. 반대로 함수 하나가 너무 많은 일을 하면 코드의 책임 범위가 흐려집니다.
예를 들어 다음 작업이 한 함수에 모두 들어 있다고 생각해 봅니다.
- 파일을 읽는다.
- 비어 있는 행을 제거한다.
- 점수를 숫자로 바꾼다.
- 평균을 계산한다.
- 결과를 저장한다.
이런 함수는 간단해 보여도, 나중에 일부만 고치기 어렵습니다.
사례: 공백 정리 후 빈 텍스트 제외¶
입력 [" AI is Useful ", "", " Models can FAIL "]에서 텍스트를 정리한 뒤 빈 문자열을 제외합니다. 출력은 ['ai is useful', 'models can fail']입니다.
clean_text()는 문자열 하나를 정리하고, is_not_empty()는 정리된 문자열에 글자가 남았는지 검사합니다. 입력에 공백 세 개짜리 문자열 " "을 추가해도 정리 후 빈 문자열이 되므로 출력은 같습니다. 빈 값 검사를 정리보다 먼저 하면 공백 문자열은 길이가 3이어서 통과합니다. 함수의 호출 순서가 결과에 영향을 줍니다.
사례: 만점 기준 변경¶
점수를 100으로 나누는 코드를 두 곳에 복사한 상태에서 시험 만점을 50점으로 바꿨다고 하겠습니다. 한 곳만 / 50으로 고치면 같은 40점이 한쪽에서는 0.8, 다른 쪽에서는 0.4가 됩니다.
만점을 매개변수로 받으면 같은 함수에 점수와 만점을 전달할 수 있습니다. 다음 코드는 100점 만점의 80점과 50점 만점의 40점을 모두 0.8로 반환합니다.
두 번째 호출의 만점을 100으로 바꾸면 결과는 0.4입니다. 함수로 묶으면 계산식을 한곳에서 관리할 수 있지만, 호출하는 쪽도 해당 시험의 만점을 정확히 전달해야 합니다. 이 함수는 만점이 양수이고 점수가 0부터 만점 사이인 입력을 전제로 합니다.
입력 객체 변경과 이름 재할당¶
함수에 리스트를 넘기면 매개변수는 전달받은 리스트를 가리킵니다. 함수 안에서 append()를 호출하면 호출한 쪽에서도 변경이 보입니다. 반면 매개변수 이름에 새 리스트를 할당하는 것만으로 바깥 이름이 바뀌지는 않습니다.
두 출력 모두 [82, 75, 91]입니다. 첫 함수는 공유된 리스트를 수정했고, 두 번째 함수는 함수 안의 이름만 새 리스트에 연결했습니다. 원본을 바꾸는지, 새 결과를 반환하는지는 함수를 사용하는 쪽이 알아야 할 동작입니다.
리스트 기본값의 공유¶
def collect(score, results=[]):처럼 변경 가능한 기본값을 두면 호출마다 빈 리스트를 만드는 것이 아닙니다. 기본값은 함수 정의 시 한 번 평가되므로 이전 호출에서 추가한 값이 다음 호출에도 남을 수 있습니다. 호출마다 새 결과가 필요하면 None을 기본값으로 두고 함수 안에서 리스트를 만듭니다.
출력은 [82], [75]입니다. results 인자를 생략한 두 호출은 서로 다른 리스트를 만듭니다. 반대로 같은 리스트를 인자로 직접 넘기면 그 리스트에 계속 추가됩니다.
체크리스트¶
def로 시작하는 함수 정의를 읽을 수 있다.- 매개변수(parameter)와 인자(argument)를 구분할 수 있다.
print()와return의 차이를 설명할 수 있다.- 반복되는 계산을 함수로 분리할 수 있다.
- 데이터 한 건을 처리하는 함수를 만들고, 반복문에서 재사용할 수 있다.
- Python 함수가 변수에 담기고 다른 함수에 인자로 전달될 수 있음을 설명할 수 있다.
- 함수(function)와 메서드(method)의 호출 모양 차이를 설명할 수 있다.
- 함수 이름이 코드 의도를 드러내야 함을 설명할 수 있다.
-
함수가 반복되는 처리를 이름 붙은 재사용 단위로 바꾸는 이유를 설명할 수 있다.
-
입력 리스트의 변경과 매개변수 재할당을 구분하고, 호출마다 새 리스트가 필요할 때
None기본값을 사용할 수 있다.
출처와 참고 자료¶
- Python Software Foundation, More Control Flow Tools: Defining Functions, Python 3 documentation, 확인 날짜: 2026-09-15.
def, 매개변수,return, 함수 호출 예시의 공식 근거로 사용했다. - Python Software Foundation, More Control Flow Tools: Default Argument Values, Python 3 documentation, 확인 날짜: 2026-09-15. 기본값 매개변수 예시와 mutable default 주의 설명 확인에 사용했다.
- Python Software Foundation, Function definitions, Python 3 documentation, 확인 날짜: 2026-07-20. 함수 정의 문법, 매개변수 목록, 함수 객체 생성 설명 확인에 사용했다.
- Python Software Foundation, Data model, Python 3 documentation, 확인 날짜: 2026-07-20. Python에서 함수가 객체로 다뤄질 수 있다는 설명의 배경 근거로 사용했다.
- Python Software Foundation, Classes: Method Objects, Python 3 documentation, 확인 날짜: 2026-09-15. 함수 호출과 메서드 호출 모양을 입문 수준에서 구분하는 근거로 사용했다.