함수의 할당

def fn():
    print('hello')

fn1 = fn
fn()
fn1()

fn1 fn을 받기 때문에 같은 출력 결과를 확인할 수 있다. 코드 text 영역에 loading되는데 fn()은 해당 영역에서 시작 주소를 할당받기 때문에 fn1이 해당 주소를 참조할 수 있다.

 

def fn():
    print('hello')

def my(a):
    print(id(a))
    a()

print(id(fn))
my(fn)

예제 코드에서 a fn()을 할당 받기 때문에 결과는 fn()과 같다. 또한 주소 값을 출력했을 때 같다는 것을 확인할 수 있다. 이렇게 함수를 인자로 받을 수가 있다.

함수의 리턴

def fn():
    print('hello')

def my(a):
    print(id(a))
    a()

def my1():
    return fn

ret = my1()
ret()

위의 예제 코드에서 my1() call하면 ret fn()의 주소를 받기 때문에 결국 fn()을 호출하게 된다. 따라서 결과는 hello가 출력된다. 파이썬은 이와 같이 함수의 리턴을 지원하는 일급 함수의 기능을 가지며 또 다른 언어로는 javascript가 있다. C언어도 이와 유사하게 할 수 있는데 function pointer를 이용하면 된다.

 

def afn():
    print('afn')

def bfn():
    print('bfn')

d = {0:afn, 1:bfn}
food = int(input("음식을 선택:"))

d[food]()

파이썬에서는 C언어와는 다르게 switch문이 없다. 그 이유는 사전 타입과 일급 함수의 기능을 이용하면 완벽하게 대체할 수 있기 때문이다. 위의 예제 코드에서는 0 1 key로 주고 key와 연결되는 값을 function으로 대체하였다. 만약 0을 주면 afn, 1을 주면 bfn을 호출하여 key 값에 따라 key에 연결된 함수를 call한다. 이와 같이 switch문을 완벽하게 대체 가능하다.

함수의 인자

def afn(first = 10, second = 20):
    return first + second

print(afn())
print(afn(20))
print(afn(30, 40))

위의 예제 코드와 같이 인자 값을 넣지 않으면 함수 매개변수에 선언된 기본 값이 사용된다. 그리고 추가되는 전달 인자에 따라 순서대로 매개 변수에 매칭된다.

함수 내 함수 정의

def afn(num):

    def bfn():
        sum = num + 1
        return sum

    return bfn()

print(afn(1))

파이썬에서는 함수 내 함수를 정의하여 사용할 수 있다. 위와 같이 함수를 중첩(Nested)하여 사용한 결과 매개 변수로 받은 1의 값이 bfn 함수 내에서 증가되어 2를 출력함을 확인 가능하다.

 

def afn(num):
    num = num - 1

    if num > 0:
        print(num)
        afn(num)

print(afn(5))

파이썬에서는 위와 같이 함수 내에 함수를 호출하여 재귀 함수를 사용할 수도 있다. 무한하게 재귀를 돈다면 스택 영역의 메모리가 부족할 수 있으니 항상 주의해야 한다.

+ Recent posts