Python Language
Functools 모듈
수색…
부분적인
partial
함수는 다른 함수에서 부분 함수 응용 프로그램을 작성합니다. 함수의 인수 (또는 키워드 인수)에 값을 바인딩 하고 이미 정의 된 인수없이 호출 가능 함수를 생성하는 데 사용됩니다.
>>> from functools import partial
>>> unhex = partial(int, base=16)
>>> unhex.__doc__ = 'Convert base16 string to int'
>>> unhex('ca11ab1e')
3390155550
partial()
은 이름에서 알 수 있듯이 함수의 부분적인 평가를 허용합니다. 다음 예제를 살펴 보겠습니다.
In [2]: from functools import partial
In [3]: def f(a, b, c, x):
...: return 1000*a + 100*b + 10*c + x
...:
In [4]: g = partial(f, 1, 1, 1)
In [5]: print g(2)
1112
g
가 만들어지면 네 개의 인수 ( a, b, c, x
)를 취하는 f
도 처음 세 개의 인수 인 a, b, c,
f
평가는 g
가 호출 될 때 완료되고 g(2)
는 f
네 번째 인수를 전달합니다.
partial
을 생각하는 한 가지 방법은 시프트 레지스터입니다. 당시에 한 가지 논쟁을 일부 기능으로 밀어 넣었다. partial
은 데이터가 스트림으로 들어오고 하나 이상의 인수를 전달할 수없는 경우에 유용합니다.
total_ordering
주문 가능한 클래스를 만들려면 일반적으로 __eq()__
, __lt__()
, __le__()
, __gt__()
및 __ge__()
메서드를 정의해야합니다.
클래스에 적용된 total_ordering
데코레이터는 __eq__()
, __lt__()
, __le__()
, __gt__()
및 __ge__()
사이에서 __eq__()
의 정의를 허용하며 클래스의 모든 순서 지정 작업을 허용합니다.
@total_ordering
class Employee:
...
def __eq__(self, other):
return ((self.surname, self.name) == (other.surname, other.name))
def __lt__(self, other):
return ((self.surname, self.name) < (other.surname, other.name))
데코레이터는 제공된 메소드와 대수 연산의 조합을 사용하여 다른 비교 메소드를 유도합니다. 예를 들어 우리는 정의 된 경우 __lt__()
와 __eq()__
우리는 유도 할 __gt__()
우리가 간단하게 확인할 수 있습니다 not __lt__() and not __eq()__
.
참고 : total_ordering
함수는 Python 2.7 이후에만 사용할 수 있습니다.
줄이다
Python 3.x에서 이미 여기에서 설명한 reduce
함수는 내장 함수에서 제거되었으며 functools
에서 가져와야합니다.
from functools import reduce
def factorial(n):
return reduce(lambda a, b: (a*b), range(1, n+1))
lru_cache
@lru_cache
데코레이터는 가장 최근에 사용하지 않은 캐시를 사용 하여 값 비싸고 계산 집약적 인 함수를 래핑하는 데 사용할 수 있습니다. 이렇게하면 함수 호출을 메모 할 수 있으므로 나중에 동일한 매개 변수를 사용하는 호출을 다시 계산하지 않고 즉시 반환 할 수 있습니다.
@lru_cache(maxsize=None) # Boundless cache
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
>>> fibonacci(15)
위의 예에서 fibonacci(3)
값은 한 번만 계산되지만 fibonacci
에 LRU 캐시가없는 경우 fibonacci(3)
는 230 번 이상 계산됩니다. 따라서 @lru_cache
는 재귀 함수 나 동적 프로그래밍에 특히 좋습니다. 비싼 함수가 동일한 정확한 매개 변수로 여러 번 호출 될 수 있습니다.
@lru_cache
에는 두 개의 인수가 있습니다.
-
maxsize
: 저장할 호출 수입니다. 고유 호출 수가maxsize
초과하면 LRU 캐시는 가장 최근에 사용 된 호출을 제거합니다. -
typed
(3.3에 추가됨) : 다른 유형의 동등한 인수가 다른 캐시 레코드에 속하는지 여부를 판별하기위한 플래그 (예 :3.0
및3
이 다른 인수로 계산되는 경우)
캐시 통계도 볼 수 있습니다.
>>> fib.cache_info()
CacheInfo(hits=13, misses=16, maxsize=None, currsize=16)
참고 : @lru_cache
는 사전을 사용하여 결과를 캐시하므로 함수의 모든 매개 변수는 캐시가 작동하도록 해시 가능해야합니다.
@lru_cache
대한 공식 파이썬 문서 . @lru_cache
가 3.2에 추가되었습니다.
cmp_to_key
파이썬은 주요 기능을 받아들이는 방식을 변경했다. 이러한 함수는 값을 받아 배열을 정렬하는 데 사용되는 키를 반환합니다.
이전 비교 함수는 두 개의 값을 취하고 첫 번째 인수가 두 번째 인수보다 작거나 같거나 큰 경우 -1, 0 또는 +1을 각각 반환합니다. 이것은 새로운 키 기능과 호환되지 않습니다.
그것이 functools.cmp_to_key
가 들어있는 곳입니다 :
>>> import functools
>>> import locale
>>> sorted(["A", "S", "F", "D"], key=functools.cmp_to_key(locale.strcoll))
['A', 'D', 'F', 'S']
Python 표준 라이브러리 문서 에서 가져온 예제