Day 3 – Python 함수와 기능적 강력함
요약
Python 함수의 유연성을 극대화하는 매개변수 활용법과 변수 범위(Scope) 규칙을 다룹니다. 기본값 설정, 키워드 전용 인자, 가변 인자(*args, **kwargs) 및 LEGB 규칙을 통해 모듈화된 코드를 작성하는 방법을 설명합니다.
핵심 포인트
- 기본값 및 키워드 전용 인자를 통한 함수 호출의 안전성 확보
- *args와 **kwargs를 활용한 동적 인자 처리 방법
- LEGB 규칙을 통한 Python 변수 가시성(Scope) 이해
- 재사용 가능하고 모듈화된 코드 작성을 위한 빌딩 블록 구축
Day 3에 오신 것을 환영합니다! 오늘은 기본적인 스크립트 작성을 넘어 **재사용 가능하고, 모듈화되었으며, 매우 유연한 빌딩 블록(building blocks)**을 구축하는 단계로 넘어갑니다. Python이 인자(arguments)를 처리하는 방식, 변수 범위(variable scope)의 엄격한 규칙, 그리고 함수를 일급 시민(first-class citizens)으로 취급하여 매우 동적인 유틸리티를 만드는 방법에 대해 살펴보겠습니다. 🚀
1. 매개변수 및 인자 (기본값 및 키워드 전용) ⚙️
Python에서는 함수를 믿을 수 없을 정도로 유연하게 만드는 매개변수(parameters)를 정의할 수 있습니다.
- 기본 인자 (Default Arguments): 호출자가 인자를 제공하지 않을 경우 매개변수에 대한 폴백(fallback) 값을 설정할 수 있게 해줍니다.
- 키워드 전용 인자 (Keyword-Only Arguments): 특정 인자가 위치(position)가 아닌 이름에 의해 반드시 전달되어야 하도록 강제합니다. 매개변수 목록에 별표
*를 배치하여 이를 선언하며,*뒤에 오는 모든 것은 반드시 이름을 지정해야 합니다.
🌱 쉬운 시작 예제
# 'msg'는 기본값을 가집니다. 'shout'은 키워드 전용 인자입니다.
def greet(name, msg="Hello", *, shout=False):
greeting = f"{msg}, {name}!"
...
실무 적용 예시: API 요청 설정기 🔌
# API 타임아웃 및 토큰 가시성에 대한 안전한 기본값 강제
def send_request(url, payload, *, timeout=10, retries=3):
print(f"Sending data to {url} (Timeout: {timeout}s, Retries: {retries})")
...
2. *args 및 kwargs (동적 인자 개수) 📦
때로는 사용자가 함수에 정확히 몇 개의 인자를 전달할지 알 수 없는 경우가 있습니다.
- **
*args**는 추가적인 위치 인자(positional arguments)를 **튜플 (Tuple)**로 수집합니다. - **
kwargs**는 추가적인 키워드 인자(keyword arguments)를 **딕셔너리 (Dictionary)**로 수집합니다.
🌱 쉬운 시작 예제
def dynamic_demo(*args, **kwargs):
print("args:", args) # 위치 인자의 튜플
print("kwargs:", kwargs) # 키워드 인자의 딕셔너리
...
실무 적용 예시: HTML 요소 생성기 🎨
def build_html_tag(tag_name, *content, **attributes):
# attributes 딕셔너리를 key="value" 형태의 문자열로 포맷팅
attr_str = "".join([f' {key}="{val}"' for key, val in attributes.items()])
...
3. Scope & LEGB 규칙 🌐
Python에서 변수의 가시성(Visibility)은 LEGB 규칙에 의해 제어됩니다. 변수 이름을 조회할 때, Python은 엄격한 순서에 따라 네 가지 스코프(Scope)를 확인합니다:
- Local (지역): 현재 함수 내부.
- Enclosing (포괄): 외부 함수 내부 (중첩 함수/클로저와 관련됨).
- Global (전역): 모듈/파일의 최상위 레벨.
- Built-in (내장): Python에 미리 로드된 키워드 (예:
len,sum,print).
🌱 쉬운 입문 예제
x = "Global"
def outer_function():
...
실무 적용 예제: Enclosing Scope 수정하기 🔧
# Global 또는 Enclosing 스코프의 변수를 수정하려면 'global' 또는 'nonlocal'을 사용합니다
def create_click_counter():
count = 0 # Enclosing scope 변수
...
4. First-Class Functions & Closures (일급 함수와 클로저) 🤝
Python에서 함수는 **First-Class Citizens (일급 시민)**입니다. 이는 함수를 변수에 할당할 수 있고, 다른 함수의 인자로 전달할 수 있으며, 심지어 다른 함수에서 반환(return)할 수도 있음을 의미합니다.
**Closure (클로저)**는 외부 함수가 실행을 마친 후에도, 자신을 둘러싼 외부 스코프(Enclosing outer scope)의 변수를 "기억"하고 접근할 수 있는 내부 함수를 말합니다.
🌱 쉬운 입문 예제
def make_multiplier(factor):
# 이것은 클로저입니다! 'factor'를 기억합니다.
def multiply(number):
...
실무 적용 예제: 커스텀 로거 생성기 📝
import datetime
# 특정 접두사 헤더를 가진 맞춤형 로거를 생성합니다
...
5. 연습 과제: 재사용 가능한 유틸리티 함수 구축하기 🏋️
지금까지 배운 모든 규칙을 결합하여 견고한 **Data Processing Utility Engine (데이터 처리 유틸리티 엔진)**을 구축해 봅시다.
우리는 커스텀 변환(Transformation), 필터링 규칙을 적용하고 폴백(Fallback) 설정 기본값을 적용하여 데이터 테이블(딕셔너리 리스트)을 처리하는 재사용 가능한 유틸리티 함수를 만들고자 합니다.
# 1. 커스텀 변환 함수 (First-Class Functions)
def tax_calculator(amount):
return amount * 1.15
...
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기