상태변화와 변경가능한 데이터는 가능한 피하면서 작성하는 프로그래밍
OOP는 캡슐화를 통해 사이드이펙트를 제어
FP는 사이드이펙트를 아예 배제
FP는 No Object 변수를 최대한 지양
(여기서 말하는 Object는 클래스가 아님)
파이썬은 멀티패러다임 언어지만 FP를 위한 기능들이 존재한다.
예제1
def highFunc(f, a, b): return f(a, b) def add(A, B): return A+B
예제 2
def MakeAddFunc(add): def Add(A): return A + add return Add #ex Addfunction = MakeAddFunc(10) Addfunction(30) MakeAddFunc(10)(30)
장점 ? 구현을 미룬다(다형성)
아직 구현되지 않은 기능이 있더라도 그것에 관한 signiture만 있다면 함수를 받아서 조합해 사용할 수 있다.
예시3
value = 10 def func(a): value_copy = value def Add(b): return value_copy + a + b return Add AddFuction = func(10) value = 20 AddFuction(5) # 10 + 10 + 5 중간에 전역변수 value가 바뀌었지만 영향을 받지 않는다.
꼬리재귀를 만들면 자동적으로 최적화시켜주는 언어가있음(메모리공간최적화)
(파이썬은 없음)
def recursive(i):
if(i==1000):
return print('done')
recursive(i+1)
recursive(0)
RecursionError: maximum recursion depth exceeded while calling a Python object
파이썬은 Default Maximum Recursion Depth는 대략 1000임
옵션값 변경으로 제한을 풀기전까지 원활하게 사용이 힘듬
왜? 파이썬은 순수함수지향형 언어가 아니기 때문이다.
그러므로 일일히 만들어야 한다.
해결책? ==> @Decorator(Syntactic Sugar)
예시4
#꼬리재귀 최적화를 유도하는 함수 def tail_recursive(f): def decorated(*args, **kwargs): while True: try: return f(*args, **kwargs) except Recurse as r: args = r.args kwargs = r.kwargs continue return decorated
문제 : 하나하나 만들기 어려움
More FP-specific Code = Math + Library
Laguage Featur // Implementation
OOP : 객체를 만들고 객체들끼리 협력시키는 방법으로 프로그래밍
FP : 쪼개고 모듈화함
FP is based on Math
Category Theory의 공부가 필요하다.
Monade, Functor, Lambda도 수학적 개념을 프로그래밍으로 가져온 것
Library helps Python
for문을 없애야 할까?
For loop is Functional
굳이 모든 for문을 재귀함수로 바꿀 필요가 없다
Pythonic Code
파이썬스러운 코드와는 배치 될 가능성이 있다
FP는 만병통치약이 아니다(파이썬 FP의 단점)
그럼에도 불구하고 여러 최적화 방법이 존재한다
속도문제
순수성
학습곡선
파이썬은 FP로 완전히 대체하기가 힘들다. 그러므로 적재적소에 사용하자.
객체로 디자인해서 사용하는게 좋은 경우에는 그렇게 쓰자.
출처 : https://www.youtube.com/watch?v=UPmQHHpS3cw&ab_channel=PyConKorea