
파이썬에서 함수(Function)의 구조적 역할과 사용 방식을 기술적으로 정리한다.
함수는 프로그램을 기능 단위로 분리하고, 로직 재사용 및 유지보수성을 확보하는 핵심 요소이다.
상편에서는 함수 정의부(Definition)와 입력 구조(Parameter System)를 중심으로 설명한다.
특히 다음 요소들을 체계적으로 다룬다.
함수 정의 구조(def, 본문, 반환값)
매개변수(Parameter)와 인자(Argument)의 개념적 차이
위치·키워드·기본값 인자 구성 방식
가변 인자(*args, **kwargs)를 통한 입력 확장성
매개변수 선언 순서 규칙 및 인터페이스 설계 원칙
이 상편은 이후 스코프, 전역 상태, 재귀 구조 등 함수 실행 모델을 이해하는 기반 역할을 한다.
1. 함수란 무엇인가?
함수: 특정 작업을 수행하는 코드 블록으로, "호출할 때만 실행"된다.
복잡한 코드를 기능 단위로 쪼개서
이름을 붙이고
입력(매개변수)을 받고
출력(반환값)을 돌려주는 구조
수학의 함수
하나의 입력 ⇒ 하나의 출력
y = f(x) 같은 형태
프로그래밍의 함수
여러 개의 입력, 여러 개의 반환값도 가능
화면 출력, 파일 저장, 상태 변경과 같은 부수효과(side effect)를 포함할 수 있다.

2. 함수의 필요성
같은 작업을 여러 번 해야 할 때
수정이 필요하면 함수 정의부만 수정하면 됨
복잡한 로직을 기능 단위로 이름 붙인 함수로 쪼개면
코드의 의도가 명확해지고
다른 사람이 읽고 이해하기 쉬워짐
큰 프로그램을 여러 개의 작은 작업(함수)으로 나누어 계층적으로 설계
각 함수는 하나의 "기능"만 담당하는 것이 원칙 ⇒ 단일 책임 원칙
팀원 간에 "이 함수는 내가, 저 함수는 네가"처럼 작업 분담이 쉬워짐
작은 함수들을 쌓아서 더 큰 기능을 구성하는 계층적 설계에 유리
3. 내장 함수와 사용자 정의 함수
파이썬이 기본 제공하는 함수들
언제든 바로 사용 가능
예) print(), len(), type(), sum() 등
def 키워드로 정의하는 함수4. 사용자 정의 함수의 기본 문법
def 키워드

함수 이름
함수를 구분하는 식별자
파이썬에서는 일반적으로 snake_case 사용

매개변수

콜론(:) & 들여쓰기

return문
함수의 결과 값을 반환
return을 만나면 함수는 즉시 종료
return을 쓰지 않으면 자동으로 None 반환

괄호(): 함수에 전달할 값이 없더라도 실행 시 괄호 반드시 필요
인자: 함수 호출 시 전달하는 값


⇒ return 이 없으므로 None 반환

⇒ 함수 사용 예시
실습1. 사칙연산 계산기 함수 만들기
두 개의 숫자와 연산자를 받아 해당 연산 결과를 반환하는 함수를 작성하세요.
함수 이름은 calculate로 합니다.
매개변수는 num1, num2, operator 세 개입니다.
operator는 문자열이며, 다음 중 하나 입니다.: "+", "-", "×", "÷"
올바르지 않은 연산자가 들어오면 "지원하지 않는 연산입니다."라는 문자열을 반환하세요.
5. 매개변수와 인자
매개변수(Parameter): 함수 정의부에서 사용하는 이름
인자(Argument): 함수 호출 시 실제로 전달되는 값

6. 인자의 종류: 위치 / 키워드 / 기본값
전달된 순서대로 매개변수에 대응되는 방식
가장 일반적인 전달 방식
매개변수 개수와 인자 개수가 다르면 TypeError 발생

인자의 이름을 명시하여 전달하는 방식
순서와 상관없이 대응 가능, 순서를 헷갈릴 때 안전

함수 정의 시 매개변수에 기본값을 지정해 두는 방식
호출 시 해당 인자를 생략하면 기본값 사용
기본값 매개변수는 반드시 뒤쪽에 위치해야 함

