Menu
CoddyTech

Toán tử logic, phần 4

Thuộc phần Nền tảng cơ bản trong hành trình Python của Coddy. Bài học 19 trên 77.

Khi làm việc với các biểu thức logic, đôi khi chúng ta cần đơn giản hóa hoặc sắp xếp lại chúng. Điều này đặc biệt hữu ích khi xử lý các điều kiện phức tạp kết hợp nhiều toán tử and và or.

Các định luật De Morgan đưa ra quy tắc để biến đổi biểu thức logic. Những phép biến đổi này giúp code dễ đọc và dễ hiểu hơn.

Định luật thứ nhất: not (A and B) tương đương với (not A) or (not B)

Hãy chú ý hai điều xảy ra khi bạn phân phối not vào biểu thức: mỗi toán hạng đều bị phủ định (A trở thành not A, B trở thành not B), và toán tử bị đảo ngược: and trở thành or. not không chỉ phủ định các giá trị mà còn đổi toán tử kết nối chúng.

Ví dụ:

# Kiểm tra xem một số có KHÔNG nằm trong khoảng từ 1 đến 10 hay không
number = 15
# Hai biểu thức (expression) này tương đương:
result1 = not (number >= 1 and number <= 10)
result2 = (not number >= 1) or (not number <= 10)
print(result1)  # True
print(result2)  # True

Định luật thứ hai: not (A or B) tương đương với (not A) and (not B)

Quy tắc hai bước tương tự cũng áp dụng ở đây: mỗi toán hạng đều bị phủ định, và toán tử đổi chiều. Lần này, or trở thành and. Hãy hiểu như sau: khi phân phối not, toán tử and luôn đổi thành or và ngược lại, đồng thời phủ định từng phần.

Ví dụ:

# Kiểm tra xem một người có KHÔNG (phải là học sinh hoặc có việc làm) hay không
is_student = False
is_employed = False
# Hai biểu thức này tương đương nhau:
result1 = not (is_student or is_employed)
result2 = (not is_student) and (not is_employed)
print(result1)  # True
print(result2)  # True

Ví dụ phức tạp với cả AND và OR: Đôi khi bạn cần điều kiện kết hợp cả hai toán tử. Đây là một ví dụ thực tế:

# Kiểm tra xem chúng ta có KHÔNG THỂ chấp nhận hồ sơ xin việc hay không
# Từ chối nếu: (không có kinh nghiệm AND không có bằng cấp) OR không đáp ứng yêu cầu về độ tuổi
has_experience = False
has_degree = False
meets_age = True
# Điều kiện phức tạp dùng cả AND và OR
reject_application = (not has_experience and not has_degree) or not meets_age
print(reject_application)  # True (bị từ chối vì không có kinh nghiệm AND không có bằng cấp)
# Bạn cũng có thể viết cách này bằng định luật De Morgan:
# accept = (experience OR degree) AND meets age; reject = not accept
accept_application = (has_experience or has_degree) and meets_age
reject_application2 = not accept_application
print(reject_application2)  # True (cùng kết quả, cách xử lý khác)

Khi nào nên dùng các định luật De Morgan:

  • Để điều kiện phủ định dễ đọc hơn
  • Để đơn giản hóa các biểu thức logic phức tạp
  • Để chuyển đổi giữa các cách biểu diễn khác nhau của cùng một logic
challenge icon

Thử thách

Người mới

Bạn đang giúp một cửa hàng thú cưng tạo hệ thống để xác định xem cửa hàng có thể bán thú cưng cho khách hàng hay không.

Các biến sau đã được thiết lập sẵn cho bạn:

  • has_license có giá trị True
  • has_space có giá trị True
  • has_experience có giá trị False

Viết các biểu thức logic để xác định xem:

  • can_sell_regular_pet: Khách hàng có thể mua thú cưng thông thường nếu họ có giấy phép HOẶC có kinh nghiệm, VÀ họ phải có đủ chỗ
  • can_sell_exotic_pet: Khách hàng có thể mua thú cưng ngoại lai nếu họ có CẢ giấy phép VÀ kinh nghiệm, VÀ họ phải có đủ chỗ
  • cannot_sell_any_pet: Cửa hàng KHÔNG THỂ bán bất kỳ thú cưng nào nếu khách hàng KHÔNG có giấy phép VÀ KHÔNG có kinh nghiệm, HOẶC họ KHÔNG có đủ chỗ

Tự làm thử

# Tính các điều kiện
# Thay từng giá trị giữ chỗ bên dưới bằng biểu thức logic phù hợp
can_sell_regular_pet = False
can_sell_exotic_pet = False
cannot_sell_any_pet = False

# Đừng xóa các dòng bên dưới
print("Can sell regular pet:", can_sell_regular_pet)
print("Can sell exotic pet:", can_sell_exotic_pet)
print("Cannot sell any pet:", cannot_sell_any_pet)
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Nền tảng cơ bản

Tự luyện tập: Trình biên dịch Python online