#8 재귀 호출
자기 자신을 호출하도록 정의한 함수를 재귀함수라고 한다. 재귀함수의 호출을 재귀호출이라고 한다.
def my_func():
print("my_func")
my_func()
my_func()
동일한 형태의 함수라도 실제로는 함수를 호출할 때마다 새로운 프레임을 만든다.
def my_func():
x = []
print("my_func", id(x))
my_func()
my_func()
재귀호출을 중단하는 종료조건이 필요하다.
def my_func(count):
if count > 0:
my_func(count - 1)
print(count)
my_func(3)
#9 함수객체
파이썬에서는 함수도 객체다. 따라서 함수도 변수에 저장했다가 나중에 다시 사용할 수 있다.
from datetime import datetime
def print_date():
today = datetime.today()
print(f"오늘은 {today.year}년 {today.month}월 {today.day}일 입니다.")
my_func = print_date
my_func()
함수도 변수에 저장할 수 있다는 것은 컨테이너의 아이템이 될 수 있다는 의미다.
from datetime import datetime
def print_date():
today = datetime.today()
print(f"오늘은 {today.year}년 {today.month}월 {today.day}일 입니다.")
def print_time():
current_time = datetime.now()
print(f"지금은 {current_time.hour}시 {current_time.minute}분 입니다.")
command_callbacks = {
"날짜":print_date,
"시간":print_time
} # 주의: 괄호 없이 함수 이름만 적습니다.
user_command = input("명령을 입력해주세요:")
# command_callbacks["날짜"]이 함수 객체이기 때문에 뒤에 괄호만 붙여서 실행
try:
command_callbacks[user_command]()
except:
print("명령을 수행할 수 없음")
함수는 다른 함수의 인수가 될 수 있다.
from datetime import datetime
def print_date():
today = datetime.today()
print(f"오늘은 {today.year}년 {today.month}월 {today.day}일 입니다.")
def print_time():
current_time = datetime.now()
print(f"지금은 {current_time.hour}시 {current_time.minute}분 입니다.")
def do_something(my_func):
my_func()
do_something(print_date) # print_date() 함수의 이름을 인수로 넣어줍니다.
do_something(print_time) # print_time() 함수의 이름을 인수로 넣어줍니다.
함수는 함수도 반환할 수 있다.
def func_maker(message):
def speaker():
print(message)
return speaker
my_func = func_maker("What can I do for you?")
my_func() # speaker()에 인수가 없기 때문에 my_func()도 인수 없이 사용