본문 바로가기
Language/Python

[Python] 함수는 1급 객체이다

by 며루치꽃 2021. 7. 16.

전문적인 정보를 다루는 것이 아닌 개인적으로 학습한 내용에 대해

포스팅을 했기 때문에 이점을 감안하여 봐주시면 감사하겠습니다👏

 

정수나 문자열은 1급 객체(first-class object)이다. 따라서 변수, 매개변수, 반환값 등에 정의해서 사용할 수 있다. 

함수도 1급 객체로 다른 객체와 같은 방식으로 사용할 수 있고 함수도 1급 객체라는 뜻입니다.

 

1급 객체의 중요한 특징

- 변수나 데이터 구조 안에 담을 수 있다

- 매개변수로 전달이 가능하다

- 리턴값으로 사용할 수 있다

 

1. 변수나 데이터 구조 안에 담을 수 있다

def func(x, y):
    return x, y

print(type(func))
>>> <class 'function'>

이 함수는 2개의 매개변수를 그대로 반환하는 함수입니다. 함수도 객체이기에 변수 func을 조회해보면 클래스 이름이 function이고, 함수의 클래스는 FunctionType이다. 이 클래스 이름이 function입니다.

 

var = func
print(var is func)

함수 객체는 다른 변수에 할당할 수 있으며 두 변수는 같은 함수를 참조했으므로 레퍼런스가 같습니다.

 

2. 함수를 호출할 때 인자로도 전달이 가능하다

 

함수의 인자들이 전달되도록 다른 매개변수는 args로 지정합니다. args 매개변수는 여러개의 인자를 앞에 받을 수 있어 앞에 별표를 붙입니다. 함수를 호출할 때 매개변수 앞에 별표를 붙인 이유는 args에 튜플이 보관되어 있어 이를 다시 각 원소로 분리해서 인자로 전달하라는 뜻입니다.

def func(x, y):
    return x, y

def diff_func(func, *args):
    return func(*args)

print(diff_func(func, 2, 5))
>> (2, 5)

함수를 호출하려면 정의한 func() 함수를 먼저 전달하고, 2개의 인자를 2, 5로 전달했습니다. 

함수가 실행되면 func() 함수가 먼저 실행되어 반환합니다. 튜플로 표시되는 이유는 return 문에 두수를 쉼표로 분리하여 하나의 튜플로 변환해서 결과를 전달했기 때문입니다.

 

아래와 같이 활용한 예시입니다.

def add(x, y): #함수를 정의
    return x + y

def power(func, *args, z = None):
    result = func(*args)
    if z:
        result = math.pow(result, z)
    return result

power(add, 1, 2, z = 2)

 

3. 리턴 값으로 사용이 가능하다

def func_return(func):
    return func

x = func_return(func)
>>> <function __main__.func(x, y)>

위에서 정의한 함수 func을 인자로 전달해서 변수 x에 할당하고 변수를 조회하면 함수 객체인 함수 func가 출력됩니다.

댓글