[Python] 함수(4): 재귀호출, 함수객체

#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()도 인수 없이 사용