Remarks
이 글은 전문가를 위한 파이썬(Fluent Python)을 정리한 자료입니다.
일급 객체
다음과 같은 작업을 수행할 수 있는 프로그램 개체
- Runtime에 생성할 수 있음
- 데이터 구조체의 변수나 요소에 할당할 수 있음
- 함수 인수/결과로 전달할 수 있음
5.1 함수를 객체처럼 다루기
- 객체의 도움말 텍스트
__doc__
def factorial(n): '''returns n!''' # __doc__ return ...
>>> factorial.__doc__
'returns n!'
>>> help(factorial)
...
5.2 고위 함수
고위 함수(higher-order function)
함수를 인자로 받거나, 함수를 결과로 반환하는 함수
5.5 사용자 정의 콜러블형
class BingoCage:
...
def __call__(self):
return self.pick()
>>> bingo = BingoCage()
>>> bingo() # bingo.__call__()
5.7 위치 매개변수에서 키워드 전용 매개변수까지
def f(a, b, *, c):
return a, b, c
>>> f(1)
TypeError: f() takes 2 positional arguments but 1 were given
>>> f(1, 2)
TypeError: f() missing 1 required keyword-only argument: 'c'
>>> f(1, 2, 3)
TypeError: f() takes 2 positional arguments but 3 were given
>>> f(1, 2, c=3)
1, 2, 3
5.9 함수 애너테이션
def clip(text: str, max_len: 'int > 0'=80) -> str:
...
- 애너테이션은 전혀 처리되지 않으며, 단지 함수 객체 안의 dict형
__annotations__
속성에 저장될 뿐이다 - 애너테이션을 추출하기 위해,
inspect.signature()
를 사용
5.10 함수형 프로그래밍을 위한 패키지
5.10.1 operator 모듈
from functools import reduce
from operator import mul
def fact(n):
# return reduce(lambda a, b: a*b, range(1, n+1))
return reduce(mul, range(1, n+1))
operator.itemgetter
itemgetter(1)
:lambda fields: fields[1]
[]
연산자를 사용하므로 mapping,__getitem__()
을 사용하는 모든 클래스를 지원
from operator import itemgetter
datas = [
(1, 'a', 'A', ...),
...
(2, 'b', 'B', ...)
]
for data in sorted(datas, key=itemgetter(1)):
print(data)
operator.attrgetter
,operator.methodcaller
도 존재하나 굳이 쓸 일이 있을까 싶다..
5.10.2 functools.partial()로 인수 고정하기
functools.partial()
: 원래 함수의 일부 인수를 고정한 콜러블을 생성
partial()
의 첫 번째 인수는 callable, 이후로는 바인딩할 위치 인수와 키워드 인수가 들어감- lambda와 partial을 비교: https://wikidocs.net/13973
PREVIOUSEtc