Python for AI, Embedded/Python: Core & Automation

파이썬(Python) 함수 정의와 사용법: 다양한 인자 전달 방식부터 람다(Lambda) 활용까지

임베디드 친구 2025. 6. 29. 17:02
반응형

그동안 파이썬의 핵심 4대 자료구조를 다루며 데이터를 담는 바구니들을 마스터해 보았습니다. 이제는 이 데이터들을 가지고 실제로 원하는 기능을 수행하게 만드는 '로직의 단위'를 조립할 시간입니다. 프로그래밍을 하다 보면 똑같은 연산이나 출력 구문을 코드 이곳저곳에 반복해서 적어야 할 때가 많습니다. 코드가 중복되면 분량이 길어질 뿐만 아니라, 나중에 로직을 수정해야 할 때 모든 곳을 찾아다니며 고쳐야 하는 재앙이 발생합니다. 파이썬에서는 특정 동작을 수행하는 코드 덩어리를 '함수(Function)'라는 상자에 예쁘게 담아두고 필요할 때마다 이름만 불러 재사용할 수 있습니다. 오늘은 함수의 기초적인 정의부터 유연한 인자 전달 기법, 그리고 일회성으로 가볍게 쓰는 람다 함수까지 핵심 바이블을 정리해 드리겠습니다.

Generated by Gemini AI.

📌 핵심 요약 3줄

  • 함수는 def 키워드를 사용해 정의하며, 위치 인자·키워드 인자·기본값 인자 및 가변 인자(*args, kwargs)를 활용해 다양한 형태로 호출할 수 있습니다.
  • return 키워드는 함수의 연산 결과를 호출한 곳으로 돌려주는 동시에 함수를 즉시 종료시키며, 반환값이 없는 함수는 암묵적으로 None을 반환합니다.
  • 람다(Lambda) 함수는 이름이 없는 익명 함수로, 한 줄짜리 단순한 로직을 map(), filter() 등 다른 함수의 인자로 일회성 전달할 때 유용합니다.

1. 한눈에 보는 파이썬 인자(Arguments) 전달 방식

함수를 호출할 때 데이터를 넘겨주는 방식은 다양합니다. 각 전달 방식의 메커니즘과 특징을 표로 명확하게 비교해 보았습니다.

인자 종류 데이터 전달 방식 핵심 매커니즘 및 특징 대표적인 호출 코드 예시
위치 인자 순서대로 대입 매개변수가 선언된 **순서(위치)**에 맞춰 값이 전달됨 add(3, 5)
키워드 인자 이름을 지정하여 대입 순서와 상관없이 매개변수 이름을 명시하여 명확하게 매핑 introduce(age=30, name="Alice")
기본값 인자 생략 시 디폴트 적용 인자를 주지 않으면 미리 설정해 둔 기본값이 자동으로 입력됨 def greet(name="Guest"):
가변 위치 인자 *args (튜플 패킹) 개수가 정해지지 않은 복수의 인자들을 튜플 하나로 묶어서 받음 print_args(1, 2, 3, 4)
가변 키워드 인자 **kwargs (딕셔너리 패킹) 개수가 정해지지 않은 키워드 인자들을 딕셔너리로 묶어서 받음 print_kwargs(id="head", level=5)

2. 함수의 기본 정의와 호출, 그리고 반환값

파이썬에서 함수는 def 키워드로 문을 열고, 들여쓰기를 통해 함수의 본문을 작성합니다.

Python
 
# 1. 반환값이 없는 단순 출력 함수
def greet():
    print("Hello, World!")

greet()  # 함수 호출 (출력: Hello, World!)

# 2. 데이터를 받아 계산 후 결과를 돌려주는 함수
def multiply(a, b):
    return a * b  # 결과를 반환하고 함수를 즉시 종료

result = multiply(4, 5)
print(result)  # 출력: 20

💡 알아두기: 파이썬의 모든 함수는 무엇인가를 반드시 반환합니다. 만약 내부 로직에 return 키워드가 없거나 뒤에 아무것도 적지 않았다면, 파이썬은 배후에서 암묵적으로 공백을 뜻하는 None 객체를 반환합니다.


3. 다채로운 인자(Argument) 전달의 묘미

매개변수 구조를 유연하게 설계하면 하나의 함수로 수만 가지 상황에 대처할 수 있습니다. 특히 가변 인자는 데이터의 개수가 유동적인 실무 환경에서 빛을 발합니다.

Python
 
# 기본값 인자와 키워드 인자의 조합
def introduce(name, age=20):
    print(f"이름은 {name}이고 나이는 {age}세입니다.")

introduce("톰")                 # 나이를 생략하면 기본값 20 적용
introduce(age=25, name="제인")  # 키워드를 지정하면 순서가 바뀌어도 안전함