7. 가변인자
*args/**kwargs
*args여러 개의 위치 인자를 하나의 튜플로 받는 방식
함수 정의 시 관례적으로 이름을 *args 로 씀

**kwargs여러 개의 키워드 인자를 딕셔너리 형태로 받는 방식
함수 정의 시 관례적으로 이름을 **kwargs 로 씀

함수 정의 시 매개변수는 다음 순서를 지켜야 한다.
위치 매개변수
기본값 매개변수
*args
**kwargs

8. 매개변수 전달 방식
파이썬은 전통적인 Call by Value 또는 Call by Reference와 동일하지 않으며,
객체의 참조(reference)를 전달하는 모델(Call by Object Reference)을 사용한다.
immutable VS mutable변경 불가능(immutable) 객체
int, float, str , tuple 등
함수 안에서 값을 "변경"하려고 하면 새 객체가 만들어짐
변경 가능(mutable) 객체
list, dict, set 등
함수 안에서 내용을 변경하면 함수 바깥에도 영향

실습2. 가변인자 연습하기
2.5
watermelon
사용자의 이름, 나이, 이메일 등의 정보를 받아 출력하는 함수를 **kwargs로 구현하세요.
정보가 몇 개 들어오든 모두 출력해야 합니다.
name: wdh
age: 23
email: wdh@example.com
상품 가격 목록을 **kwargs로 받아 각각 10%씩 할인된 가격을 출력하는 함수를 작성하세요.
상품명: bag 원가: 50000 할인가: 45000
상품명: shoes 원가: 100000 할인가: 90000
상품명: dress 원가: 120000 할인가: 108000
9. 실무 예시
입력 구간 수가 정해져 있지 않을 때 *args 가 매우 유용하다.
상편에서 배운 "가변 인자로 입력 확장성 확보" 개념의 실전 적용
mutable 객체를 다룰 때는 .copy()로 원본 보호
입력 확장이 자연스럽고, 실무에서 실제로 많이 쓰는 구조
list는 mutable이라 함수 내부 변경이 외부에도 반영된다.
상편 마지막 학습 범위인 mutable / immutable 전달 방식과 정확히 맞물림.
10. 함수(상) 한눈에 보기
함수 정의 구조: def 키워드, 매개변수 목록, 들여쓰기 블록, 선택적 return
반환값(Return): return 지정 시 결과 반환, 없으면 None 자동 반환
매개변수(Parameter) VS 인자(Argument)
매개변수: 함수 정의부에서 사용되는 이름
인자: 함수 호출 시 전달되는 실제 값
위치 인자(Positional Argument): 인자 순서가 매개변수 순서와 1:1 대응됨
키워드 인자(Keyword Argument): 매개변수 이름을 명시하여 전달, 순서와 무관
기본값 인자(Default Argument): 기본값은 뒤쪽 매개변수부터 설정 가능, 호출 시 생략 가능
가변 인자 (*args): 여러 개의 위치 인자를 튜플 형태로 수신
가변 키워드 인자 (**kwargs): 여러 개의 키워드 인자를 딕셔너리로 수신
매개변수 선언 순서 규칙: 위치 인자 → 기본값 인자 → *args → **kwargs
mutable/immutable 전달 특성
immutable(int, str, tuple) → 함수 내부 변경이 원본에 영향 없음
mutable(list, dict, set) → 함수 내부 변경이 원본에도 반영됨
11. 아웃트로
상편에서는 함수 정의 구조, 다양한 형태의 매개변수 구성,
가변 인자를 통한 입력 확장 방식, mutable/immutable 기반 전달 방식까지 정리했다.
즉, 함수의 입력 구조를 설계하는 데 필요한 핵심 요소들을 체계적으로 정리한 것이다.
이 단계에서 함수 호출 시의 입력 흐름과 데이터 변경 가능성을 이해하면 이후에 이어지는 스코프 탐색 규칙, 전역 상태 관리, 재귀 호출, 람다 함수 등 함수 실행 환경과 관련된 심화 개념을 보다 명확하게 이해할 수 있다.
하편에서는 함수 호출 시 이름이 어떻게 탐색되고, 전역/지역 상태가 어떻게 관리되며, 재귀 호출과 람다 함수가 어떤 구조로 동작하는지 구체적으로 분석한다.