Học bằng cách đọc theo thứ tự

Kiểm tra hàng loạt với all() và any()

Học cách dùng all() và any() trong Python để kiểm tra hàng loạt phần tử của list, kèm bẫy hành vi trên collection rỗng.

all() — True chỉ khi mọi phần tử đều True

all(iterable) trả về True khi mọi phần tử của list, tuple, hay set bạn truyền vào đều là True (hoặc đánh giá truthy), và False nếu chỉ một phần tử là False.

Cách all() quyết định
[T, T, T]all()True[T, F, T]all()False[ ] (rỗng)all()True

True nếu mọi phần tử là True. False nếu có phần tử nào False. True khi truyền vào iterable rỗng.

Cùng quy tắc truthiness từ bài trước áp dụng ở đây: 0, chuỗi rỗng, và list rỗng được xem là False, nên một list số chứa 0 sẽ làm all() trả về False.

# List bool: False nếu có phần tử nào False
print(all([True, True, True]))    # True
print(all([True, False, True]))   # False

# List số: False nếu có 0 trong đó
print(all([1, 2, 3]))             # True
print(all([1, 0, 3]))             # False

# Mọi trường bắt buộc trong form đã được điền chưa?
form_values = ["Minh", "minh@example.com", "123 Lê Lợi, Quận 1"]
if all(form_values):
    print("Sẵn sàng gửi")
else:
    print("Một số trường còn trống")
# Đầu ra: Sẵn sàng gửi

Kiểm tra xem mọi món hàng trong giỏ có còn hàng không.

① Định nghĩa in_stock = [True, True, True, False].

② In kết quả của all(in_stock).

③ Với if all(in_stock):, in "Tiến hành thanh toán" khi mọi thứ còn hàng, ngược lại in "Một số món đã hết hàng".

(Phần giải thích sẽ hiện ra khi bạn chạy code đúng)

Python Editor

Chạy code để xem đầu ra

any() — True nếu có ít nhất một phần tử là True

any(iterable) trả về True nếu có ít nhất một phần tử là True, và False chỉ khi mọi phần tử đều là False. Nếu all() là kiểm tra nghiêm ngặt yêu cầu tất cả đồng thuận, thì any() là kiểm tra dễ tính chỉ cần một cái khớp.

HàmTrả về True khiTrả về False khiVới list rỗng
all()Mọi phần tử là TrueCó ít nhất một phần tử FalseTrue
any()Có ít nhất một phần tử TrueMọi phần tử là FalseFalse
# List bool: True nếu có ít nhất một là True
print(any([False, False, True]))   # True
print(any([False, False, False]))  # False

# Thử lại nếu có ít nhất một cờ lỗi được bật
error_flags = [False, False, True, False]
if any(error_flags):
    print("Cần thử lại")
else:
    print("Tất cả đều thành công")
# Đầu ra: Cần thử lại

Kiểm tra xem có ít nhất một người trả lời khảo sát muốn tham gia hay không.

① Định nghĩa want_to_join = [False, False, False, True, False].

② In kết quả của any(want_to_join).

③ Với if any(want_to_join):, in "Tổ chức sự kiện" khi có ít nhất một người đồng ý, ngược lại in "Hủy bỏ".

Python Editor

Chạy code để xem đầu ra

Hành vi khi truyền vào collection rỗng

Khi bạn truyền vào một list rỗng, all([]) trả về Trueany([]) trả về False. Điều này phản trực giác, nên hãy cẩn thận khi dữ liệu có thể hợp lệ là không có phần tử nào.

Hành vi với collection rỗng
[ ] (rỗng)all()True[ ] (rỗng)any()False
print(all([]))   # True  <- không có "cái False" nào để tìm, nên True
print(any([]))   # False <- không có "cái True" nào để tìm, nên False

# Ví dụ: giỏ hàng chưa đăng ký món nào
cart = []
if all(cart):
    print("Đã kiểm tra mọi món")   # vẫn chạy ngay cả khi giỏ có 0 món
# Điều này có thể không khớp ý bạn, nên hãy kiểm tra rỗng trước

Quyết định cách xử lý list rỗng từ trước

Khi bạn dùng all() với tinh thần "nếu mọi thành viên thỏa điều kiện…", 0 thành viên vẫn trả về True. Để tránh lọt qua ngoài ý muốn, hãy kiểm tra list không rỗng trước, như if members and all(...):.

Tự xác nhận hành vi với list rỗng.

① Định nghĩa empty = [].

② In kết quả của all(empty)any(empty).

③ Dùng if empty and all(empty): để in "Mọi món OK" chỉ khi list không rỗng và mọi thứ là True (xác nhận không có gì in ra với list rỗng).

Python Editor

Chạy code để xem đầu ra

Kết hợp với điều kiện để kiểm tra hàng loạt

all() / any() thực sự tỏa sáng khi kết hợp với biểu thức so sánh. Để kiểm tra "tất cả có từ 18 tuổi trở lên không?", hãy xây một list các kết quả >= 18 từ tuổi và truyền vào — toàn bộ kiểm tra gói gọn trong một dòng.

ages = [19, 20, 18, 25, 57]

# Xây list bool trước, rồi truyền cho all (phiên bản 2 bước dễ hơn)
checks = [age >= 18 for age in ages]
print(checks)         # [True, True, True, True, True]
print(all(checks))    # True

# Hoặc viết inline (list comprehension / generator expression — sẽ học sau)
print(all(age >= 18 for age in ages))   # True
print(any(age >= 65 for age in ages))   # False

Chúng ta sẽ bàn chi tiết về list comprehension như [age >= 18 for age in ages] trong chương for. Bây giờ, đủ để bạn cảm nhận được "có thể đánh giá một điều kiện trên cả list và truyền kết quả thẳng vào all() / any()".

Dùng một list điểm bài kiểm tra để đưa ra phán đoán kiểu đậu/rớt.

① Định nghĩa scores = [78, 82, 65, 91, 55].

② Quyết định xem mọi người có đạt 60 trở lên không (dùng all) và có ít nhất một người đạt 90 trở lên không (dùng any), rồi gán vào all_passhas_genius.

③ In cả hai kết quả.

Python Editor

Chạy code để xem đầu ra

Trong bài này, chúng ta đã học all()any() để kiểm tra nội dung của list hoặc tuple hàng loạt.

all() yêu cầu mọi người đều đạt, any() chỉ cần ít nhất một, và với input rỗng all là True còn any là False. Trong bài tiếp theo, chúng ta sẽ đào sâu vào vòng lặp for — engine đứng sau biểu thức [... for ... in ...] đã âm thầm xuất hiện ở đây với vai trò "list các kết quả".

QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1Đoạn code này in gì?
print(all([1, 2, 0, 3]))

Câu 2Đoạn code này in gì?
print(any([False, False, False]))

Câu 3Khi truyền vào list rỗng [], kết hợp giá trị trả về nào của all([]) và any([]) là đúng?