함수의 활용(2) 메모화 / 조기리턴 / 코드 이름 / 코드 유지보수
재귀 함수의 문제가 있지만, 필요한 경우 재귀 함수를 활용해 코드를 간결하고 읽기 쉬워짐
어떻게 사용해야 코드가 빠르게 실행되도록 만들 수 있을까?
메모화
메모 : 딕셔너리를 사용해 한 번 계산한 값을 저장함
딕셔너리에 값이 메모되어 있으면 처리를 수행하지 않고 곧바로 메모된 값을 돌려주면서 코드의 속도를 빠르게 만듦
메모화를 사용하면 실행 후 곧바로 결과를 출력할 정도로 속도가 빨라짐.
메모화
# 메모 변수 만들기
dictionary = {
1: 1,
2: 1
}
# 함수 선언하기
def fibonacci(n):
if n in dictionary:
#메모가 되어 있으면 메모된 값을 리턴
return dictionary[n]
else:
#메모가 되어 있지 않으면 값을 구함
output = fibonacci(n-1) + fibonacci(n-2)
dictionary[n] = output
return output
# 함수 호출
print("fibonacci(10): ", fibonacci(10))
print("fibonacci(20): ", fibonacci(20))
print("fibonacci(30): ", fibonacci(30))
print("fibonacci(40): ", fibonacci(40))
print("fibonacci(50): ", fibonacci(50))
</>
fibonacci(10): 55
fibonacci(20): 6765
fibonacci(30): 832040
fibonacci(40): 102334155
fibonacci(50): 12586269025
조기 리턴
리턴을 중간에 사용하는 형태
과거: 함수 흐름의 끝에 리턴을 적기 위해 if else 조건문을 만들고 각각의 마지막 부분에서 리턴하도록 함
# 함수 선언
def fibonacci(n):
if n in dictionary:
# 메모되어 있으면 메모된 값을 리턴
return dictionary[n]
else:
# 메모되어 있지 않으면 값을 구함
output = fibonacci(n-1) + fibonacci(n-2)
dictionary[n] = output
return output
하지만 조기 리턴을 사용하면, 들여쓰기 단계가 줄기 때문에 코드를 더 쉽게 읽을 수 있음.
조기 리턴 : 흐름 중간에 return 키워드를 사용하는 것
조기 리턴 사용
# 함수 선언
def fibonacci(n):
if n in dictionary:
# 메모되어 있으면 메모된 값을 리턴
return dictionary[n]
# 메모되어 있지 않으면 값을 구함
output = fibonacci(n-1) + fibonacci(n-2)
dictionary[n] = output
return output
좀 더 알아보기 (1) 코드에 이름 붙이기
* 가독성이 좋은 코드는 쉽게 읽을 수 있다는 의미
* 설명 없는 코드 <<< 주석이 있는 코드 : 코드의 내용을 분석하지 않아도 어떤 내용인지 쉽게 이해 가능
* 그러나 주석을 남발해서는 안됨
* 주석을 많이 사용한다 != 주석을 잘 사용한다
* 더 좋은 형태는 함수를 만들어 사용하는 것 ➡️ 코드에 이름을 붙이면 더 쉽게 읽힘
* 주석이 전혀 없는 데도 코드만 읽고 무엇을 하는 코드인지 쉽게 알 수 있음
좀 더 알아보기 (2) 코드 유지보수
* 코드를 유지하고 보수할 때, 변수나 함수를 사용하면 훨씬 쉬워짐
변수 예) 3.14 를 숫자로 입력 ➡️ 3.14를 PI라는 변수로 설정한 상태
-- 숫자를 하나하나 찾아서 변경하거나 전체 수정을 해야 하지 않고, pi변수의 설정값만 변경하면 됨!
함수 예) 그냥 print 안에 글을 넣음 ➡️ 함수로 작성
-- 'print 안의 글자를 변경해주세요' 라는 요청에 함수만 변경하면 쉬워짐, 요청 사항 등이 있을 때 이를 쉽게 반영할 수 있음