파이썬 return 반환 값 여러개 설정 + 재귀 함수
안녕하세요. 이번 시간에는 파이썬 함수에서 return 값을 여러개 설정하는 방법과
return의 성질을 이용한 재귀 함수의 예시를 살펴보겠습니다.
파이썬 return 여러개 예시(feat. 튜플)
예를 들어, 두 수를 input으로 받고, 해당 숫자들의 합과 곱을 동시에 반환 받는
경우의 예시를 살펴보겠습니다.
def sum_and_mul(a, b):
return a + b, a * b # 쉼표로 반환 값 구분
hap, gop = sum_and_mul(3, 5)
print(hap) # 8
print(gop) # 15
위와 같이 쉼표(,)를 기준으로 반환 값 사이를 구분해주시면 간단하게 해결됩니다.
두 반환 값을 각각 hap, gop 이라는 변수에 동시에 반환하여 값을 확인해 보았습니다.
return 값을 여러개 받을 수 있는 원리는 튜플의 성질을 이용한 것인데요.
위의 함수 구현은 사실은 아래의 형태와 완전히 동일하다고 볼 수 있습니다.
def sum_and_mul2(a, b):
return (a + b, a * b) # 튜플 형태 output
sum_and_mul(3, 5) # (8, 15)
sum_and_mul2(3, 5) # (8, 15)
위에서 구현한 함수도 사실은 (8, 15)라는 2개의 값을 가진 튜플을 반환 값으로
가져오고 있다는 점을 확인해볼 수 있었습니다.
그래서 여러 개 변수에 반환 값을 나눠 받는 것도 packing이 가능한 튜플의 성질로
인하여 가능한 것이지요.
이 원리를 통하여 3개 이상의 반환 값도 마찬가지로 얼마든지 구현이 가능합니다.
파이썬 재귀 함수 예시
return으로 자기 자신의 함수를 다시 호출하여 값을 가져오는 것이 가능합니다.
이 형태를 재귀 함수라고 하는데, 가장 대표적인 예제인 피보나치 수열을 보겠습니다.
피보나치 수열은 1,1,2,3,5,8,13 처럼 앞의 두개의 수를 더하여 다음 숫자를 만드는
간단한 원리로 이루어진 수열입니다.
def fibonacci(n):
if n == 0 or n == 1: # 초기값 설정
return 1
else:
return fibonacci(n-1) + fibonacci(n-2) # 재귀 호출
print(fibonacci(5)) # 8
print(fibonacci(10)) # 89
fibonacci 함수 내에서 fibonacci 함수를 다시 호출하면서 재귀 호출을 하는
것을 return을 이용하여 구현해볼 수 있었습니다.
파이썬 재귀 함수 주의 사항
재귀 함수를 이용할 때, 주의해야 할 사항은 호출의 횟수가 너무 많아지면,
실행 시간이 지나치게 오래 걸리거나, 메모리 제한에 걸려 계산이 불가능해질 수 있습니다.
위에서 구현한 피보나치 수열은 실제로 n이 1씩 커질 때 마다,
계산 횟수가 지수적으로 증가하는 원리를 가지고 있습니다.
fibonacci(40)을 계산해야한다면, 계산 원리는 아래와 같이 표현이 가능합니다.
같은 호출 형태가 지속적으로 반복되면서 호출 횟수가 지나치게 많아지는
현상이 일어남을 관찰할 수 있었습니다.
이런 경우는 다이나믹 프로그래밍을 활용하는 등의 방법으로 개선이 가능한데,
이에 대한 내용은 여기서는 논의를 생략하도록 하겠습니다.
두 번째 주의사항은 종료 조건의 초기 값을 제대로 설정해주지 않는다면,
함수가 무한 루프에 빠질 수도 있다는 점입니다.
예를 들어 아래 함수와 같은 경우는 무한 루프에 빠지는 예시입니다.
def hello():
print('안녕하세요!')
hello() # 자기 자신 호출, 무한 루프에 빠짐
# 안녕하세요! 가 무한히 출력됨.
hello()
hello() 내부 에서 hello()가 또 실행되고, 실행된 hello()에서 또 hello()가
실행되고, ...하는 식으로 안녕하세요! 라는 메시지가 무한히 출력되는
현상을 관찰하실 수 있을 것입니다.
이와 같이 재귀 함수를 설정할 때에는 종료 조건이 잘 구현되었는지를
반드시 확인해야만 합니다.
'Python > 파이썬 기초' 카테고리의 다른 글
파이썬 주석 처리 방법 : 한줄, 여러줄, 단축키(파이참, 주피터, 코랩) (0) | 2022.01.06 |
---|---|
파이썬 클래스 상속(오버로딩), super().__init__() 의미 (0) | 2021.12.30 |
파이썬 raise 오류 발생시키기, 에러 종류 만들기 (0) | 2021.12.24 |