functional paradigm에서는 어떤 값을 튜플로 주로 사용한다.
모든 것은 함수 기반이다.
a = 0
b = a+1
a = 3
- 절차적 패러다임
절차적 패러다임은 일일히 다 보아야 사용할 수 있다.
함수형 패러다임은 유지보수가 간편하다. (함수가 잘 짜여져 있는지만 확인하면 된다.)
우리의 주 패러다임은 객체지향이다. 객체지향과 함수형 패러다임은 비슷한 편.
%timeit ((((1+2)+3)+4)+5)
100000000 loops, best of 3: 14.7 ns per loop
%timeit (1+(2+(3+(4+5))))
10000000 loops, best of 3: 14.9 ns per loop
괄호 하나차이로도 속도의 차이가 크게 난다.
def t():
for i in range(10):
print(i)
거대한 시퀀스 메모리에 효과적이다 : generator
한 번 실행 시킬 때마다 하나씩 나오니까 하나씩 필요할 때, 제너레이터가 효율적이다. (메모리 활용에 유리하다)
그게 아니고 한 번에 필요한 것이 많다면 그냥 할당해서 사용하는 편이 좋다.
comprehension : 반복식. 반복식이라고 하지만 그냥 comprehension이라고 부르자.
decorator: 클로저와 매우 흡사한 기능을 한다. 함수를 parameter로 설정하고 사용할 때 argument를 함수로 받아서 받은 함수를 되돌려주는 것.
assert condition : 조건에 맞지 않으면 에러를 내줘!
예외처리이다. 디버깅 모드에서만 효과가 있으며 릴리즈에서는 아무런 일도 하지 않는다. 예외처리와 비슷하지만 조금 다른 상황에서 사용한다.
map은 for를 없앨 수 있는 것이다.
for를 그냥 쓰는 것은 함수형 패러다임이 아니다. 생각의 차이이다.
더 우아하고 간단하게 같은 것을 할 수 있는데 코드를 길게 쓸 이유가 없다.
reduction : 축소, 하나의 결과값으로 축약한다.
sum([1,2,3,4,5]) -> 15 : 결과를 하나로 축약해서 보여주었다. 이를 reduction이라고 한다.
여러개의 값이 들어가서 값이 하나만 나온다면 reduction이다. ex) sum, all
class A:
a = 3
x = A()
x.a : 3
class A:
a = 3
def t(self):
return 4
x = A()
x.t() : 4
클래스 안에 있는 함수는 메소드이다.
메소드는 클래스의 이름을 붙여서 사용한다. A().t() : 이렇게 메소드로 사용하는 것이 함수보다는 실수가 적다.
함수보다는 클래스의 메소드가 더 우아하다.
- 객체지향은 또 패러다임이다. (함수형, 절차적) -> 파이썬은 이를 모두 사용할 수 있는 멀티 패러다임이라 매우 강력하다.
인스턴스화.
리터럴방식 vs 인스턴스화하는 방식(객체)
callable(A) -> A라는 클래스에 괄호를 붙일 수 있냐 없냐, 보통 괄호를 붙일 수 있는 것은 인스턴스화 할 수 있는 것과 함수인 경우. -> A 뒤에 괄호 붙일 수 있는지 없는지... True, False 반환, function or method
람다에는 이름이 붙지 않기 때문에, 익명함수라고 한다. 할당해서 이름 붙일 수 있다.
functional paradigm, 수학적 개념이 매우 중요하다.
lambda에는 callable을 붙이면 True
>>> adders = []
>>> for n in range(5):
adders.append(lambda m: m+n)
accumuation pattern
>>> [adder(10) for adder in adders]
[14, 14, 14, 14, 14]
>>> n = 10
>>> [adder(10) for adder in adders]
[20, 20, 20, 20, 20]
클래스 안을 보고 yield가 있다면 generator이다.
generator는 iterator의 일종이다. 그렇기에 next를 쓸 수 있다.
>>> for _, prime in zip(range(10), primes): -> _는 어떤뜻인가?
... print(prime, end=" ")
....
7 11 13 17 19 23 29 31 37 41
_는 4가지 사용법이 있다 : 변수 이름지을 때, 첫번째는 특수문자 못오지만 첫번째는 쓸 수 있다.
두번째 세번째는 객체에서 한다.
네번째는 for _, prime in zip(range(10), primes): 이런방식에서 사용될때 쓴다. _는 관례상 안쓴다는 것을 나타내주기 위해서 사용한다.
zip도 객체
<zip at 0x26077295948>
list(zip([1,2,3])) -> 객체가 눈에 잘 안보일때 사용하자.
[(1,), (2,), (3,)]
list(zip([1,2,3], [4,5,6,7])) -> 수에 맞게 이어주고 넘치는 것은 삭제해준다.
[(1, 4), (2, 5), (3, 6)]
*도 여러 사용방법이 있다 : 방법들은 꼭 외우자
next(zip([1,2,3], [4,5,6,7])) : 이터레이터라는 것을 알 수 있다.
(1, 4)
for _, prime in zip(range(10), primes): 결국 이 코드는 range 10개 코드는 관례상 사용하지 않겠다고하는 _에 들어가고, prime에는 primes 값이 들어간다.
zip은 next가 불릴 때마다 값이 불린다.
predicate : 논리학에서 많이 사용되는데 True, False로 반환되는 값.
lazy evaluation : 뭔가를 부를 때 딱 해주는 것이 lazy evaluation이다.
itertools : 고급 반복기법을 지원해주는 툴들, 기본적으로 next로 실행한다.
functools :
from ..... import .... : 이렇게 쓰면 namespace 안에 바로 입력된다. 따로 .....qwerwqf라고 사용하지 않아도 그냥 내 네임스페이스에 기록되서 바로바로 쓸 수 있따. qwerwqf
t = chain([1,2,3], [2,3,4], [1], [2,3]) -> next(t) : 반복
같은 특성을 가진 연속된 수를 연결해준다.
t = chain([1,2,3], (2,3,4), [1], [2,3]) : 여기에서는 2,3과 2,3이 튜플과 리스트이기 때문에 연결되지 않는다.
'노력 > 인공지능' 카테고리의 다른 글
7. 파이썬 개인공부 7 (객체) (0) | 2019.03.24 |
---|---|
6. 파이썬 개인공부 6 (함수) (0) | 2019.03.23 |
4. 파이썬 개인공부 4 (반복) (0) | 2019.03.21 |
3. 파이썬 개인공부 3 (데이터 타입, 함수) (0) | 2019.03.20 |
2. 파이썬 개인공부 2 (데이터 타입) (0) | 2019.03.19 |