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 |