0. Introduction
- 이번 시간에 배울 내용은 특히 더 중요하다.
- 이번 시간에는 일급 객체라고도 불리는
일급 함수
에 대해 알아보겠다. - 그 후,
일급 함수
의 예인 lambda, callable, partial에 대해 알아본다.
1. 일급 함수(first-class)란??
- 일급 함수(일급 객체, first-class)란??
- 객체 취급되는 함수
- 다음 4가지 특징을 가지는 함수를 말한다.
- 1. 런타임 초기화: 실행 시점에서 초기화한다.
- 2. 함수를 변수에 할당 가능하다.
- 3. 함수를 인수로 전달 가능하다. (Higher - order function의 첫 번째 특징)
- 4. 함수를 결과값으로서 반환 가능하다. (Higher - order function의 첫 번째 특징)
위 일급 함수의 특징들은
파이썬 함수의 특징
이라고 할 수 있다.그러면 일급함수는 왜 중요한가??
- 일급함수를 알아야 ‘함수형 프로그래밍’ 을 할 수 있기 때문이다.
- ‘함수형 프로그래밍’ 이란??
- side effect를 허용하지 않는 순수 함수(pure function)를 지향하여 동시에 여러 thread에서 문제 없이 동작하는 프로그램을 쉽게 작성하는 방식
이러한 이유로
일급 함수
에 대해 알아보자.일급 함수가 가지는 특징을 모두 예제로 구현해볼 것이다.
1.1 객체 취급되는 함수
객체란 무엇인가???
- [TIL] Python basic 14: class에 따르면 소프트웨어로 구현할 대상이라 했다.
하지만 파이썬 내부에서의 객체의 정의와 특징은 무엇일까???
파이썬이 data를 추상화(abstraction)한 것을 말하며,
id(identity), type(형) 그리고, value(값)을 가dd지는 걸 말 한다.
파이썬의 모든 데이터는 객체나 객체 간의 관계로 표현된다.
객체 id는 메모리 상에서 객체의 주소이며, id는 만들어진 후에는 변경되지 않는다.
- from 데이터 모델: 객체
attribute란 점표현식을 사용하는 이름으로 참조되는 객체와 결합한 값(value)
함수 객체 : 함수처럼 행동하는 객체 from 함수 객체의 장점
그럼 코드 상에서 확인해보자.
|
|
1.2 변수로 할당되는 함수
- 함수 또한 객체로 취급되는 걸 확인했다.
- 다음으로 이 함수가 변수에 할당되는지 확인해보자.
|
|
- 변수에 할당되어 여러 함수에 사용될 수 있다는 걸 확인했다.
1.3 고위 함수의 두 가지 특징
Higher - order function (고위함수)의 특징
- 1. 함수를 인수로 전달 가능하다.
- 2. 함수를 결과값으로서 반환 가능하다.
고위 함수의 대표적인 예로는
map
,filter
,reduce
,lambda
등이 있다.그러면 코드로 확인해보자.
|
|
reduce
: 여러 원소를 하나의 원소로 줄이기 위해, 왼쪽에서부터 오른쪽 방향으로 축적하며 함수를 적용해간다.
|
|
2. High - order functions
2.1 익명 함수(lambda)
이름 없는 함수로, 익명 함수다. 그래서 익명 함수가 복잡할 때, 주석을 사용해야 한다.
하지만, 되도록 함수를 만들어서 사용하자. 일반 함수 형태로refactoring
을 권장한다.
|
|
2.2 Callable
호출 연산자로 함수, 클래스 인스턴스, 메서드 등이 호출 가능한지 확인하는 함수다. 이를 구체적으로 확인하는 방법은 specail method인
__call__
method의 존재 유무를 확인하는데, 이 method가 있으면 True다.
from What is a ‘callable’
- 호출한다는 건 무슨 의미일까???
|
|
- 이를
callable
로 확인해보자.
|
|
3.14
는 호출할 수 없다는 걸callable
을 통해 간단히 확인했다.
2.3 Partial
인수를 고정할 때 사용하는 함수로, 콜백 함수에 사용하기 때문에 매우 중요하다.
- 코드로 알아보자.
|
|
2.4 Signature
signature(callable, *, follow_wrapped=True) 형식으로 인자로 callable을 취하고, annotation을 반환한다.
signature
함수는inspect
module에서 import한다.inspect
module은- 모듈은 모듈, 클래스, 메서드, 함수, 트레이스백, 프레임 객체 및 코드 객체와 같은 라이브 객체에 대한 정보를 얻는 데 도움이 되는 몇 가지 유용한 함수를 제공한다.
- 예를 들어
- 클래스의 내용을 검사하거나,
- 메서드의 소스 코드를 꺼내오거나,
- 함수의 인자 리스트를 추출하고 포맷하거나,
- 자세한 트레이스백을 표시하는 데 필요한 모든 정보를 얻는 데 도움이 될 수 있다.
- from Inspect: 라이브 객체 검사
|
|