일급함수
- 런타임 초기화 - 실행시첨에 초기화
- 함수를 변수에 할당 가능
- 함수를 다른함수의 인수로 전달 가능
- 함수를 다른함수의 결과로 반환 가능
# 함수 객체
def factorial(n):
'''Factorial Function -> n : int'''
if n == 1 :
return 1
return n * factorial(n-1)
class A:
pass
print(factorial(5))
print(factorial.__doc__), print()
print('함수의 타입과 클래스의 타입 비교')
print(type(factorial), type(A))
print(dir(factorial)), print()
print('함수만 가지고 있는 속성들(함수 - 클레스))')
print(set(sorted(dir(factorial))) - set(sorted(dir(A))))
--------------------------------------------[result]
120
Factorial Function -> n : int
함수의 타입과 클래스의 타입 비교
< class 'function' > < class 'type' >
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
함수만 가지고 있는 속성들
{'__call__', '__defaults__', '__qualname__', '__name__', '__annotations__', '__get__', '__code__', '__kwdefaults__', '__closure__', '__globals__'}
변수에 함수 할당
# 변수에 할당
var_func = factorial
print('factorial id: ', id(factorial))
print(var_func)
print('var_func id: ', id(var_func))
print(var_func(10))
print('map: ', map(var_func, range(1,6)))
print(list(map(var_func, range(1,6))))
--------------------------------------------[result]
factorial id: 2948940843616
<function factorial at 0x000002AE9A924A60>
var_func id: 2948940843616
3628800
map: <map object at 0x000002AE99F4ED68>
[1, 2, 6, 24, 120]
함수 인수로 할수를 전달 및 함수의 결과로 함수 반환
# 함수를 결과로 반환
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(list(map(var_func, range(1,6))))
--------------------------------------------[result]
[1, 6, 120]
[1, 6, 120]
[1, 2, 6, 24, 120]
Reduce
# reduce()
from functools import reduce
from operator import add
print(reduce(add, range(1,11), 10)) # 누적, 초기값 10
print(reduce(add, range(1,11))) # 누적, 초기값 없음
# reduce 대신 sum 사용한 경우
print(sum(range(1,11)))
--------------------------------------------[result]
65
55
55
users = [
{'mail': 'gregorythomas@gmail.com', 'name': 'Brett Holland', 'sex': 'M', 'age': 73},
{'mail': 'hintoncynthia@hotmail.com', 'name': 'Madison Martinez', 'sex': 'F', 'age': 29},
{'mail': 'wwagner@gmail.com', 'name': 'Michael Jenkins', 'sex': 'M', 'age': 51},
{'mail': 'daniel79@gmail.com', 'name': 'Karen Rodriguez', 'sex': 'F', 'age': 32},
{'mail': 'ujackson@gmail.com', 'name': 'Amber Rhodes', 'sex': 'F', 'age': 42}
]
from functools import reduce
reduce(lambda acc, cur: acc + cur["age"], users, 0)
# 익명함수(lambda)
# 가급적 주석 작성 - 이해의 편의성을 위해서
# 가급적 함수 사용 - 간결한 경우만 사용 익명함수(lambda)
# 가급적 주석 작성 - 이해의 편의성을 위해서
# 가급적 함수 사용 - 간결한 경우만 사용
# 일반 함수 형태로 리팩토링 권장
# 람다함수 사용 예시
print(reduce(lambda x, t: x + t, range(1,11)))
# 일반 함수 형태로 리팩토링 권장
print(reduce(lambda x, t: x + t, range(1,11)))
--------------------------------------------[result]
55
55
Callable & signature
# Callable : 호출 연산자 -> 메소드 형태로 호출 가능한지 확인
# 호출 가능 확인
print(callable(str), callable(list), callable(var_func), callable(A), callable(3.14))
# signature 함수를 통해서 함수의 인자 타입을 알 수 있다.
from inspect import signature
sg = signature(var_func)
print(sg)
print(sg.parameters)
--------------------------------------------[result]
True True True True False
(n)
OrderedDict([('n', <Parameter "n">)])
Partial
# partial 사용법 : 인수 고정 -> 콜백 함수에 사용
from operator import mul
from functools import partial
print(mul(10,10))
--------------------------------------------[result]
100
# 인수 고정
five = partial(mul, 5)
# 고정 추가
six = partial(five, 6)
print(five(10))
print(six())
# 5의 배수 표현, comprehensive & map
print([five(i) for i in range(1,11)])
print(list(map(five, range(1,11))))
--------------------------------------------[result]
50
30
[5, 10, 15, 20, 25, 30, 35, 40, 45, 50]
[5, 10, 15, 20, 25, 30, 35, 40, 45, 50]
'Python > Intermediate' 카테고리의 다른 글
[Python] Decorator (0) | 2021.05.25 |
---|---|
[Python] Closure (0) | 2021.05.25 |
[Python] 고급 - Dict 및 Set(2) (0) | 2021.05.24 |
[Python] 고급 - Dict 및 Set(1) (0) | 2021.05.23 |
[Python] 고급 - 리스트 및 튜플(2) (0) | 2021.05.23 |