본문 바로가기

PYTHON

Functional Programming

1. Functional Programming

(1) 프로그래밍 언어가 문제를 분해하는 방법

- 절차적 언어 : 어떻게 문제를 해결해야하는지 지시사항(명령)
- 선언적 언어:해결해야할 문제를 설명하는 사양 작성
- 객체지향 언어: 객체의 모음 조작
- 함수형 프로그래밍: 문제를 여러개의 함수로 분해
- 재사용을 위해서 encapsulation
- 정의역의 원소들을 공역의 원소로 사상(mapping)

 

(2) Functional Programming in Python

- 재귀가 for 반복문 대신

- for while 은 코드가 길어질때 흐름잡기 어려움

- 함수로 멀티프로세싱 (여러번 동시사용) 

- 함수형 패러다임에서의 함수는 제약이 강하다

- 형식적 증명가능성( 입력값,출력값 존재 )

① 정확성 떄문에 이론적인 내용을 프로그래밍화 하기 쉬움 

② 딥러닝 같은 경우 함수형 패러다임이 있음

③ 캡슐화 : 이름으로 묶음 (객체지향에서 캡슐화, 함수형 프로그래밍에서 모듈화)

④ 선언정의를 통해서 재사용 가능 

 

(3) 파이썬 선언 2가지 :함수 클래스 선언/정의

 - encapsulation/ module화 : 긴 코드를 이름 하나로 묶음 :def

- 이름 하나로 재사용 가능

- copy and paste

 

(4) functional paradigm loop 지양

- iterator, generator
- comprehension
- Recursion
- map, filter, reduce 

 

#factorial 을 재귀함수 사용하지 않고 만들기
reduce(mul, [1,2,3,4])
==> 24
reduce(lambda x,y : x*y, [1,2,3,4]) #위와 동일
==> 24

#for 반복문을 사용하면 속도 느림
temp = 1
for i in range(1, 5):
    temp *= i
temp    
==>24

 

 

2. 중첩

(1) 중첩이 가능한 경우

1) 코드 흐름제어
   조건문 : if, elif, else
   반복문 : for, while, else
   예외처리: try, except, else,finally, pass
2) Encapsulation - 접근 제한
  함수(funtion), 클래스(clasS)

#for 구문을 함수 내부에 중첩시켜 구함
def sum_(a):
    sum2 =0
    for i in a:
        sum2 +=i
    return sum2
    
#자료가 1인 조건을 검사하기 위해 for 문내에 중첩시켜 하나씩 검사하여 갯수 반환
def one_count(*iterable): 
    count1=0              #초기화
    for i in iterable:    #for 반복문으로 자료 갯수만큼 반복
        if i==1:          #조건문: i는 1인 경우에만 카운트에 포함
            count1 +=1
    return count1         #값 반환
    
one_count(1,1,2,3,2,1) ==> 3

count1 
==> NameError: name 'count1' is not defined
# Name Error : 함수 내부의 할당된 식별자는 외부에서 접근 불가
# 원인은 변수의 스코프 문제때문에 발생

 

3. Closure

- 함수 안에 함수를 정의하는 경우

- 외부함수 실행후 종료가 되어도 내부함수는 외부 함수의 최종변수에 접근 가능 LEGB규칙, 그 반대는 기본으로 제공하지 않음
- 각 함수로 묶어서 독립적 사용 가능하여 내부함수를 외부함수로부터 수정 불가하도록 함

def t(a):
    def x():
        return a+1
    return x
    
t 
==> <function __main__.t(a)>

t(3) #t의 return은 x(함수 이름)
==> <function __main__.t.<locals>.x()>

t(3)() # return으로 나온 x함수를 실행하려면 괄호를 한번 더 붙인다.
==>4


def x(n):      #외부 함수
    def y(m):  #내부 함수
        return n+m
    return y
    
x(2)(1)  #외부함의 최종 결과값 y=3
==> 3

x(1)(2) #외부함의 최종 결과값 y=3
==> 3

x(1)
==> <function __main__.x.<locals>.y(m)>

 

4. Higher Order Function

- 함수를 인자롤 받고 함수를 리턴할 수 는 함수
- 고차함수라고도 불리나 고차원 함수로 이해할수있어 higer order function으로 사용
- 괄호를 붙이지 않은 함수 이름/ Lambda사용

- 고차함수는 함수를 인자의 하나로 넣어서 iterable 과 함께 계산
- 괄호를 붙인 함수 이름은 실행된 값이기 때문

def b(func, xx):
    return func(xx)

def c(xx):
    return xx + 1
    
c(1) 
==> 2

# 함수 b는 함수 c를 인자로 받음
b(c, 4) # b(c,4)=c(4)=5
==> 5

b  #함수식
==> <function __main__.b(func, xx)>

def f(func, a):
    return func(a)

def g(a):
    return a + 1
    
f(g, 1)
==> 2

 

 

 

'PYTHON' 카테고리의 다른 글

Asterisk(*)  (0) 2020.11.16
Recursion(재귀함수)  (0) 2020.11.16
예외 처리문  (0) 2020.11.12
할당  (0) 2020.11.06
PEP  (0) 2020.11.06