Dev Language/Python

[파이썬 중급] #4_1. 일급함수 & 클로저 기초

ydin 2021. 11. 17. 19:07

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을 쓰면 클래스를 함수처럼 사용할 수 있다

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