Chapter 05

Part 03. 

 

  • Closure 예제 

 

  • function inspection 

 

  • 잘못된 클로저 사용 

 

  •  

 

Part 04 

 

  • 데코레이터
  • 장점
  • (1) 중복제거, 코드 간결, 공통 함수 작성 할 수 있다 
  • (2) 로깅, 프레임웤, 유효성 체크... -> 공통 기능으로 요약가능하다 (따로 분리 가능) 
  • (3) 조합해서 사용하기가 용이하다 
  • 단점
  • (1) 가독성 감소(상황에 따라 다름)
  • (2) 특정 기능에 한정된 함수는 단일 함수로 작성하는 것이 유리할 수도 있음
  • (3) 디버깅 불편 

 

  • 데코레이터 실습

 

  • 데코레이터 사용해서 함수 구현

  • 데코레이터 미사용

 

  • 데코레이터 사용 

 

Chapter05

 

Part01. 일급함수

  • 일급함수(일급 객체) -> 함수형 프로그래밍을 가능하게 한다
  • 공부한 날짜: 2021.11.17

 

  • 파이썬 함수 특징: (되도록이면 눈에 익히게 여러번 보기)
  • 1. 런타임 초기화
  • 2. 변수할당 가능 
  • 3. 함수 인수 전달 가능(함수를 파라미터로 전달할 수 있다는 말?) 
  • 4. 함수 결과 반환 가능 

 

  • 팩토리얼 함수 구현

- print( set(sorted(dir(factorial))) - set(sorted(dir(A))) ) : 함수가 가진 클래스 속성 없애기 / 함수만이 가진 속성 출력 

-__name__ : 함수 이름 알아낼 수 있음

-__code__: 코드정보 알 수 있음. 자료형. 코드 위치 등(맞나?)

 

  • 함수를 변수로 할당할 수 있음 ( 변수 = 함수)

 

