Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

functools - Higher-order functions và operations on callable objects trong Python


Hàm trong Python được coi là higher-order (bậc cao). Nghĩa là nó có thể được truyền như đối số cho hàm khác và/hoặc có thể trả về hàm khác. Module functools cung cấp các tiện ích quan trọng cho các higher-order functions này.

Hàm partial()

Hàm này trả về một đối tượng callable 'partial'. Đối tượng này hành xử như một hàm. Hàm partial() nhận một hàm khác làm đối số và đóng băng (freeze) một phần các đối số của hàm đó, kết quả là một đối tượng mới với signature (chữ ký) đơn giản hơn.

Hàm built-in int() chuyển đổi số thành số nguyên thập phân. Signature mặc định của int() là:

int(x, base=10)

Hàm partial() có thể dùng để tạo callable hành xử như hàm int() nơi đối số base mặc định là hai.

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

Trong ví dụ sau, hàm người dùng định nghĩa myfunction() được dùng làm đối số cho partial function bằng cách đặt giá trị mặc định cho một trong các đối số của hàm gốc.

>>> def myfunction(a, b):
    return a * b
>>> partfunction = functools.partial(myfunction, b=10)
>>> partfunction(10)
100

partialmethod()

Hàm này trả về descriptor partialmethod mới hành xử như partial ngoại trừ nó được thiết kế để dùng như định nghĩa phương thức thay vì gọi trực tiếp.

Hàm cmp_to_key()

Python 2.x có hàm cmp() để so sánh hai đối tượng. Python 3 đã deprecated (ngừng hỗ trợ) nó. Module functools cung cấp hàm cmp_to_key() để so sánh đối tượng của các lớp do người dùng định nghĩa.

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)

Hàm reduce()

Hàm reduce() nhận hai đối số, một hàm và một iterable. Tuy nhiên, nó trả về một giá trị đơn. Hàm đối số được áp dụng tích lũy cho hai đối số trong danh sách từ trái sang phải. Kết quả của hàm trong lần gọi đầu tiên trở thành đối số đầu tiên và mục thứ ba trong danh sách trở thành đối số thứ hai. Quá trình này lặp lại cho đến khi danh sách hết.

Trong ví dụ dưới, hàm mult() được định nghĩa để trả về tích của hai số. Hàm này được dùng trong reduce() cùng với range số từ 1 đến 10. Kết quả là giá trị giai thừa của 10.

import functools

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

num = functools.reduce(mult, range(1, 11))
print('Giai thừa của 10:', num)

Kết quả

Giai thừa của 10: 3628800