본 과정은 제가 파이썬 수업을 들으면서 배운 내용을 복습하는 과정에서 적어본 것입니다.
틀린 부분이 있다면 댓글에 남겨주시면 고치도록 하겠습니다.
확실하지 않은 내용은 ‘(?)’을 함께 적었으니 그 내용을 아신다면 댓글에 남겨주시면 감사하겠습니다.
1) 함수형 프로그래밍 특징
- 값을 파이썬에서는 객체
- 값이면 할당할 때 오른쪽 식에 쓸 수 있다.
• Functions are first class (objects). -> 값처럼 쓸 수 있다. • Recursion is used as a primary control structure. In some languages, no other “loop” construct exists.
-
python은 recursion(재귀) 쓸 수는 있는데 속도가 느려서 안쓴다. • There is a focus on list processing (for example, it is the source of the name Lisp). Lists are often used with recursion on sublists as a substitute for loops.
- mutable 쓰면 쉽다.
- 자연어처리에도 많이쓰고 빅데이터에 많이 쓰인다.
- for문을 줄일려고 한다. (순회가 많으므로 읽기가 어렵다.)
- 오컴의 면도날 : 단순한게 좋다.
a= print # 얇은 초록색: 함수, class / 두꺼운 초록색: keyword
a('경아') # 경아
# 함수를 값으로 (class)로 만들었다.
a.__name__ # 'print' -> 실제 이름은 print이지만 a로 이름만 바뀜
sum = 0 # sum이 사라진다.
del sum # 원래 함수로 돌아간다.
sum (range(1,101)) # 5050
sum = 0 # 어리석은 방법
for i in range(1,101):
sum+=i # sum 함수를 덮어버리게 되면 기본 sum 기능을 못쓴다. <- 안좋은 것
sum # 5050
del sum
a = [str, int, float]
a[0](2) # '2' 함수니까 값처럼 만들 수는 있지만 이렇게 사용하진 않음
def a(x):
print(x())
a(print) # 'None': 이것도 된다. 하지만 이렇게 하면 안된다. <- anti pattern
2) closure
- closure: 함수 안에 함수를 집어넣어서 하는 것 : 중첩된 함수 (Nested function)
-
자습서에도 있다. https://docs.python.org/ko/3/tutorial/index.html
- decorator: 함수를 중첩시키는 것
x=1
def y():
print(x)
y() # 1
x=1
def y():
x=2
print(x)
y() # 2 -> 찾는 순서 : L(logcal) E(Enclosed) G (global -> 함수 밖 영역) B(built-in -> 있는지 없는지 찾고 )
x=1
def y():
x=x+1
print(x)
y() # unboundlocalerror : 안에 있는 애 접근은 할 수 있지만 변경은 못시킴
x=1
x=1
def y():
global x # 글로벌 붙이면 싱크가된다. (?) 안에 있는 로컬과 밖에 있는 글로벌이 서로 싱크가된다.
x=x+1
print(x)
y() # control+shift+'-' 하면 나눠진다.
y() # Shift + m
x # 안좋다. -> x=3으로 바뀌기 때문에
out:
2
3
3
# closure
def y(x):
def z(n):
return x+n # parameter 인자 2개
return z
two_add=y(2)
two_add(3)
out:
5
---------------------
def y(n):
return lambda n: n+x
a=y(3)
a(2)
out:
3
3) decorator
- 함수 or 클래스를 인자로 받아서 기능을 바꿔주는 애
- ex) telegram
-
@ 써서 다른 기능을 추가 가능
-
함수형 패러다임은 for문 쓰는거 안좋아한다.
- descripter: private 화
4) pbd.set_trace()
- 파이썬 디버깅 패키지
def y():
import pdb; pdb.set_trace() # h : help, c: countinue, p x : 현재 p의 기법이 뭔가 알려주는 것 , l: 어디가 문제인지 알려주는 것
x=x+1
print(x)
y() # x+1이 안된다.
----------------------
x=1
def y():
breakpoint() # 잠시 멈춰라라는 명령어 -> p: print , p x: print x 값 , l : 현재 소스 코드, q: quit
x= x+1
print(x)
y() # x+1이 안된다.
------------------------
x=1
def y():
global x # 싱크 해주는 것 하지만 수정, 변경은 못한다. -> 단 글로벌을 붙이면 바꿀수 있다.
x= x+1
print(x)
y() # 2
----------------------------
x=1
def y():
x= 3 # 함수 안에서 쓰는 임시 변수 # 안에서 밖 접근할 수 있다. 하지만 변경 못함, but 글로벌 붙이면 변경가능
print(x)
y() # 3
x # 1
----------------------------
x=1
def y():
x=x+3 # 오른쪽 식에 있으면 함수 밖에 있는 값 -> 밖에서는 안에 접근할 수 없다. : encapsulation
print(x)
y() # UnboundLocalError 에러가 뜬다.
x
def y():
z=1
print(x)
y.z = 3
y() # 1
y.z # 3
5) encapsulation
- 밖에서는 안에 접근할 수 없다. : encapsulation
class A:
x=1 # function은 바꿀 수 없다. 근데 2가 나온다. -> class는 밖에서 안에서 바꿀 수 있다.
A.x=2
a=A()
a.x # 2
무단 배포 금지
Comments