ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 함수(function)와 1급 객체(first-class citizen)
    Python 2022. 5. 23. 18:11

    프로그래밍에 대한 개념을 다루는 것보다 아무래도 문제들을 해결하기 위해 직접 코드를 치는게 재밌었다 보니 누군가 1급 객체와 같은 개념들에 대해 물어본다면 대답하기 어려워서 누군가에게 설명할 수 있도록 정리해야겠다는 생각에 여러 글로 나눠서 함수, 1급 객체, 클로져, 데코레이터에 대해 쓰고자 합니다.

     

     

    < 목차 >

    1. 함수(function)란

    2. 1급 객체(first-class citizen)란

     

    쉽게 얘기해서 문제를 해결하기 위해 프로그램을 만든다.

    대부분의 프로그램은 클래스의 집합으로 구성되어 있다.

    대부분의 클래스는 함수들의 집합으로 구성되어 있다.

    즉, 이렇게도 볼 수 있지 않을까?

    프로그램 = 함수들의 묶음

     

    함수란

    - 작은 단위의 기능을 구현할 수 있도록 만든 코드

    - 작으면 작을수록 기능 구현하기에도 좋고 테스트하기에도 용이하다.

    - 현재 또는 미래에 재사용이 가능하도록 만든 코드 (재사용성)

     

     

    1급 객체

    객체의 특성을 모두 지닌 것

     

    객체의 특성에는 어떤게 있을까

    1. 변수나 데이터 구조(리스트, 딕셔너리 등의 자료 구조)에 할당 가능
    2. 매개변수(인자)로 전달 가능
    3. 리턴값으로 사용 가능

    다른 언어와 달리 Python에는 함수도 객체의 특성을 가지고 있기에 1급 객체이다.

     

    이에 대해 찾아보다 보니 아래의 두 함수가 가지는 차이점에 대해 바로 이해가 안 되서 저와 같은 분들이 계실 수 있기에 차이점에 대해 적어봅니다.

     

    1-1. 함수를 변수에 할당

    # 1번 함수 - 변수에 할당
    def hello():
        print("hello!")
    
    a = hello  # hello 함수를 a라는 변수에 저장
    a()
    
    # 2번 함수
    def hello(name):
        def func():
            return f'Hello {name}!'
        return func
    
    a1 = hello('bruno')
    a1() # 실행은 되나 print문이 없어서 실행되는지 알기 어렵다. 리턴값을 print로 찍어보면 알 수 있다.
    print(a1) # <function hello.<locals>.func at 0x7f07077f2820> 처럼 a1이 저장된 공간 출력
    print(a1()) # 리턴값을 출력 : Hello bruno!

     

    우선 1번 함수와 2번 함수의 가장 큰 차이점은 인자로 전달되는 값 유무리턴 값의 유무이다.

    인자로 전달되는 값 유무는 어떤 값을 전달하느냐 안 하느냐의 차이를 의미하고

    리턴되는 값의 유무가 중요하다.

    리턴값이 있는 함수를 1번 함수처럼 사용하면 아래처럼 사용할 수 있다.

     

    # 2번 함수를 인자값 없앤 후 1번 함수와 같은 방식으로 정의하면
    def hello():
        def func():
            print('Hello~!')
        return func
    
    a1 = hello # a1은 hello 함수 그 자체를 의미
    a1 # 이렇게만 쓰면 함수 그 자체만 의미하는 것이기에 리턴되거나 프린트되는 값이 없다.
    print(a1) # hello 함수가 저장된 공간이 print된다.
    
    # 출력값
    <function hello at 0x7f739ce76820>
    
    # 리턴되는 값이 있는 경우에는 아래처럼 해야한다.
    a1 = hello()
    a1()
    
    # 출력값
    Hello~!

     

    1-2. 함수를 데이터 구조(자료 구조)에 할당

    def add(x, y):
        return x + y
    
    
    def sub(x, y):
        return x - y
    
    # 함수를 리스트에 할당
    list = [add, sub]
    
    for i in list:
        print(i(5, 5))
        
    # 출력값
    10
    0
    
    
    # 함수를 딕셔너리에 할당
    dict = {
        'add': add,
        'sub': sub
    }
    
    add1 = dict['add'](5, 5)
    sub1 = dict['sub'](5, 5)
    
    print(add1) # 출력값 : 10
    print(sub1) # 출력값 : 0

     

    2. 매개변수(인자)로 전달

    def add(x, y):
        return x + y
    
    def add_func(func, x, y):
        print(func(x, y))
    
    add_func(add, 3, 4)
    # 출력값 : 7

     

    3. 리턴값으로 사용 가능

    def greeting(name):
        def say():
            return f'greeting {name}!'
        return say
    
    func = greeting('bruno')
    print(func())
    # 출력값 : greeting bruno!

     

     

    < 참고 자료 >

    https://shoark7.github.io/programming/python/closure-in-python

     

    댓글

Designed by Tistory.