Khi cần kiểm tra xem một tuple có chứa toàn giá trị None hay không, có thể dùng hàm all() kết hợp generator expression.
Hàm all() trả về True nếu tất cả phần tử trong iterable là True (hoặc iterable rỗng).
Ví dụ
# Tuple toàn None
tuple_all_none = (None, None, None, None, None, None, None)
print(f"Tuple: {tuple_all_none}")
# all(elem is None for elem in tuple) -> True nếu mọi phần tử là None
result = all(elem is None for elem in tuple_all_none)
print(f"Toàn giá trị None? {result}")
# Tuple có giá trị khác None
tuple_mixed = (None, None, 'value', None)
print(f"\nTuple mixed: {tuple_mixed}")
result2 = all(elem is None for elem in tuple_mixed)
print(f"Toàn giá trị None? {result2}")
# Tuple rỗng
empty_tuple = ()
result3 = all(elem is None for elem in empty_tuple)
print(f"\nTuple rỗng: {empty_tuple}")
print(f"Toàn giá trị None? {result3}") # True (vacuous truth)
Kết quả
Tuple: (None, None, None, None, None, None, None) Toàn giá trị None? True Tuple mixed: (None, None, 'value', None) Toàn giá trị None? False Tuple rỗng: () Toàn giá trị None? True
Giải thích
- Generator expression
(elem is None for elem in tuple_all_none)tạo iterator các giá trị True/False. all()kiểm tra tất cả đều True.elem is Noneso sánh identity (nhanh và chính xác hơn==cho None).- Tuple rỗng:
all()trả vềTrue(vacuous truth - đúng vacuous).
Cách khác
# Cách 1: set() - tuple toàn None -> set chỉ có 1 phần tử None
def all_none_set(tup):
return set(tup) == {None} or set(tup) == set()
# Cách 2: count()
def all_none_count(tup):
return tup.count(None) == len(tup)
# Cách 3: any() - phủ định
def all_none_any(tup):
return not any(elem is not None for elem in tup)
# Test
test_cases = [
(None, None, None),
(None, 1, None),
(),
(None,),
]
for t in test_cases:
print(f"{t}: all()={all(x is None for x in t)}, set()={all_none_set(t)}, count()={all_none_count(t)}")
Kiểm tra tuple KHÔNG có giá trị None
def no_none(tup):
"""True nếu tuple không chứa None."""
return all(elem is not None for elem in tup)
print(no_none((1, 2, 3))) # True
print(no_none((1, None, 3))) # False
Đếm số lượng None
def count_none(tup):
return sum(1 for x in tup if x is None)
print(count_none((None, 1, None, 2, None))) # 3
Ứng dụng: Validate dữ liệu đầu vào
def validate_required_fields(record, required_indices):
"""Kiểm tra các trường bắt buộc không được None."""
missing = [i for i in required_indices if record[i] is None]
if missing:
raise ValueError(f"Trường bắt buộc bị thiếu tại index: {missing}")
return True
# Record: (id, name, email, phone)
record = (1, 'John', None, '0909123456')
validate_required_fields(record, [1, 2]) # name, email bắt buộc
# ValueError: Trường bắt buộc bị thiếu tại index: [2]