Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python functools 모듈 완벽 가이드: 고차 함수와 핵심 유틸리티

파이썬에서 함수는 고차 함수(higher-order function)로 분류됩니다. 이는 함수가 다른 함수의 인자로 전달되거나, 다른 함수를 반환값으로 돌려줄 수 있다는 의미입니다. functools 모듈은 이러한 고차 함수를 더욱 효과적으로 활용할 수 있도록 다양한 유틸리티를 제공합니다.

partial() 함수

partial() 함수는 호출 가능한(callable) 'partial' 객체를 반환합니다. 이 객체 자체는 하나의 함수처럼 동작합니다. partial()은 다른 함수를 인자로 받아 원래 함수의 일부 인자를 고정(freeze)함으로써, 더 단순한 시그니처를 가진 새로운 객체를 생성합니다.

내장 함수인 int()는 숫자를 10진수 정수로 변환하며, 기본 시그니처는 다음과 같습니다.

int(x, base=10)

partial() 함수를 사용하면 base 인자가 기본값 2로 고정된, int()처럼 동작하는 호출 가능 객체를 손쉽게 만들 수 있습니다.

>>> import functools
>>> binint = functools.partial(int, base=2)
>>> binint('1001')
9

다음 예제는 사용자 정의 함수 myfunction()을 partial 함수의 인자로 전달하고, 원래 함수의 인자 중 하나에 기본값을 설정하는 방법을 보여줍니다.

>>> def myfunction(a, b):
    return a * b

>>> partfunction = functools.partial(myfunction, b=10)
>>> partfunction(10)
100

partialmethod()

partialmethod()는 새로운 partialmethod 디스크립터(descriptor)를 반환합니다. partial과 유사하게 동작하지만, 직접 호출되는 대신 클래스 내부에서 메서드 정의로 사용하도록 설계되었다는 점이 다릅니다.

cmp_to_key() 함수

파이썬 2.x에는 두 객체를 비교하는 cmp() 함수가 있었지만, 파이썬 3에서는 폐기(deprecated)되었습니다. functools 모듈은 cmp_to_key() 함수를 제공하여 사용자 정의 클래스의 객체 간 비교를 key 기반 방식으로 수행할 수 있도록 지원합니다.

from functools import cmp_to_key

class test:
    def __init__(self, x):
        self.x = x
    def __str__(self):
        return str(self.x)

def cmpr(a, b):
    if a.x >= b.x:
        return True
    if a.x < b.x:
        return False

mykey = cmp_to_key(cmpr)

reduce() 함수

reduce() 함수는 함수와 반복 가능한(iterable) 객체, 두 개의 인자를 받으며 결과로는 단일 값을 반환합니다. 참고로 파이썬 3에서는 reduce()가 내장 함수에서 제외되어 functools 모듈로 이동했습니다. 인자로 받은 함수는 시퀀스의 요소들에 왼쪽부터 오른쪽으로 누적적으로 적용됩니다. 첫 번째 호출의 결과가 다음 호출의 첫 번째 인자가 되고, 시퀀스의 다음 항목이 두 번째 인자가 됩니다. 이 과정은 모든 요소가 처리될 때까지 반복됩니다.

아래 예제에서는 두 수의 곱을 반환하는 mult() 함수를 정의하고, 이를 reduce()와 함께 1부터 10까지의 숫자 범위에 적용합니다. 출력 결과는 10의 팩토리얼 값입니다.

import functools

def mult(x, y):
    return x * y

num = functools.reduce(mult, range(1, 11))
print('factorial of 10: ', num)

실행 결과

factorial of 10: 3628800