[Python]일급함수(일급객체)

파이썬에서 일급함수에 대해 알아보자

'''
일급함수(일급객체)
파이썬 함수 특징
1. 런타임 초기화
2. 변수 할당 가능
3. 함수 인수전달 가능
4. 함수 결과 반환 가능
'''


# 함수객체
def factorial(n):
    '''
    Factorial Function
    n: 정수
    '''
    if n == 1:
        return 1
    return n * factorial(n - 1)


# 클래스
class A:
    pass


print(factorial(5))
print(factorial.__doc__)
print(type(factorial), type(A))
print(set(sorted(dir(factorial))) - set(sorted(dir(A))))
print(factorial.__name__)
print(factorial.__code__)
print()
'''
120

    Factorial Function
    n: 정수
    
<class 'function'> <class 'type'>
{'__closure__', '__globals__', '__builtins__', '__defaults__', '__qualname__', '__kwdefaults__', '__call__', '__get__', '__annotations__', '__name__', '__code__'}
factorial
<code object factorial at 0x00000193F5755E70, file "D:\project\python\level2-study\chapter05_01.py", line 12>
'''

# 변수 할당
var_func = factorial
print(var_func)
print(var_func(10))
print(list(map(var_func, range(1, 11))))
print()
'''
<function factorial at 0x00000193F5383F40>
3628800
[1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]
'''

# 함수인수 전달 및 함수로 결과반환 -> 고위 함수(Higer-order Function)
# map, filter, reduce

# 나머지가 1인 것만 필터링 (1,3,5)
print([var_func(i) for i in range(1, 6) if i % 2])
print(list(map(var_func, filter(lambda x: x % 2, range(1, 6)))))
print()
'''
[1, 6, 120]
[1, 6, 120]
'''

# reduce
from functools import reduce
from operator import add

print(sum(range(1, 11)))
print(reduce(add, range(1, 11)))
print()
'''
55
55
'''

# 익명함수(lambda)
# 가급적 주석을 작성하고, 가급적 일반함수를 이용하도록 하자
print(reduce(lambda x, y: x + y, range(1, 11)))
print()
'''
55
'''

# Callable : 호출 연산자 -> 메소드 형태로 호출가능한지 확인 해주는 함수
print(callable(str), callable(A), callable(factorial), callable(list), callable(3))
print()
'''
True True True True False
'''

# partial 사용법 : 인수고정 -> 콜백 함수에 주로사용
from operator import mul
from functools import partial

print(mul(10, 10))

# 인수고정(5)
five = partial(mul, 5)
print(five(10))
print([five(i) for i in range(1, 11)])
print()
'''
100
50
[5, 10, 15, 20, 25, 30, 35, 40, 45, 50]
'''

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

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다