In computer science, a programming language is said to have first-class functions if it treats functions as first-class citizens. This means the language supports passing functions as arguments to other functions, returning them as the values from other functions, and assigning them to variables or storing them in data structures.[1] Some programming language theorists require support for anonymous functions (function literals) as well
(https://en.wikipedia.org/wiki/First-class_function)
일급함수에 대해 Wiki 에서는 다음과 같이 설명하고 있다. 프로그래밍 언어 내에서 함수에 대해 다음과 같이 다룰 수 있다면 일급함수를 가진다고 말할 수 있다. 함수는 다른 함수의 인자로 들어갈 수 있으며, 함수의 반환값이 될 수 있다. 함수를 변수에 할당할 수 있으며, 자료구조 내에 담을 수도 있다. 또한 필수적인 조건은 아니지만, 익명함수로도 작성될 수 있는 것도 해당된다
이러한 정의에 비춰볼 때, 파이썬은 일급함수를 가진다. 일급함수의 각 특징에 대해 파이썬 코드 예시와 함께 살펴보자
일급함수 특징 (1) - 런타임 초기화
함수가 실행시점에 초기화 된다
일급함수 특징 (2) - 함수를 객체로서 변수에 할당 가능하다
# 함수는 객체이다
def factorial(n):
'''Factorial Function -> n : int'''
if n == 1: # n < 2
return 1
return n * factorial(n-1)
class A:
pass
# func class 의 객체
print(factorial(6))
print(factorial.__doc__)
print(type(factorial), type(A))
print(set(sorted(dir(factorial))) - set(sorted(dir(A))))
print(factorial.__name__)
print(factorial.__code__)
# 변수 할당
var_func = factorial
print(var_func)
print(var_func(10))
일급함수 특징 (3) - 함수를 인자로 전달 가능
# 함수 인수 전달 및 함수로 결과 반환 -> 고위 함수(Higher-order function)
# map, filter, reduce 등
# map, filter
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])
# reduce
from functools import reduce
from operator import add
print(reduce(add, range(1,11))) # 누적
print(sum(range(1,11)))
# 익명함수(lambda) - 일반 함수 형태로 리팩토링 권장
print(reduce(lambda x, t: x + t, range(1,11)))
일급함수 특징 (4) - 함수를 return 가능
# Callable : 호출 연산자 -> 메소드 형태로 호출 가능한지 확인
# 호출 가능 확인
print(callable(str), callable(list), callable(var_func), callable(3.14))
from inspect import signature
sg = signature(var_func)
print(sg)
print(sg.parameters)
# partial 사용법 : 인수 고정 -> 콜백 함수에 사용
from operator import mul
from functools import partial
print(mul(10,10))
# 인수 고정
five = partial(mul, 5)
# 고정 추가
six = partial(five, 6)
print(five(10))
print(six())
print([five(i) for i in range(1,11)])
print(list(map(five, range(1,11))))
Futures 라이브러리와 파이썬 병렬성 구현 - GIL, concurrent.futures (0) | 2022.05.12 |
---|---|
코루틴 (Coroutine) (3) - 개념, 장점, 구현 (0) | 2022.05.11 |
코루틴 (Coroutine) (2) - 병행성과 Generator (0) | 2022.05.11 |
코루틴 (Coroutine) (1) - Iterator 와 Generator (0) | 2022.05.11 |
클로저 (Closure) (2) - 클로저 개념 및 구현 (0) | 2022.05.09 |
댓글 영역