[개발] 파이썬

2.2. 함수 심화

브랜든정 2024. 12. 27. 10:18
반응형

파이썬은 프로그래밍 언어 중에서 가장 인기 있는 언어 중 하나로, 특히 데이터 과학, 웹 개발, 자동화 등 다양한 분야에서 광범위하게 사용됩니다. 파이썬의 함수는 프로그램을 더 간결하고 효율적으로 작성하는 데 중요한 역할을 합니다. 이 글에서는 파이썬 함수의 심화에 대해 다루고, 특히 람다 함수와 재귀 함수에 대해 자세히 설명하겠습니다.

1. 파이썬 함수의 기초

파이썬에서 함수는 프로그램을 더 구조화하고 재사용성을 높이는 데 중요한 역할을 합니다. 함수는 특정 작업을 수행하는 코드 블록으로, 함수를 호출하면 함수 내부의 코드가 실행됩니다. 파이썬에서 함수를 정의하는 방법은 다음과 같습니다:

def 함수이름(인자1, 인자2, ...):
    # 함수 내부의 코드
    return 결과

1.1 함수의 인자와 반환값

함수는 인자를 받을 수 있으며, 함수 내부에서 처리한 결과를 반환할 수 있습니다. 예를 들어, 다음과 같은 함수를 정의할 수 있습니다:

def add(a, b):
    return a + b

result = add(3, 5)
print(result)  # 출력: 8

1.2 함수의 지역 변수와 전역 변수

함수 내부에서 사용하는 변수는 지역 변수로, 함수 외부에서 사용하는 변수는 전역 변수로 구분됩니다. 지역 변수는 함수 내부에서만 사용할 수 있으며, 함수 외부에서는 사용할 수 없습니다. 예를 들어, 다음과 같은 코드를 살펴보겠습니다:

x = 10  # 전역 변수

def change_x():
    x = 20  # 지역 변수
    print("함수 내부의 x:", x)

change_x()
print("함수 외부의 x:", x)  # 출력: 10

2. 람다 함수

람다 함수는 작은 함수를 정의할 때 사용하는 함수입니다. 람다 함수는 def 키워드 없이 정의할 수 있으며, 한 줄의 코드만 포함할 수 있습니다. 람다 함수는 다음과 같이 정의할 수 있습니다:

람다_함수 = lambda 인자1, 인자2, ...: 결과

2.1 람다 함수의 예시

람다 함수는 리스트 필터링, 정렬, 집합 연산 등에서 유용하게 사용됩니다. 예를 들어, 다음과 같은 코드를 살펴보겠습니다:

# 리스트 필터링
numbers = [1, 2, 3, 4, 5]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)  # 출력: [2, 4]

# 정렬
students = [{'name': 'Alice', 'age': 20}, {'name': 'Bob', 'age': 22}, {'name': 'Charlie', 'age': 21}]
students.sort(key=lambda x: x['age'])
print(students)  # 출력: [{'name': 'Alice', 'age': 20}, {'name': 'Charlie', 'age': 21}, {'name': 'Bob', 'age': 22}]

2.2 람다 함수의 장점

람다 함수는 코드를 더 간결하게 작성할 수 있으며, 함수를 정의할 필요가 없기 때문에 메모리 사용량이 줄어듭니다. 또한, 람다 함수는 즉시 실행되기 때문에 함수 호출 시에 즉시 결과를 반환할 수 있습니다.

3. 재귀 함수

재귀 함수는 함수가 자기 자신을 호출하는 함수입니다. 재귀 함수는 분할 정복 알고리즘을 사용하여 문제를 작은 부분으로 나누어 해결할 수 있습니다. 재귀 함수는 다음과 같이 정의할 수 있습니다:

def 재귀_함수(인자1, 인자2, ...):
    # 재귀 호출
    if 조건:
        return 재귀_함수(인자1, 인자2, ...)
    else:
        return 결과

3.1 재귀 함수의 예시

재귀 함수는 팩토리얼, 이진 탐색, 트리 순회 등에서 유용하게 사용됩니다. 예를 들어, 다음과 같은 코드를 살펴보겠습니다:

# 팩토리얼
def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)

result = factorial(5)
print(result)  # 출력: 120

# 이진 탐색
def binary_search(arr, target):
    if len(arr) == 0:
        return -1
    else:
        mid = len(arr) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            return binary_search(arr[mid+1:], target)
        else:
            return binary_search(arr[:mid], target)

arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
index = binary_search(arr, 5)
print(index)  # 출력: 4

3.2 재귀 함수의 장점

재귀 함수는 분할 정복 알고리즘을 사용하여 문제를 작은 부분으로 나누어 해결할 수 있습니다. 또한, 재귀 함수는 코드를 더 간결하게 작성할 수 있으며, 함수를 정의할 필요가 없기 때문에 메모리 사용량이 줄어듭니다.

4. 람다 함수와 재귀 함수의 결합

람다 함수와 재귀 함수를 결합하여 더 복잡한 문제를 해결할 수 있습니다. 예를 들어, 다음과 같은 코드를 살펴보겠습니다:

# 이진 트리 순회
class Node:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None

def inorder_traversal(node):
    if node is not None:
        inorder_traversal(node.left)
        print(node.value)
        inorder_traversal(node.right)

# 이진 트리 생성
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)

# 이진 트리 순회
inorder_traversal(root)  # 출력: 4 2 5 1 3

파이썬 함수는 프로그램을 더 구조화하고 재사용성을 높이는 데 중요한 역할을 합니다. 람다 함수와 재귀 함수는 코드를 더 간결하게 작성할 수 있으며, 함수를 정의할 필요가 없기 때문에 메모리 사용량이 줄어듭니다. 또한, 람다 함수와 재귀 함수를 결합하여 더 복잡한 문제를 해결할 수 있습니다. 이 글에서 설명한 내용을 바탕으로, 파이썬 함수를 더 효과적으로 사용하여 프로그램을 작성할 수 있습니다.

반응형

'[개발] 파이썬' 카테고리의 다른 글

3.1. 파이썬 클래스와 객체  (0) 2024.12.27
2.3. 파이썬 모듈과 패키지  (0) 2024.12.27
2.1. 함수 기초  (0) 2024.12.27
1.4. 데이터 구조  (0) 2024.12.27
1.3. 조건문과 반복문  (0) 2024.12.27