-map() 함수에 대해서 알아보기 (출처: https://blockdmask.tistory.com/531)

+ map () 함수 모양: map(function, iterable #반복가능한 자료형)

+ map함수의 반환 값은 map 객체 이기 때문에 해당 자료형을 list 혹은 tuple로 형 변환 시켜줘야함 

+ 동작: 두번째 인자로 들어온 반복 가능한 자료형을 첫번째 인자로 들어온 함수에 하나씩 집어넣어서 함수를 수행함

+ map()함수를 이용하면 반복문 따로 구현하지 않아도 된다(장점)

 

  • lambda(),filter(), 함수 변수 할당 이용해서 구현 

-filter(): 파라미터에 해당하는 거 빼고 나머지를 함수에 대입하는 함수(?)

-print([var_func(i) for i in range(1,6) if i%2]) : i%2가 1이면 True. 따라서 홀수만 반복문에 적용. 0이면 False이므로 짝수를 이용하지 않음 

 

  • 익명함수 (lambda)
  • 가급적 함수를 작성하고, 꼭 필요한 경우에만 익명함수 이용
  • 일반 함수 형태로 리팩토링 권장 

1부터 10까지 더하는 방식 두가지 형태로 구현

- reduce(): functools 내장모듈의 함수. 여러개의 데이터를 대상으로 주로 누적 집계를 내기 위해서 사용.

초기값을 기준으로 데이터를 루프 돌면서 집계 함수를 계속해서 적용하면서 데이터를 누적하는 방식으로 작동한다

- 형식: reduce(집계함수, 순회 가능한 데이터[ ,초기값])

(출처: https://www.daleseo.com/python-functools-reduce/)

 

  • partial 함수 

- five는 입력숫자*5를 의미한다 

 

Part 02. 클로저 기초 

  • Ex1. 정의되지 않은 변수있으면 함수 실행 불가능함 

 

  • Ex2. b변수 정의 되어있을 때 

 

  • Ex3.  gloabl keyword 이해하기/ local이랑 gloabl 개념 알아두기 / 변수의 scope에서 closure가 시작된다

- local variable nonpriority 있을 오류 발생

-local variable priority 있으면 정상 작동 

 

  • global keyword (권장되는 방법은 아님/ 나중에 숙련도 쌓이면 생각해보기)

 

  • 이해를 돕기 위한 출력 결과 

 

 

  • Closure: 메모리를 공유하지 않고 메시지 전달로 처리하기 위한 여러 언어가 나왔음 -> Erlang
  • Closure(클로저) 사용 이유: 불변 상태를 기억하기 위해서
  • Closure는 메모리를 공유하되 변경되지 않는 (Immutable, Read Only) 구조를 적극적으로 사용 -> 함수형 프로그래밍
  •  서버 프로그래밍 -> 동시성(Concurrency) 제어-> 메모리 공간에 여러 자원이 접근 -> 교착상태(deadlock), racecondition
  • Closure는 불변자료구조 및 atom(원자성, 일관성), STM을 이용 -> 멀티스레트(Coroutine)프로그래밍에 강점

 

  • 클로저 함수로 구현

 

  • 인스턴스 생성(함수를 변수로 할당하는건가?)

-callable을 쓰면 클래스를 함수처럼 사용할 수 있다

-클래스 인스턴스를 함수처럼 사용하고 있다(위의 문장과 거의 동일)

Chapter 04

 

Part 03

  • 공부한 날짜: 2021.11.16
  • 해시테이블(정말 중요!!!)
  • 해시테이블이 중복되었을 때 처리 방법(면접 필수 질문 아마존/구글)
  • key에 value를 저장하는 구조
  • 파이썬 dict가 해쉬 테이블의 예
  • 키 값의 연산 결과에 따라 직접 접근이 가능한 구조
  • key 값을 해싱 함수 -> 해쉬 주소값이 나오고 -> 이걸 기반으로 key에 대한 value 참조

 

  • Hash 값 확인
  • 튜플은 고유하므로 고유한 hash값 출력
  • List mutable -> hash 함수 사용 못함

  • t1 해시값 출력 

 

  • Setdefault 예시 

 

Part 04

 

  • 해시테이블(Hashtable) -> 적은 리소스로 많은 데이터를 효율적으로 관리
  • Dict -> Key 중복 허용 하지 않음, Set -> 중복 허용 하지 않음
  • Dict 및 Set 심화
  • 읽기 전용으로 list, set을 만들어보는 연습 

 

  • Read Only(Frozen), immutable Dict -> 읽기 전용의 테이블을 만든다 & 변경을 불가하게 만듦 

- 딕셔너리는 변경가능? 근데 frozen은 변경 안됨 

 

  • frozen은 add attribute가 없어서 데이터 추가 불가능
  • 정말 중요한 데이터나 유일한 값, 중요한 역할을 하는 값은 frozen으로 설정하기

 

  • 출력결과 

 

  • 선언 최적화
  • 바이트 코드를 실행 후 어셈블링해서 파이썬 인터프리터가 바이트를 실행
  • 바이트 코드 생성 순서를 볼 수 있음 

 

  • 지능형 집합 (Comprehending Set) 

Chapter 04

 

  • 시퀀스형
  • 컨테이너(Container, 서로 다른 자료형을 담음) Ex) List, tuple, collections, deque
  • 플랫(Flat, 한 개의 자료형) Ex) str,bytes,bytearray,array,memoryview
  • 가변: list,bytearray,array,memoryview,deque
  • 불변: tuple, str, bytes
  • 리스트 및 튜플 고급에 대해서 배웠다
  • 클래스 속성 중에 __iter__가 있으면 해당 데이터 반복문에서 사용할 수 있다

Part 01 

  • 지능형 리스트(Comprehending Lists) 구현 여러개

1.  

 

2. 반복문 리스트 안에 넣어서 구현 

 

3. 지능형 리스트 + Map, Filter

 

  • Generator 생성 (장점 검색해보기) / Generator: 한 번에 한 개의 항목을 생성(메모리 유지x)

  • 출력 결과 (array를 리스트로 변환할 때는 .tolist())

 

  • Generator 예제1

  • 출력 결과  (for문이 반복되는 건데 왜 한줄로 출력이 되는걸까?)

  • 예제2 

- 결과는 A1~A20, B1~B20,C1~C20,D1~D20 가 하나씩 출력됨 

 

  • 리스트 깊은 복사/ 얕은 복사 
  • 구현

-mark1과 mark2의 결과가 같아보이지만 수정시에 차이점이 발생한다

-mark1[0][1]만 변경되고 있지만, mark2[0][1]은 모든 원소의 1번 인덱스가 다 변경되었다. 이럴 경우 원하지 않는 데이터가 변경될 수 있으므로 사용시에 주의해야함. 되도록이면 mark1의 방식을 이용하도록 

  • 복사 방식 다름 증명

 

Part 02

  • list vs Array 적합한 사용법 설명
  • 리스트 기반: 융통성, 다양한 데이터 타입 사용 가능, 범용적 사용
  • 숫자 기반: 배열(리스트와 거의 호환)
  • divmod 와 unpacking  
  • 출력 결과 

 

  • Mutable(가변) vs Immutable(불변)
  • 튜플 아이디 계속 변하고 리스트는 연산자의 활용에 따라 자기 자신에 할당해서 아이디 동일하다 

 

  • 출력 결과

 

+ Recent posts