반응형

1. 개념

순수 함수들을 조합하여 전체 프로그램을 구현하는 방식으로 말 그대로 프로그램 내에서 데이터 연산 및 처리를 수학적인 개념에서 이해하여 다루려는 개념

2. 콘셉트

  • side effect 차단
    모든 state를 immutable 하게 만들어 side effect를 사전에 차단하려 합니다. f(x+y) = z 가 있다면 f(x+y) = n 가 절대 불가능하듯 하나의 함수가 단 하나의 정상 값과 동작 결과를 갖도록 합니다.
  • 모든 것을 객체로 취급
    함수형 프로그래밍에서는 모든 것을 객체로 취급하기 때문에 함수 자체도 객체로 취급합니다. 따라서 함수형 프로그래밍에서는 함수가 인수로 전달되고, 변수에 할당될 수 도 있으며 반환될 수 있습니다.
  • 보다 쉽고 안전한 동시성 작업
    모든 객체들이 immutable 하기 때문에 여러 스레드에서 동시에 접근하더라도 side effect가 발생할 일이 없습니다.

3. 함수형 프로그래밍의 주요 개념

1) 일급 함수

일급 함수는 아래와 같은 조건을 만족하는 함수로 대표적으로 kotlin, java script 함수들이 일급 함수에 속합니다. 파이썬 역시 모두 객체로 이루어져 있기 때문에 함수 역시 객체이고 따라서 파이썬의 함수 또한 일급 함수입니다.

  • 변수나 데이터 구조 내부에 할당 가능
  • 파라미터로 전달 가능
  • 반환 값(return value)으로 사용 가능
  • 할당에 사용된 이름과 무관히 고유하여 구별이 가능하고 동적 프로퍼티 할당이 가능
def factorial(n):
    '''factorial func -> n : int'''
    if n == 1 :
        return 1

    # 반환값으로 사용
    return n * factorial(n-1)

# 변수로 할당
fac = factorial 
>>> <function factorial at 0x10d30eb00>

# 인수로 전달 
[fac(i) for i in range(1,6) if i %2 ]
>>> [1, 6, 120]

A. 클로저

개념적으로는 외부 함수에 접근할 수 있는 내부 함수 또는 이러한 원리를 말합니다. 사용에 따라 내부 함수 범위에서는 외부 함수 범위의 변수에 접근이 가능하지만 그 반대는 실현이 불가능하다는 개념입니다. 따라서 외부 함수는 외부 함수의 지역변수를 사용하는 내부 함수가 소멸될 때까지 소멸되지 않습니다. 이를 구현하기 위해 일급 함수의 개념이 필요합니다.
일반적으로 가용 가능한 메모리 공간은 한정되어 있어 여러 자원이 접근 시 교착상태(dead lock)가 발생할 수밖에 없는데 이를 위해 동시성 제어가 필요하고 이때 클로저가 유용하게 쓰입니다.

def closure_example():
    lists = []
    #cnt = 0
    #total = 0

    #def average(v) :
    #    nonlocal cnt, total
    #    cnt += 1
    #    total += v
    #    return total / cnt

    def average2(v):
        lists.append(v)
        return sum(lists) / len(lists)
    return average2

ce = closure_example()

ce(10)
>>> 10
ce(20)
>>> 15
ce(20)
>> 16.6666....

주석 처리한 부분을 살리고 average2를 제거해도 동일한 기능을 수행합니다.

print(closure_ex3.__code__.co_freevars)
>>> ('series',)
print(avg_closure1.__closure__[0].cell_contents)
>>> [10, 20, 20]

매직 메서드를 통해 어떤 값이 저장되고, 자유 변수는 무엇인지 등 다양한 정보를 확인 가능합니다.

 

c.f ) Python의 스코프 규칙(scope rule) 

모든 객체(변수, 함수 등 모든 것)의 우선순위는 Local -> (enclosed) -> Global -> Built in 의 순을 갖습니다.  

2) 고차 함수

람다 계산법에서 만들어진 개념으로 일급 함수의 부분집합으로 볼 수 있습니다.

  • 함수에 함수를 인수로 전달 가능
  • 함수의 반환 값으로 함수를 사용 가능

3) 순수 함수

함수형 프로그래밍에 꼭 필요한 개념입니다.

  • 동일한 입력에는 항상 동일한 결과를 반환
  • 함수의 실행이 프로그램 전체 실행과는 무관하다.(즉 side effect가 없다)
a = 10
def say(b) :
    a = 20
    print(a)
    print(b)



print(say(10))

> > > 20  
> > > 10

print(a)

> > > 10  
반응형
복사했습니다!