04. Python 기초 — 함수

🎯 이 장의 목표
  • 함수가 무엇이고 왜 쓰는지 안다
  • 내장 함수와 직접 만든 함수(사용자 정의 함수)를 구분한다
  • 람다(lambda), map, filter를 이해하고 간단히 쓴다

먼저: 함수가 뭔가요?

함수(function)입력을 받아 정해진 일을 하고 결과를 돌려주는, 이름 붙은 코드 묶음입니다. 자판기에 비유하면, 동전(입력)을 넣으면 음료(출력)가 나오는 것과 같습니다. 같은 작업을 여러 번 할 때, 매번 코드를 다시 쓰지 않고 함수 하나로 재사용합니다.

우리는 이미 함수를 써 왔습니다. print(), len(), int()가 전부 함수입니다.

내장 함수: 파이썬이 기본 제공

파이썬에 처음부터 들어 있는 함수를 내장 함수(built-in function)라 합니다. 자주 쓰는 것들:

PYTHON
nums = [3, 1, 4, 1, 5, 9]
print(len(nums))     # 개수
print(sum(nums))     # 합계
print(max(nums))     # 최댓값
print(min(nums))     # 최솟값
print(sorted(nums))  # 정렬된 새 리스트

실행 결과:

CODE
6
23
9
1
[1, 1, 3, 4, 5, 9]

💡 : sum, max, min 같은 발상은 Pandas에서도 그대로 이어집니다. 데이터 한 열의 합계·최댓값을 구하는 일이 분석의 기본이니까요.

사용자 정의 함수: 내가 직접 만들기

def(define, 정의하다) 키워드로 나만의 함수를 만듭니다.

PYTHON
def greet(name):
    return f"안녕하세요, {name}님!"

message = greet("철수")
print(message)

실행 결과:

CODE
안녕하세요, 철수님!

구조를 뜯어보면:

  • def greet(name):greet라는 이름의 함수를 정의. name입력(매개변수).
  • return ... — 함수가 돌려줄 결과값. return한 값을 변수에 받아 쓸 수 있습니다.
🔑 새 용어
  • 매개변수(parameter): 함수가 받는 입력 자리(name).
  • 인자(argument): 실제로 넣어 준 값("철수").
  • 반환(return): 함수가 결과를 돌려주는 것. return이 없으면 함수는 None(아무것도 없음)을 돌려줍니다.

입력을 여러 개 받고 기본값 주기

PYTHON
def add_tax(price, rate=0.1):     # rate는 기본값 0.1
    return price * (1 + rate)

print(add_tax(10000))         # rate 생략 → 기본값 0.1 사용
print(add_tax(10000, 0.2))    # rate를 0.2로 지정

실행 결과:

CODE
11000.0
12000.0
💡 팁
기본값(default value): 매개변수에 =값으로 미리 정해 두면, 호출할 때 생략 가능합니다. Pandas 함수들도 수많은 기본값을 갖고 있어서, 우리는 필요한 것만 바꿔 쓰면 됩니다.

람다(lambda): 한 줄짜리 작은 함수

이름 붙일 필요 없는 아주 간단한 함수lambda로 한 줄에 만들 수 있습니다.

일반 함수:

PYTHON
def double(x):
    return x * 2

같은 것을 람다로:

PYTHON
double = lambda x: x * 2
print(double(5))

실행 결과:

CODE
10

읽는 법: lambda 입력: 결과. "x를 받아 x * 2를 돌려주는 함수."

💡 람다 자체를 변수에 담아 쓰는 일은 드뭅니다. 보통은 아래 map·filter나 Pandas의 apply처럼 "함수를 인자로 넘기는" 자리에서 즉석으로 씁니다. Pandas에서 한 열을 통째로 변환할 때 람다를 자주 만나게 됩니다.

map: 모든 요소에 함수 적용

map(함수, 목록)은 목록의 모든 요소에 함수를 적용한 결과를 만들어 줍니다.

PYTHON
nums = [1, 2, 3, 4]
doubled = list(map(lambda x: x * 2, nums))
print(doubled)

실행 결과:

CODE
[2, 4, 6, 8]

읽는 법: "nums의 각 요소에 x*2를 적용해라." (map 결과는 list()로 감싸야 리스트로 보입니다.)

💡 팁
컴프리헨션 [x * 2 for x in nums]로도 똑같이 됩니다. 둘 다 알아두되, 입문 단계에선 읽기 쉬운 컴프리헨션을 더 권합니다.

filter: 조건에 맞는 것만 거르기

filter(함수, 목록)은 함수가 True를 주는 요소만 남깁니다.

PYTHON
nums = [1, 2, 3, 4, 5, 6]
evens = list(filter(lambda x: x % 2 == 0, nums))
print(evens)

실행 결과:

CODE
[2, 4, 6]

읽는 법: "nums에서 x가 짝수인(조건이 참인) 것만 걸러라."

도구하는 일컴프리헨션으로는
map(f, 목록)모든 요소를 변환[f(x) for x in 목록]
filter(f, 목록)조건 맞는 것만 남김[x for x in 목록 if f(x)]

🛠 미니 챌린지

  1. 섭씨를 화씨로 바꾸는 함수 c_to_f(c)를 만드세요. (화씨 = 섭씨 × 9/5 + 32). c_to_f(100)을 출력하세요.
  2. map을 써서 [1, 2, 3, 4]의 각 요소를 제곱한 리스트를 만드세요.
  3. filter를 써서 [15, 22, 8, 31, 4]에서 10보다 큰 수만 남기세요.

✅ 미니 챌린지 해설

PYTHON
# 1. 사용자 정의 함수
def c_to_f(c):
    return c * 9/5 + 32

print(c_to_f(100))

실행 결과: 212.0

PYTHON
# 2. map으로 제곱
nums = [1, 2, 3, 4]
squares = list(map(lambda x: x ** 2, nums))
print(squares)

실행 결과: [1, 4, 9, 16]

PYTHON
# 3. filter로 10 초과만
nums = [15, 22, 8, 31, 4]
big = list(filter(lambda x: x > 10, nums))
print(big)

실행 결과: [15, 22, 31]

이 장에서 배운 것

  • 함수는 입력을 받아 일을 하고 return으로 결과를 돌려주는 재사용 가능한 코드 묶음이다.
  • def 이름(매개변수):로 직접 함수를 만들고, 매개변수에 기본값을 줄 수 있다.
  • lambda는 한 줄짜리 익명 함수로, 함수를 인자로 넘기는 자리에서 즉석으로 쓴다.
  • map은 모든 요소 변환, filter는 조건에 맞는 요소만 남긴다.

✍️ 확인 문제

  1. 매개변수(parameter)와 인자(argument)의 차이는 무엇인가요?
  2. 함수에서 return을 쓰지 않으면 무엇이 반환되나요?
  3. filter(lambda x: x > 0, [-2, 3, -1, 5])의 결과는 무엇인가요?
Python 기초의 마지막입니다. 다음은 숫자 계산을 빠르게 해주는 NumPy로, Pandas의 토대가 되는 도구입니다.
👉 05. NumPy 기초