In [5]:
# 순수함수
# 아래의 add함수는 순수함수 이다.

def add(a,b):
    return a+b

# add함수가 순수 함수인 이유는 항상 동일한 인자를 주면 동일한 값을 리턴하기 때문이다. 
print(add(10,5))
print(add(10,5))
print(add(10,5))


15
15
15

In [8]:
#순수 함수가 아닌예를 보자!

c = 10

def add2(a, b): 
    return a + b + c

#c가 앞으로 변화가 있을 수 있다고 가정을 한다면 add2는 순수함수가 아니다. 
#그런데 만약 c가 상수로써 존재 한다면 add2역시 순수함수이다.

print(add2(10,2))
print(add2(10,3))
print(add2(10,4))

c = 20

print(add2(10,2)) #c로 인해서 같은 인자를 넘겼을때 리턴값이 변경되게 된다. 
print(add2(10,3)) #이렇게 결과가 달라지는 함수는 순수 함수가 아니다. 
print(add2(10,4))


22
23
24
32
33
34

In [14]:
c = 20

#아래의 함수는 순수 함수가 아니다 리턴값으로 소통하는 것 외에 어떠한 외부의 상태에 영향을 미치는 부분이 존재를 한다. 
#여기서는 c의 상태를 변경을 한다. 
def add3(a,b):
    global c #전역 변수를 변경하기위한 선언
    c = b
    return a+b

"""
add3의 동일한 인수에 대한 결과는 모두 동일하지만 
함수 실행전의 c의 상태와 함수가 실행 되고 나서의 c의 상태는 달라지는 부수효과를 내포하고 있다.
아래의 함수는 리턴값외에 다른방식으로 외부의 상태에 직접 관여를 하고 있다.
이런함수를 부수효과가 있는 함수라고 한다. 즉 순수함수가 아니다.
"""
print("c : ",c)
print(add3(10,50))
print(add3(10,50))
print(add3(10,50))
print("c : ",c)


c :  20
60
60
60
c :  50

In [15]:
class Obj():
    def __init__(self):
        self.val = 10

obj = Obj()

"""
아래는 순수함수도 아니고 리턴값도 없다. 
단지 넘어온 객체의 val을 변경 한다.
즉 외부의 상태를 변경하는 부수효과를 가지고 있다. 
"""
def add4(obj, b):
    obj.val += b

print(obj.val)
add4(obj, 20)
print(obj.val)


10
30

In [18]:
"""
함수형 프로그래밍에서는 객체의 값을 변경하는 방법이 기존의 프로그래밍 방식과 다르다.
원래있던 값은 그대로 두고 새로운객체를 생성해서 원하는 부분의 값이 변형되어져서 리턴하는 방식으로 
값을 변경한다.

아래는 순수 함수를 이용해서 기존의 객체의 상태가 변경된 새로운 객체를 생성해서 리턴하는 방식으로
값을 변경하는 방법이다. 

아래의 add5는 인자로 받은 객체의 상태를 직접 변경하지 않고 있고 그외의 외부 상태도 변경하지 않고 있다. 즉 순순 함수 이다.
"""

class Obj:
    def __init__(self):
        self.val = 10

obj1 = Obj()

def add5(obj, b):
    l_obj = Obj()
    l_obj.val = obj.val + b  #obj를 참조만 할뿐 값을 직접 변경 하지는 않는다.
    return l_obj

print(obj1.val)
obj2 = add5(obj, 20)
print(obj1.val)  #값이 그대로 찍힌다.
print(obj2.val)


10
10
30

In [2]:
# 일급함수

In [ ]:
# add_maker