# 가변 인자(*args, **kwargs)의 실전 활용
def super_func(*args, **kwargs):
    print(args)    # 위치 인자들이 튜플로 출력됨
    print(kwargs)  # 키워드 인자들이 딕셔너리로 출력됨

super_func(1, 2, 3, status="active", mode="debug")
# 출력: (1, 2, 3) 및 {'status': 'active', 'mode': 'debug'}

4. 한 줄짜리 간결한 익명 상자, 람다(Lambda) 함수

람다 함수는 복잡한 def 선언 과정 없이 lambda 매개변수: 표현식 구조로 한 줄 만에 함수를 구현하는 기법입니다. 주로 다른 내장 함수의 필터링 조건이나 변환 조건으로 일회성 투입될 때 코드가 놀랍도록 간결해집니다.

Python
 
# 1. 변수에 담아 쓰는 기본적인 람다 (실무에서는 자주 쓰이지 않는 형태입니다)
add = lambda x, y: x + y
print(add(3, 7))  # 출력: 10

# 2. 실무 패턴: 내장 함수(map, filter)의 인자로 즉시 주입하기
numbers = [1, 2, 3, 4, 5]

# map(): 리스트의 모든 요소를 하나씩 람다식에 대입해 제곱 리스트 생성
squared = list(map(lambda x: x ** 2, numbers))  # [1, 4, 9, 16, 25]

# filter(): 람다식의 조건 결과가 참(True)인 요소만 걸러내기
evens = list(filter(lambda x: x % 2 == 0, numbers))  # [2, 4]

5. 개발을 위한 팁

  • 가변 인자 뒤에 일반 인자를 둘 때는 명확한 이정표를 세우세요: def func(*args, regular): 처럼 가변 인자 뒤에 일반 매개변수를 배치하면 파이썬은 어디까지가 가변 인자인지 구분하지 못합니다. 따라서 가변 인자 뒤에 오는 일반 변수들은 함수를 호출할 때 반드시 func(1, 2, 3, regular="명시") 처럼 키워드 인자 형태로 이름을 찍어서 넘겨주어야 오류가 나지 않습니다.
  • 복잡한 로직은 람다 대신 무조건 일반 함수로 승부하세요: 람다는 오직 한 줄의 표현식만 가질 수 있어서 내부에서 if-else 구조가 복잡하게 얽히거나 여러 줄의 연산이 들어가면 가독성이 끔찍하게 나빠집니다. 코드가 두 줄 이상 길어질 것 같다면 람다를 고집하지 말고 단정하게 def로 일반 함수를 선언해 구현하는 것이 클린 코드의 정석입니다.

6. 흔히 하는 실수

  • 기본값 인자의 위치를 잘못 배치하는 실수: def greet(name="Guest", age): 와 같이 기본값이 있는 매개변수를 기본값이 없는 매개변수보다 앞에 선언하면 파이썬은 SyntaxError: non-default argument follows default argument라는 에러를 던집니다. 기본값이 설정된 인자는 호출 시 생략이 가능하므로, 헷갈림을 막기 위해 항상 매개변수 목록의 가장 오른쪽(맨 뒤)에 몰아서 배치해야 합니다.
  • 기본값 인자 자리에 가변 객체(리스트, 딕셔너리)를 넣는 대참사: def append_to(element, target_list=[]): 형태로 기본값 자리에 빈 리스트를 넣어두면, 함수를 호출할 때마다 새로운 빈 리스트가 생성될 것 같지만 그렇지 않습니다. 파이썬은 함수가 정의되는 시점에 딱 한 번만 기본값 리스트를 생성하고 이를 공유합니다. 이 때문에 함수를 인자 없이 연속 호출하면 이전 호출 때 누적된 데이터가 리스트에 그대로 남아 시한폭탄 같은 버그를 유발하니, 가변 객체 초기화가 필요할 때는 기본값으로 None을 두고 내부에서 처리해야 합니다.
Python
 
# [올바른 가변 객체 기본값 처리 패턴]
def append_to(element, target_list=None):
    if target_list is None:
        target_list = []  # 호출되는 시점에 안전하게 독립된 새 리스트 생성
    target_list.append(element)
    return target_list

💡 맺음말

이번 시간에는 파이썬의 핵심 기둥인 함수(Function)의 탄탄한 정의법부터 인자 전달 시나리오, 그리고 코드를 가볍게 다이어트해 주는 람다 함수의 실무 적용법까지 상세하게 짚어보았습니다. 함수를 적재적소에 쪼개고 설계하는 안목을 기르면 거대한 프로그램도 레고 블록을 조립하듯 즐겁게 구현해 낼 수 있습니다.

가변 인자 패킹 구조가 헷갈리거나 람다식 매핑 중 예상치 못한 None 반환 버그를 마주치셨다면 주저하지 말고 아래 댓글로 질문을 던져주세요. 성심껏 도와드리겠습니다. 감사합니다!

반응형