Programming,  Python

[Python] 함수의 특징 – 1

Python 함수의 큰 특징은 return, argument type을 따로 지정하지 않고 자동으로 선택된다.

def add(x,y):
    return x+y

a = add(3,4)
print(a)
print(type(add))
7
<class ‘function’>
<function add at 0x0000021524C383A8>

위 결과를 보면 함수의 이름은 주소를 가리키며, 함수의 타입은 function class 로 정의된다.
Python의 함수는 C와 마찬가지로 다른 함수로 정의하여 사용 가능하다.

import sys
sys.getrefcount(add)
add1 = add
a = add1(3,4)
print(a)
print(type(add1))
print(add1)
sys.getrefcount(add)
del add1
sys.getrefcount(add)
2
7
<class ‘function’>
<function add at 0x0000021524C383A8>
3
2

위 결과를 보면 다른 변수에 함수를 복사 할 수 있으며, 기존 함수 (add) 타입과 동일하며, 주소 또한 동일하다. 즉 함수의 정의는 1개가 선언되어있고, 해당 주소를 가리키고 있는 개수가 3개라는 것을 알 수 있다.
실제로getrefcount() 함수를 통해 해당 reference가 몇번 count 되는지 알 수 있으며, del 매크로를 통해 해당 reference를 제거 할 수 있다.

실제로 Python에선 함수도 object이며, int type 또한 객체이다.

Default Parameter

함수의 default parameter는 정의될 시점에 정해진다.

a = 10
def foo(x=a):
    return x
a=5
foo()
10

위 함수 foo() 의 결과는 5가 나올 것 같지만 10이 나온다. 함수의 정의가 메모리에 올라올 때 default parameter value 또한 저장되기 때문이다.

함수 뿐만 아니라 Python에선 list 또한 객체다. 따라서 다음 코드를 그림으로 표시하게 되면 다음과 같다.

def foo(x, items=[]):
    items.append(x)
    return items

foo(1)
foo(2)



Default parameter는 runtime에도 존재하기 때문에 list가 default parameter일 경우엔 list 값들이 지속적으로 존재한다.
만약 유저가 함수 호출이 끝나고 list를 초기화하고 싶다면, 즉 호출시에만 list를 생성하고 싶다면 다음과 같이 수정하면 된다.

def foo(x, items=None):
    if items is None:
        items = []
    items.append(x)
    return items

foo(1) // 1
foo(2) // 2

Leave a Reply

Your email address will not be published. Required fields are marked *