함수의 정의 및 활용
함수는 특정 기능을 수행하는 코드 블록으로, 프로그래밍에서 재사용 가능한 구성 요소입니다. 함수를 통해 복잡한 문제를 단순화하고 코드 구조를 개선할 수 있습니다.
def <함수명>(<매개변수>):
<실행문>
return <반환값>
예시 - 팩토리얼 계산:
def factorial(num):
result = 1
for idx in range(1, num + 1):
result *= idx
return result
함수는 호출되지 않으면 실행되지 않으며, 호출 시 실제 값을 매개변수로 전달하여 처리 결과를 얻습니다.
매개변수 전달 방식
함수는 다양한 매개변수 형식을 지원합니다:
- 필수 매개변수: 반드시 제공해야 하는 값
- 기본값 매개변수: 값을 생략하면 기본값 사용
- 가변 길이 매개변수: 임의 개수의 값을 받음
# 기본값 매개변수 예시
def divide_factorial(base, divisor=1):
product = 1
for val in range(1, base + 1):
product *= val
return product // divisor
# 가변 길이 매개변수 예시
def extended_factorial(primary, *additional):
total = 1
for step in range(1, primary + 1):
total *= step
for extra in additional:
total *= extra
return total
매개변수는 위치나 이름으로 전달할 수 있으며, 이름 지정 시 순서에 구애받지 않습니다.
반환값 처리
함수는 여러 값을 동시에 반환할 수 있으며, 반환값이 없는 경우에도 명시적으로 return을 사용할 수 있습니다.
def enhanced_calculation(value, modifier=1):
outcome = 1
for element in range(1, value + 1):
outcome *= element
return outcome // modifier, value, modifier
# 다중 할당으로 반환값 받기
result_val, input_val, mod_val = enhanced_calculation(10, 5)
변수 범위
함수 내부에서 선언된 변수는 지역 변수이며, 외부에서 선언된 변수는 전역 변수입니다. global 키워드를 사용해 전역 변수를 참조할 수 있습니다.
base_num, initial_result = 10, 100
def calculate_with_global(target):
global initial_result
for counter in range(1, target + 1):
initial_result *= counter
return initial_result
print(calculate_with_global(base_num), initial_result)
복합 데이터 타입은 생성 위치에 따라 지역/전역 여부가 결정되며, 함수 내에서 새롭게 생성하지 않은 경우 전역 변수를 참조합니다.
람다 표현식
람다는 간단한 함수를 한 줄로 정의할 때 사용하며, 주로 다른 함수의 인자로 활용됩니다.
# 람다 함수 정의
adder = lambda x, y: x + y
print(adder(10, 15)) # 출력: 25
# 인자 없는 람다 함수
message_func = lambda: "람다 표현식"
print(message_func()) # 출력: 람다 표현식
코드 재사용과 재귀 호출
모듈화 설계
코드 재사용은 함수와 객체를 통해 실현되며, 이를 기반으로 모듈화 설계가 가능합니다. 모듈화는 프로그램을 독립적인 구성 요소로 분할하고 이들 간 관계를 정의하는 방법론입니다.
좋은 모듈 설계는 내부 요소 간에는 밀접하게 연결(강결합)하고, 모듈 간에는 최소한의 인터페이스로 통신(약결합)하는 것을 목표로 합니다.
재귀 함수 개념
재귀는 함수가 자신을 호출하는 구조로, 두 가지 핵심 요소를 포함합니다:
- 기저 사례(Base Case): 더 이상 재귀 호출이 필요 없는 종료 조건
- 재귀 관계(Recursive Chain): 문제를 더 작은 하위 문제로 분해하는 규칙
def recursive_factorial(number):
if number == 0:
return 1
else:
return number * recursive_factorial(number - 1)
재귀 호출 과정
재귀 함수는 호출될 때마다 새로운 메모리 공간을 확보하며, 기저 사례에 도달할 때까지 계속해서 자신을 호출합니다. 이후 역순으로 결과를 결합하여 최종 값을 반환합니다.
재귀 응용 예제
문자열 뒤집기:
def reverse_string(text):
if text == "":
return text
else:
return reverse_string(text[1:]) + text[0]
피보나치 수열:
def fibonacci(position):
if position == 1 or position == 2:
return 1
else:
return fibonacci(position - 1) + fibonacci(position - 2)
하노이 탑 문제:
move_count = 0
def hanoi_tower(discs, source, destination, auxiliary):
global move_count
if discs == 1:
print(f"{1}:{source}->{destination}")
move_count += 1
else:
hanoi_tower(discs - 1, source, auxiliary, destination)
print(f"{discs}:{source}->{destination}")
move_count += 1
hanoi_tower(discs - 1, auxiliary, destination, source)
hanoi_tower(3, "A", "B", "C")
print(move_count)