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

Kiểm tra tuple toàn giá trị None trong Python

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 None so 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]