같은 코드를 반복 쓰고 있다면
# ❌ 반복되는 코드
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: | 가독성 향상 |
| import | import module | 외부 코드 사용 |
다음 편에서는 리스트와 딕셔너리 — 파이썬에서 가장 많이 쓰는 자료구조를 배웁니다.