250723 [ Day 13 ] - Python (10)

TaeHyun·2025년 7월 23일

TIL

목록 보기
13/182

시작하며

어제 여러 가변 인자 관련 문제를 풀어보면서 사용법에 어느 정도 감이 잡힌 것 같다.
오늘은 재귀 함수와 람다 함수에 대해 배웠는데, 역시 개념적으로 복잡한 느낌이 들어 충분한 복습이 필요할 것 같다.

재귀 함수 (Recursive Function)

  • 자기 자신을 호출하는 함수
  • 반드시 기본 조건 (종료 조건) 이 있어야 함
  • 큰 문제를 작은 문제로 나누었을 때 일정한 패턴이 있어야 함
def recursive_func(n):
    # 기본 조건
    if n == 0:
        return
    print("재귀 호출", n)
    recursive_func(n-1)

recursive_func(5)
# 재귀 호출 5
# 재귀 호출 4
# 재귀 호출 3
# 재귀 호출 2
# 재귀 호출 1
  • 예시 1 (거듭 제곱)
    # 거듭 제곱
    # 반복문으로 구현
    def power_for(a, n):
        result = 1
        for i in range(n):
            result *= a
        return result
    
    print(power_for(4, 3))
    # 64
    
    # 재퀴함수로 구현
    def power_rec(a, n):
        if n == 0:
            return 1
        return a * power_rec(a, n-1)
    
    print(power_rec(4, 3))
    # 64
  • 예시 2 (팩토리얼)
    # 반복문으로 구현
    def factorial_for(n):
        result = 1
        for i in range(1, n+1):
            result *= i
        return result
    print(factorial_for(5))
    # 120
    
    # 재귀함수로 구현
    def fact(n):
        if n == 0 or n == 1:
            return 1
        return n * fact(n-1)
    print(fact(5))
    # 120
  • 예시 3 (피보나치)
    # 반복문
    def fibo_num(n):
        if n < 0:
            return 0
        a, b = 0, 1
        for _ in range(n-1):
            a, b = b, a + b 
        return b
    print(fibo_num(6))
    # 8
    
    # 재귀함수
    def fibo_rec(n):
        if n < 0:
            return 0
        elif n == 1:
            return 1
        return fibo_rec(n-1) + fibo_rec(n-2)
    print(fibo_rec(6))
    # 8

재귀 함수의 장단점

  • 장점
    • 코드가 직관적이고 간결함
    • 문제 해결을 논리적으로 표현 가능
    • 일부 알고리즘에 적합
  • 단점
    • 스택 오버플로우 (Stack Overflow) 위험
    • 반복문보다 성능이 낮음
    • 메모리 사용량 증가

람다 함수 (Lambda Function)

람다 함수 = 익명 함수

  • 간단한 함수를 한줄로 표현할 때 사용

람다 함수의 활용

  • 기본 문법
    • lambda 매개변수: 표현식
# 일반 함수
def add(x, y):
    return x + y
# 람다 함수
lambda x, y: x + y
  • 람다 함수를 재활용 하려면 변수에 담아서 활용
    • add_func = lambda x, y: x + y
    • add_func(3, 5)
  • 람다로 값을 반환하고 사용을 끝내는 경우
    • (lambda x: x ** 2)(10)

다른 함수에서의 람다 함수 활용

  • map 에서의 활용
my_list = [1,2,3,4]
# 일반 함수를 사용
def square_func(x):
    return x ** 2
list(map(square_func, my_list))
# [1, 4, 9, 16]

# 람다 함수를 사용
list(map(lambda x: x ** 2, my_list))
# [1, 4, 9, 16]
  • filter 에서의 활용
my_list2 = [1,2,3,4,5,6,7,8,9,10]
# 일반 함수를 사용
def is_even(x):
    return x % 2 == 0
list(filter(is_even, my_list2))
# [2, 4, 6, 8, 10]

# 람다 함수를 사용
list(filter(lambda x: x % 2 == 0, my_list2))
# [2, 4, 6, 8, 10]
  • sorted 에서의 활용
my_list3 = ["apple", "banana", "watermelon", "grape"]
sorted(my_list3, key=lambda word: len(word), reverse=True)
# ['watermelon', 'banana', 'apple', 'grape']

주의 사항

  • 문장 사용 금지 : return, if, for 문 등 사용 불가 (표현식만 가능)
  • 디버깅 어려움
  • 남용 주의 : 복잡한 로직은 def로 명시적으로 작성하는 것이 좋음

실습

# 1. 특정 조건 만족하는 튜플만 추출

students = [("Alice", [80, 90]), ("Bob", [60, 65]), ("Charlie", [70, 70])]

list(filter(lambda s: sum(s[1]) / len(s[1]) >= 70, students))
# [('Alice', [80, 90]), ('Charlie', [70, 70])]
# 2. 키워드 추출 리스트 만들기

sentences = ["Python is fun", "Lambda functions are powerful", "Coding is creative"]

list(map(lambda word: word.split()[0], sentences))
# ['Python', 'Lambda', 'Coding']
# 3. 튜플 리스트를 정렬하기

people = [("Alice", 30), ("Bob", 25), ("Charlie", 35)]

sorted(people, key=lambda age: age[1])
# [('Bob', 25), ('Alice', 30), ('Charlie', 35)]

마치며

재귀 함수와 람다 함수에 대한 개념 정리를 우선으로 충분히 공부해봐야겠다. 재귀 함수는 작성 된 코드를 보면 직관적으로 느껴지는데, 막상 코드를 작성할때는 머릿속으로 이미지가 잘 그려지지 않아 많이 문제를 풀어봐야 할 것 같다.
람다 함수 또한 실무에서 상당히 많이 사용되기 때문에, 지금부터 기반을 잘 다져둬야 할 것 같다.

NOTION

MY NOTION (Python. Function)

profile
Hello I'm TaeHyunAn, Currently Studying Data Analysis

0개의 댓글