[Python] 일급함수 - 기본 특징

^_^·2022년 7월 16일
0

Python

목록 보기
8/9
post-thumbnail

일급함수(First-class function)

일급함수란 프로그래밍 언어가 함수를 first-class citizen으로 취급하는 것을 뜻한다. 쉽게 말해 함수 자체를 인자로써 다른 함수에 전달하거나 다른 함수의 결과 값으로 리턴할 수도 있고, 함수를 변수에 할당하거나 데이터 구조 안에 저장할 수 있는 함수를 뜻한다.

함수형 프로그래밍에 속하는 방법으로 함수형 프로그래밍을 사용하면 코드를 간결하게 작성할 수 있어 개발 시간을 단축할 수 있다. 함수형 프로그래밍 언어는 부작용을 허용하지 않는 순수 함수를 지향하며 동시에 여러 스레드에서 문제 없이 동작하는 프로그램을 쉽게 작성할 수 있다.

Python함수 특징

일급함수를 이해하려면 Python함수의 특징을 알아야 한다.

  1. 실행시점에 런타임 초기화
    • 런타임이란 파이썬 프로그램이 실행(run)되고 있는 시간(time)을 의미한다.
  2. 함수를 변수에 할당 가능
def factorial(n):
    '''Factorial Function -> n : int'''
    if n == 1:
        return 1
    return n * factorial(n-1)

class A:
    pass

var_func = factorial

print(var_func)
print(var_func(10))
print(list(map(var_func, range(1,11))))
# 출력
<function factorial at 0x000001CF5FB4DFC0>
3628800
[1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]

map(f, iterable)은 함수(f)와 반복 가능한(iterable) 자료형을 입력으로 받는다. map은 입력받은 자료형의 각 요소를 함수 f가 수행한 결과를 묶어서 돌려주는 함수이다.

  1. 함수를 다른 함수의 인수(Parameter)로 전달 가능
def factorial(n):
    '''Factorial Function -> n : int'''
    if n == 1:
        return 1
    return n * factorial(n-1)

print(list(map(var_func, filter(lambda x: x % 2, range(1, 6)))))
print([var_func(i) for i in range(1, 6) if i % 2])
 
# 출력
[1, 6, 120]
[1, 6, 120]

익명함수 lambda는 가급적 주석을 다는것을 권장하고 있다.

  1. 함수 결과 반환 가능(return)
from functools import reduce
from operator import add

print(reduce(add, range(1,11)))
print(sum(range(1,11)))
print(reduce(lambda x, t: x + t, range(1,11)))
# 익명함수 x가 add이다.
# 출력
55
55
55

reduce함수는 인자를2개 받는다. 위 코드에선 1에서 11까지 add로 더해주는데 하나하나 줄여가며 누적해서 더해준다. 더 빠른것은 아래 sum을 이용하는 방법이지만 reduce함수도 알아두면 좋다고한다.

일급함수 예시

callable

호출 연산자로 메소드 형태로 호출 가능한지 확인해 보자. 3.14를 제외한 모든 요소들이 True가 출력된다. 호출이 가능하다는 말이다. 3.14(12)이런식으로 호출이 불가능하기 때문에 False를 출력한다.

print(callable(str), callable(lsit), callable(var_func), callable(factorial), callable(3.14))
# 출력
True True True True False

partial

인수 고정 -> 콜백 함수 사용

from operator import mul
from functools import partial

# 인수 고정
five = partial(mul, 5)
# 함수를 인자로 전달 했고 함수를 변수에 할당했다. 일급 함수의 특징을 갖고 있다.

# 고정 추가
six = partial(five, 6)

print(five(10))
print(six())
# six 함수에 인자를 넣어 전달하면 에러가 발생한다. 
# 이미2개의 인자를 받도록 되어있는데 인자를 추가하기 때문이다.
print([five(i) for i in range(1, 11)])
print(list(map(five, range(1, 11))))
# 출력
100
50
30
[5, 10, 15, 20, 25, 30, 35, 40, 45, 50]
[5, 10, 15, 20, 25, 30, 35, 40, 45, 50]

Functools partial 함수는 기존 파이썬 함수를 재사용하여 일부 위치 매개변수 또는 키워드 매개변수를 고정한(freezed, fixec) 상태에서, 원래의 함수처럼 작동하는 새로운 부분 객체(partial object)를 반환한다.
출처: https://rfriend.tistory.com/526 [R, Python 분석과 프로그래밍의 친구 (by R Friend):티스토리]

0개의 댓글