함수와 고급 함수 기능
1️⃣ 함수 정의와 반환값
함수 정의
함수는 특정 작업을 수행하는 코드 블록으로, def
키워드를 사용하여 정의합니다. 함수를 정의할 때는 함수의 이름과 매개변수(입력값)를 지정하고, 함수 내에서 특정 작업을 처리한 후 return
을 사용해 값을 반환할 수 있습니다.
# 함수 정의
def greet(name):
return f"Hello, {name}!"
# 함수 호출
print(greet("Alice")) # Hello, Alice!
반환값
함수는 return
키워드를 사용하여 결과를 반환합니다. 반환값은 함수 호출 시 사용됩니다.
def add(a, b):
return a + b
result = add(3, 4)
print(result) # 7
2️⃣ 기본 인자값 및 키워드 인자
기본 인자값 (Default Arguments)
함수를 정의할 때 매개변수에 기본값을 지정할 수 있습니다. 매개변수가 전달되지 않으면 기본값이 사용됩니다.
def greet(name="Guest"):
return f"Hello, {name}!"
print(greet()) # Hello, Guest!
print(greet("Alice")) # Hello, Alice!
키워드 인자 (Keyword Arguments)
함수 호출 시 인자 이름을 명시적으로 지정하는 방법입니다. 이를 사용하면 인자의 순서에 관계없이 값을 전달할 수 있습니다.
def greet(name, age):
return f"Hello, {name}. You are {age} years old."
# 키워드 인자 사용
print(greet(name="Alice", age=30)) # Hello, Alice. You are 30 years old.
3️⃣ 가변 인자 (Variadic Functions)
가변 인자 정의
가변 인자는 함수가 받을 수 있는 인자의 수가 정해져 있지 않은 경우에 사용합니다. *args
를 사용하여 위치 인자들을 튜플로 받을 수 있으며, **kwargs
를 사용하여 키워드 인자들을 딕셔너리로 받을 수 있습니다.
# *args를 사용하여 여러 개의 위치 인자 받기
def sum_numbers(*args):
return sum(args)
print(sum_numbers(1, 2, 3, 4)) # 10
# **kwargs를 사용하여 여러 개의 키워드 인자 받기
def greet_multiple(**kwargs):
for name, age in kwargs.items():
print(f"Hello, {name}. You are {age} years old.")
greet_multiple(Alice=30, Bob=25)
# Hello, Alice. You are 30 years old.
# Hello, Bob. You are 25 years old.
4️⃣ 람다 함수 (Lambda Functions)
람다 함수 정의
람다 함수는 lambda
키워드를 사용하여 정의하며, 간단한 함수나 일회성 함수에 유용합니다. 람다 함수는 한 줄로 표현할 수 있으며, 주로 다른 함수에 인자로 전달됩니다.
# 람다 함수 정의
multiply = lambda x, y: x * y
print(multiply(2, 3)) # 6
람다 함수는 복잡한 로직을 간결하게 표현할 때 사용됩니다.
5️⃣ 함수 안에서 함수 (Nested Functions)
함수 안에 함수 정의
함수 내부에 또 다른 함수를 정의할 수 있으며, 이를 “중첩 함수” 또는 “내부 함수"라고 합니다. 내부 함수는 외부 함수 내에서만 호출이 가능합니다.
def outer_function():
def inner_function():
return "Hello from inner function!"
return inner_function()
print(outer_function()) # Hello from inner function!
6️⃣ 고급 함수 개념 (클로저, 제너레이터, 데커레이터)
클로저 (Closure)
클로저는 함수가 자신이 정의된 환경을 기억하는 특성을 의미합니다. 내부 함수가 외부 함수의 변수에 접근할 수 있는 경우, 이 변수는 클로저로 남게 됩니다.
def outer_function(x):
def inner_function(y):
return x + y
return inner_function
closure = outer_function(10)
print(closure(5)) # 15
제너레이터 (Generator)
제너레이터는 yield
키워드를 사용하여 값을 한 번에 하나씩 반환하는 함수입니다. 제너레이터는 큰 데이터를 처리할 때 메모리 효율성을 높여줍니다.
def count_up_to(limit):
count = 1
while count <= limit:
yield count
count += 1
for number in count_up_to(5):
print(number)
# 1
# 2
# 3
# 4
# 5
데커레이터 (Decorator)
데커레이터는 다른 함수를 수정하거나 확장하는 함수입니다. 주로 함수에 추가적인 기능을 덧붙일 때 사용됩니다.
# 데커레이터 정의
def decorator_function(original_function):
def wrapper_function():
print("Wrapper executed this before {}".format(original_function.__name__))
return original_function()
return wrapper_function
# 함수에 데커레이터 적용
@decorator_function
def display():
return "Display function executed"
print(display()) # Wrapper executed this before display
# Display function executed
7️⃣ 고차 함수 (함수 인자로 함수 전달)
고차 함수 정의
고차 함수는 다른 함수를 인자로 받거나, 함수를 반환하는 함수입니다. 이를 활용하여 함수를 동적으로 처리할 수 있습니다.
def apply_function(f, x):
return f(x)
# 함수 인자로 전달
result = apply_function(lambda x: x**2, 5)
print(result) # 25
8️⃣ 재귀 함수 (Recursion)
재귀 함수 정의
재귀 함수는 자기 자신을 호출하는 함수입니다. 재귀 함수는 문제를 작은 부분으로 나누어 해결할 때 유용합니다. 재귀를 사용할 때는 종료 조건을 반드시 정의해야 합니다.
# 재귀 함수 정의
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n-1)
print(factorial(5)) # 120