reduce() trong Python

Category: Python

Hàm reduce(fun,seq) được sử dụng để áp dụng một hàm cụ thể được truyền trong đối số của nó cho tất cả các phần tử danh sách được đề cập trong chuỗi được truyền qua. Hàm này được định nghĩa trong mô-đun " functools ".

Ví dụ cơ bản:

Chúng ta hãy bắt đầu bằng một ví dụ đơn giản, trong đó chúng ta tính tổng tất cả các số trong một danh sách.

from functools import reduce

# Hàm cộng 2 số
def add(x, y):
    return x + y

a = [1, 2, 3, 4, 5]
res = reduce(add, a)

print(res)  # Đầu ra: 15

Đầu ra:

15

Giải thích:

  • Hàm reduce() áp dụng hàm add() tích lũy cho các phần tử theo số. Đầu tiên, 1 + 2 = 3. Sau đó, 3 + 3 = 6. Và cứ tiếp tục như vậy cho đến khi tất cả các số được xử lý.

  • Kết quả cuối cùng là 15.

Hãy cùng tìm hiểu chi tiết về hàm reduce:

Cú pháp của reduce()

functools.reduce(hàm, có thể lặp lại[, bộ khởi tạo])

  • hàm: Một hàm nhận hai đối số và thực hiện một phép toán trên chúng.

  • iterable: Một đối tượng có thể lặp lại có các phần tử được xử lý bởi hàm.

  • bộ khởi tạo (tùy chọn): Giá trị bắt đầu cho hoạt động. Nếu được cung cấp, nó sẽ được đặt trước phần tử đầu tiên trong phần lặp.

Hàm reduce() là một phần của module functools, do đó bạn cần import hàm này trước khi sử dụng.

Sử dụng reduce() với lambda

Khi kết hợp với hàm lambda , reduce() trở thành công cụ ngắn gọn và mạnh mẽ cho các tác vụ tổng hợp như tính tổng, nhân hoặc tìm giá trị lớn nhất.

from functools import reduce

# tổng các số với reduce và lambda
a = [1, 2, 3, 4, 5]
res = reduce(lambda x, y: x + y, a)

print(res)

Đầu ra:

15

Giải thích:

  • Hàm lambda lấy hai đối số (x và y) và trả về tổng của chúng.

  • reduce() bắt đầu bằng cách áp dụng hàm cho hai phần tử đầu tiên: 1 + 2 = 3.

  • Kết quả (3) sau đó được sử dụng với phần tử tiếp theo: 3 + 3 = 6, v.v.

  • Quá trình này tiếp tục cho đến khi xử lý xong tất cả các phần tử, cho kết quả là 15.

Sử dụng reduce() với các hàm toán tử

reduce() cũng có thể được kết hợp với các hàm toán tử để đạt được chức năng tương tự như với các hàm lambda và làm cho mã dễ đọc hơn.

import functools

# nhập thư viện operator để dùng các hàm toán tử
import operator

# khởi tạo danh sách
a = [1, 3, 5, 6, 2]

# sử dụng reduce với toán tử cộng để tính tổng các phần tử trong danh sách
print(functools.reduce(operator.add, a))

# sử dụng reduce với toán tử nhân để tính tích các phần tử trong danh sách
print(functools.reduce(operator.mul, a))

# sử dụng reduce với toán tử cộng để nối các chuỗi
print(functools.reduce(operator.add, ["geeks", "for", "geeks"]))

Đầu ra:

17 
180 
geeksforgeeks

Giải thích:

  • Hàm operator.add và operator.mul là các toán tử được xác định trước.

  • reduce() áp dụng hàm cộng tích lũy vào các phần tử trong danh sách.

  • Hoạt động này tương tự như ví dụ lambda nhưng mã sạch hơn và dễ đọc hơn.

Sự khác biệt giữa reduce() và cumulative()

Hàm cumulative() từ mô-đun itertools cũng thực hiện các hoạt động tích lũy, nhưng nó trả về một trình lặp chứa các kết quả trung gian, không giống như reduce(), chỉ trả về một giá trị cuối cùng duy nhất.

Ví dụ với tích lũy:

from itertools import accumulate
from operator import add

# Tổng tích lũy với tích lũy
a = [1, 2, 3, 4, 5]
res = accumulate(a, add)

print(list(res))

Đầu ra

[1, 3, 6, 10, 15]

Sự khác biệt chính

Tính năng

reduce()

accumulate()

acGiá trị trả về

Một giá trị cuối cùng duy nhất (ví dụ:  15).

Kết quả trung gian (ví dụ:  [1, 3, 6, 10, 15]).

Loại đầu ra

Trả về một giá trị duy nhất.

Trả về một trình lặp.

Trường hợp sử dụng

Hữu ích khi chỉ cần kết quả cuối cùng.

Hữu ích khi theo dõi số bước tích lũy.

Nhập khẩu

Từ  functools.

Từ  itertools.

Published on Jun 18, 2025