PythonPython 기초 · 3입문

함수와 모듈 — 코드를 재사용 가능하게 만들기

Python함수모듈defimport기초

같은 코드를 반복 쓰고 있다면

# ❌ 반복되는 코드
print(f"안녕하세요, 철수님!")
print(f"안녕하세요, 영희님!")
print(f"안녕하세요, 민준님!")

# ✅ 함수로 묶기
def greet(name):
    print(f"안녕하세요, {name}님!")

greet("철수")
greet("영희")
greet("민준")

함수는 이름 붙인 코드 묶음입니다. 한 번 정의하고 여러 번 호출합니다.


함수 기본 구조

flowchart LR
    DEF["def 함수이름(파라미터):"] --> BODY["    코드 블록\n    (들여쓰기 필수)"]
    BODY --> RET["    return 반환값"]
def add(a, b):
    result = a + b
    return result

total = add(3, 5)
print(total)   # 8

return: 값 반환하기

def get_grade(score):
    if score >= 90:
        return "A"
    elif score >= 80:
        return "B"
    elif score >= 70:
        return "C"
    else:
        return "F"

grade = get_grade(85)
print(f"학점: {grade}")  # 학점: B

return을 만나면 함수가 즉시 종료되고 값을 반환합니다.


기본값 파라미터

def greet(name, greeting="안녕하세요"):
    print(f"{greeting}, {name}님!")

greet("철수")               # 안녕하세요, 철수님!
greet("영희", "반갑습니다")  # 반갑습니다, 영희님!

기본값이 있는 파라미터는 뒤쪽에 위치해야 합니다.


키워드 인자

def create_profile(name, age, job="미정"):
    return f"{name}({age}세), 직업: {job}"

# 순서 상관없이 이름으로 전달
print(create_profile(age=30, name="철수", job="개발자"))

여러 값 반환

def get_stats(numbers):
    minimum = min(numbers)
    maximum = max(numbers)
    average = sum(numbers) / len(numbers)
    return minimum, maximum, average   # 튜플로 반환

scores = [85, 92, 78, 96, 88]
low, high, avg = get_stats(scores)     # 언패킹
print(f"최소: {low}, 최대: {high}, 평균: {avg:.1f}")

가변 인자: *args, **kwargs

# *args: 위치 인자를 튜플로 받기
def sum_all(*numbers):
    total = 0
    for n in numbers:
        total += n
    return total

print(sum_all(1, 2, 3))         # 6
print(sum_all(1, 2, 3, 4, 5))   # 15

# **kwargs: 키워드 인자를 딕셔너리로 받기
def print_info(**info):
    for key, value in info.items():
        print(f"{key}: {value}")

print_info(name="철수", age=25, job="개발자")

타입 힌트 (Type Hints)

def add(a: int, b: int) -> int:
    return a + b

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

def get_stats(numbers: list[float]) -> dict:
    return {"min": min(numbers), "max": max(numbers)}

실행에 영향은 없지만, 코드 가독성과 IDE 자동완성에 도움이 됩니다. LLM API 코드에서 많이 씁니다.


모듈: 다른 파일의 코드 가져오기

flowchart LR
    A["내 코드\nmain.py"] -->|"import"| B["표준 라이브러리\nmath, os, json..."]
    A -->|"import"| C["외부 패키지\nopenai, requests..."]
    A -->|"import"| D["내 모듈\nutils.py"]
# 모듈 전체 import
import math
print(math.pi)         # 3.14159...
print(math.sqrt(16))   # 4.0

# 특정 함수만 import
from math import sqrt, ceil
print(sqrt(25))        # 5.0
print(ceil(3.2))       # 4

# 별칭 사용
import os.path as osp
print(osp.exists("./README.md"))

자주 쓰는 표준 라이브러리

# random: 무작위
import random
print(random.randint(1, 100))        # 1~100 랜덤 정수
print(random.choice(["가", "나", "다"]))  # 랜덤 선택
random.shuffle([1, 2, 3, 4, 5])      # 리스트 섞기

# datetime: 날짜/시간
from datetime import datetime, timedelta
now = datetime.now()
print(now.strftime("%Y-%m-%d %H:%M"))   # 2024-03-15 14:30
tomorrow = now + timedelta(days=1)

# os: 운영체제 관련
import os
print(os.getcwd())              # 현재 작업 디렉토리
os.makedirs("./output", exist_ok=True)  # 폴더 생성

# json: JSON 처리
import json
data = {"name": "철수", "age": 25}
json_str = json.dumps(data, ensure_ascii=False)  # dict → JSON 문자열
parsed = json.loads(json_str)   # JSON 문자열 → dict

내 모듈 만들기

# utils.py 파일 생성
def celsius_to_fahrenheit(c: float) -> float:
    return c * 9/5 + 32

def format_price(price: int) -> str:
    return f"{price:,}원"

GREETING = "안녕하세요"
# main.py에서 사용
from utils import celsius_to_fahrenheit, format_price, GREETING

print(celsius_to_fahrenheit(100))   # 212.0
print(format_price(1234567))        # 1,234,567원
print(GREETING)                     # 안녕하세요

lambda: 간단한 익명 함수

# 일반 함수
def double(x):
    return x * 2

# lambda (한 줄 함수)
double = lambda x: x * 2
print(double(5))   # 10

# 주로 sorted, filter, map과 함께 사용
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
sorted_nums = sorted(numbers, key=lambda x: -x)   # 내림차순
print(sorted_nums)  # [9, 6, 5, 4, 3, 2, 1, 1]

정리

개념문법용도
함수 정의def name(param):코드 재사용
반환값return value결과 전달
기본값def f(x, y=10):선택적 파라미터
가변 인자*args, **kwargs유연한 입력
타입 힌트def f(x: int) -> str:가독성 향상
importimport module외부 코드 사용

다음 편에서는 리스트와 딕셔너리 — 파이썬에서 가장 많이 쓰는 자료구조를 배웁니다.

궁금한 점이 있으신가요?

협업·의뢰는 아래로, 가벼운 소통은 인스타그램 @bluefox._.hi도 환영이에요.