Câu 1Đoạn code này in gì?print(all([1, 2, 0, 3]))
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.
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
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àm | Trả về True khi | Trả về False khi | Với list rỗng |
|---|---|---|---|
| all() | Mọi phần tử là True | Có ít nhất một phần tử False | True |
| any() | Có ít nhất một phần tử True | Mọi phần tử là False | False |
# 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
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ề True và any([]) 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.
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(...):.
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()".
Trong bài này, chúng ta đã học all() và 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ả".
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
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?