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

Ví dụ Lambda và Filter trong Python

lambda tạo hàm ẩn danh một dòng. filter(func, iterable) lọc phần tử thoả mãn func. Kết hợp tạo code hàm gọn nhẹ.

Lambda Expression

lambda arguments: expression
# Tương đương:
# def func(arguments):
#     return expression

Filter Function

filter(function, iterable) -> iterator
# Trả về iterator chứa các item mà function(item) == True

Ví dụ: Lọc số chẵn từ list

nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# Lambda trong filter
result = filter(lambda x: x % 2 == 0, nums)

# Chuyển iterator -> list
print(list(result))  # [2, 4, 6, 8, 10]

Ví dụ nâng cao: Lọc dictionary/list of dicts

users = [
    {'name': 'Alice', 'age': 25, 'active': True},
    {'name': 'Bob', 'age': 17, 'active': False},
    {'name': 'Charlie', 'age': 30, 'active': True},
    {'name': 'David', 'age': 16, 'active': True}
]

# Lọc user active và >= 18 tuổi
adults = list(filter(lambda u: u['active'] and u['age'] >= 18, users))
print(adults)
# [{'name': 'Alice', 'age': 25, 'active': True}, {'name': 'Charlie', 'age': 30, 'active': True}]

Kết hợp với map() và reduce()

from functools import reduce

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# Pipeline: filter even -> map square -> reduce sum
total = reduce(
    lambda a, b: a + b,
    map(lambda x: x**2, filter(lambda x: x % 2 == 0, numbers))
)
print(total)  # 4+16+36+64+100 = 220

# Pythonic hơn: generator expression
total = sum(x**2 for x in numbers if x % 2 == 0)
print(total)  # 220

Lưu ý

  • filter trả về iterator (lazy evaluation), tiết kiệm bộ nhớ.
  • Lambda chỉ dành cho logic đơn giản (1 expression). Logic phức tạp → dùng def.
  • Python 3: filter trả về iterator, Python 2 trả list.
  • Ưu tiên list comprehension/generator expression cho readability: [x for x in nums if x%2==0].

Kết luận

Lambda + filter mạnh cho functional style. Trong Python hiện đại, list comprehension/generator thường được ưu tiên do dễ đọc hơn. Dùng filter khi function đã có sẵn hoặc chain nhiều phép biến đổi.