일급객체(함수)는 4가지 특징을 갖고 있음
1. 런타임 초기화 (실행 시점에 초기화)
2. 함수를 변수에 할당 가능해야함
3. 함수를 다른 함수 인수로 전달 가능해야함
4. 함수를 결과로 반환(return) 가능 해야함
# 팩토리얼 함수 객체 (재귀)
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(type(factorial), type(A)) #함수와 클래스 메타 차이
print(set(sorted(dir(factorial)))- set(sorted(dir(A)))) # set로 차집합하여 함수만의 성질을 출력
print(factorial.__name__) # 함수의 이름
print(factorial.__code__) # 작성한 코드와, 파일위치, 작성된함수의 라인수 등 상세정보 출력
2. 변수에 함수를 할당 가능해야함 (실행도 가능)
# 2. 변수에 함수할당 가능. 또한 실행도 가능
var_func=factorial
print(var_func)
print(var_func(10))
print(list(map(var_func, range(1,11))))
3. 함수를 인수로 전달할수 있어야함.
# 익명함수 Lambda를 인수로 전달.
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])
from functools import reduce
from operator import add
print(reduce(add, range(1,11)))
print(sum(range(1,11)))
# ----------------------------
# 익명함수(Lambda)
# 익명함수를 사용시에는 가급적 주석을 작성하는 것이 좋음
# 가급적 Lambda 말고 일반 함수 형태로 리펙토링을 권장함.
print(reduce(lambda x, t: x + t, range(1,11)))
# ----------------------------
# Callable : 호출연산자 -> 메소드 형태로 호출 가능한지 확인
# 호출 가능 확인
print(callable(str), callable(A), callable(list), callable(var_func), callable(factorial), callable(3.14))
# ----------------------------
# Partial 사용법 : 인수를 고정할떄 사용 -> 콜백 함수 사용
from operator import mul
from functools import partial
print(mul(10,10))
# 인수 고정
five=partial(mul, 5) # mul 함수의 첫번째 인자를 5로 고정하겠다는 의미
print(five(10))
print(five(100))
# 고정 인수 추가
six=partial(five, 6)
print(six())
print([five(i) for i in range(1,11)])
print(list(map(five, range(1,11))))
4. 함수를 결과로 반환할수 있어야 함.
def closure_ex1():
# Free variable==자유변수==내가 사용하고자하는 함수 바깥에 선언된 변수
# 클로저 영역
series=[]
def averager(v):
series.append(v)
print('inner >>> {} / {}'.format(series, len(series)))
return sum(series) / len(series)
return averager
avg_closure1=closure_ex1()
print(avg_closure1)
'Language > Python' 카테고리의 다른 글
[Python] Pyinstaller 로 exe 파일 만들어보자 (0) | 2023.12.31 |
---|---|
[Python] Python 프로젝트를 PyPI 에 배포해보자 (1) | 2023.12.31 |
[Python] Socket:: ICMP Sniff (0) | 2022.01.08 |
[Python] Boolean 인덱싱 (0) | 2021.11.02 |
[Python] Numpy:: 2차원, 다차원 배열에서의 인덱싱과 슬라이싱 (0) | 2021.11.02 |