Python cung cấp ba toán tử logic: and, or và not. Các toán tử này, còn gọi là toán tử Boolean, đánh giá nhiều điều kiện và xác định giá trị chân lý tổng thể của một biểu thức.
Trong lập trình, chúng ta thường cần đưa ra quyết định dựa trên nhiều điều kiện. Chẳng hạn, bạn có thể muốn chỉ thực thi một hành động nào đó nếu đồng thời thỏa mãn một số điều kiện. Hoặc bạn có thể muốn kích hoạt một hành động thay thế nếu bất kỳ một trong số các điều kiện được đáp ứng.
Python cung cấp một tập các toán tử logic – and, or, not – để xử lý những tình huống này.
Trong hướng dẫn này, chúng ta sẽ học cách các toán tử logic của Python hoạt động và cách sử dụng chúng trong lập trình và khoa học dữ liệu. Lưu ý rằng chúng tôi sẽ dùng các từ viết hoa AND, OR và NOT để biểu diễn các toán tử này về mặt khái niệm. Còn khi tham chiếu đến từ khóa Python, chúng tôi sẽ dùng quy ước: and, or và not.
Nếu bạn đang tìm một lộ trình học Python đã được tuyển chọn, hãy xem lộ trình kỹ năng sáu khóa Python Programming này.
Trước khi đi vào chi tiết, hãy bắt đầu với một câu trả lời thật ngắn gọn cho những bạn đang vội.
Câu trả lời ngắn: Toán tử logic trong Python là gì?
Toán tử logic của Python (and, or, not) là các từ khóa đặc biệt đóng vai trò liên từ trong mã, kết nối và đánh giá nhiều điều kiện trong một biểu thức duy nhất.
Xem ví dụ sau:
temperature =25
is_sunny = True
if temperature >20 and is_sunny:print("It's a perfect day for a picnic!")Được hỗ trợ bởi
Trong trường hợp này, chúng ta sẽ ra ngoài đi dạo nếu hoặc trời nắng hoặc chúng ta có ô.
Cuối cùng, toán tử not đảo ngược giá trị chân lý của một điều kiện:
if not is_sunny:print("Maybe we should stay indoors.")Được hỗ trợ bởi
Ở đây, thông điệp chỉ được in nếu không có nắng.
Các toán tử logic cho phép chúng ta diễn đạt ngắn gọn và mạnh mẽ các điều kiện phức tạp, giúp chương trình đưa ra quyết định dựa trên nhiều yếu tố. Bây giờ, hãy đi sâu hơn và bắt đầu với toán tử logic and.
Python: Toán tử and
Trong logic Boolean, phép AND liên quan đến việc so sánh hai giá trị hoặc biểu thức. Kết quả là đúng chỉ khi cả hai giá trị đều đúng. Nếu một trong hai hoặc cả hai giá trị là sai, kết quả của phép AND là sai. Sau đây là tóm tắt cách AND hoạt động:
Phép toán
Giá trị đầu ra
true AND true
true
true AND false
false
false AND true
false
false AND false
false
Chúng ta có thể tái tạo bảng chân trị này với toán tử and của Python:
options = True, False
for a inoptions:for b inoptions:print(f"{a} and {b} gives {a and b}")Được hỗ trợ bởi
True and True gives True
True and False gives False
False and True gives False
False and False gives False
Được hỗ trợ bởi
Biến options chứa hai giá trị Boolean. Vòng lặp for lồng nhau duyệt qua hai lần để tạo mọi hoán vị của True và False.
Thường thì các biểu thức dùng làm toán hạng cho and bao gồm các toán tử so sánh hoặc bằng nhau:
names ="James","Bob","David","Jane","Kate","Mary"for name innames:iflen(name)<5 and name[0]=="J":print(name)Được hỗ trợ bởi
Tên chỉ được in nếu có ít hơn năm chữ cái và bắt đầu bằng "J". Cần đáp ứng cả hai yêu cầu.
Các toán tử so sánh và bằng nhau, như < và ==, đánh giá thành True hoặc False.
Tuy nhiên, toán tử and của Python hoạt động trên mọi kiểu dữ liệu chứ không chỉ Boolean True và False. Giá trị đầu ra cũng có thể là bất kỳ kiểu dữ liệu nào.
Hãy khám phá chi tiết hơn về toán tử and của Python trong phần này. Trước hết, chúng ta sẽ bàn về tính đúng/sai (truthiness).
Python: truthy và falsy
Mọi đối tượng Python đều có thể được chuyển thành kiểu Boolean bằng hàm dựng sẵn bool(). Một đối tượng là truthy nếu bool(object) trả về True. Với đối tượng falsy, bool(object) trả về False.
Toán tử and của Python xét tính truthy của các toán hạng. Nếu cả hai toán hạng đều truthy, toán tử and cũng trả về một giá trị truthy. Nếu một hoặc cả hai toán hạng là falsy, and trả về một giá trị falsy. Hãy xem vài ví dụ:
if42and"python":print("Both operands are truthy")else:print("One or both operands are falsy")Được hỗ trợ bởi
Kiểu số, như số nguyên và số thực, là truthy nếu khác 0 và là falsy khi bằng 0. Các dãy, như chuỗi, là truthy khi không rỗng và falsy khi rỗng.
Do đó, chỉ ví dụ đầu tiên trong ba ví dụ trên thỏa điều kiện cả hai toán hạng đều truthy để toán tử and đánh giá thành truthy.
Toán tử and không phải lúc nào cũng trả về giá trị Boolean. Một biểu thức có and cũng có thể đánh giá thành một trong các toán hạng. Hãy đi sâu hơn với chính các ví dụ trước. Thay vì dùng biểu thức and trong câu lệnh if, ta sẽ đánh giá trực tiếp:
print(42 and "python")print(42 and "")print(0 and "python")Được hỗ trợ bởi
Bạn có nhận ra chuyện gì đang xảy ra với các biểu thức này không?
Hãy bắt đầu với ví dụ thứ ba, có 0 và "python" làm hai toán hạng. Toán tử and tìm hai toán hạng đều truthy. Vì toán hạng đầu là 0, nó là falsy. Chương trình không cần kiểm tra toán hạng thứ hai vì toàn bộ biểu thức sẽ là falsy bất kể giá trị của toán hạng thứ hai.
Tuy nhiên, toán tử and không trả về False. Thay vào đó, nó trả về trực tiếp toán hạng đầu. Vì toán hạng đầu là falsy, toàn bộ biểu thức and đánh giá thành falsy. Điều này không gây vấn đề trong Python, vì ở những nơi Python cần giá trị đúng/sai, nó có thể dùng tính truthy của đối tượng.
Trong ví dụ đầu, toán hạng đầu là 42, vốn truthy. Chương trình đánh giá toán hạng thứ hai và trả về nó. Vì toán hạng thứ hai là chuỗi "python", một giá trị truthy, toàn bộ biểu thức đánh giá là truthy.
Trong ví dụ thứ hai, toán hạng đầu cũng là 42. Vì nó truthy, chương trình đánh giá và trả về toán hạng thứ hai, là chuỗi rỗng. Chuỗi rỗng là falsy, vì vậy toàn bộ biểu thức and đánh giá là falsy.
Khi toán hạng đầu là truthy, toán tử and luôn trả về giá trị của toán hạng thứ hai, bất kể toán hạng thứ hai là truthy hay falsy.
Khi toán hạng đầu là falsy, Python không đánh giá toán hạng thứ hai. Điều này gọi là short-circuiting, một dạng đánh giá lười (lazy evaluation). Bạn có thể kiểm chứng với đoạn mã sau:
Toán hạng thứ hai là 5/0, bình thường sẽ phát sinh ZeroDivisionError. Tuy nhiên, biểu thức 5/0 không được đánh giá trong ví dụ này vì toán hạng đầu là falsy. Ngoại lệ không bao giờ được phát sinh.
Ví dụ: Cửa hàng trực tuyến dành cho lập trình viên
Hãy xét một ví dụ đơn giản phản ánh ứng dụng thực tế. Các giao dịch tại một cửa hàng trực tuyến cung cấp hàng hóa cho lập trình viên được ghi nhận và truy cập qua API. Dữ liệu được chuyển thành một danh sách các dictionary. Mỗi phần tử trong danh sách đại diện cho một giao dịch và mỗi giao dịch là một dictionary chứa thông tin liên quan:
data =[{"Item":"Python Book","Price":50,"Quantity":1,"Success": True},{"Item":"Coffee Machine","Price":125,"Quantity":1,"Success": False},{"Item":"Headphones","Price":250,"Quantity":1,"Success": True},{"Item":"Cables","Price":15.99,"Quantity":3,"Success": True},]Được hỗ trợ bởi
Mỗi giao dịch bao gồm tên và giá của mặt hàng, số lượng trong đơn và trạng thái giao dịch có thành công hay không.
Giả sử chúng ta cần các giao dịch thành công cho các mặt hàng có giá từ $100 trở lên. Ta có thể dùng toán tử and để lọc các dòng cần thiết:
for item indata:if item["Success"] and item["Price"]>=100:print(item)Được hỗ trợ bởi
Kết quả cho thấy giao dịch duy nhất đáp ứng cả hai yêu cầu. Với mỗi phần tử trong danh sách giao dịch, câu lệnh if kiểm tra tính truthy của hai biểu thức:
Các giá trị gắn với khóa "Success" trong mỗi dictionary là True hoặc False.
Toán tử lớn hơn hoặc bằng trong item["Price"] >= 100 cũng trả về True hoặc False.
Cuốn sách Python và dây cáp không đạt yêu cầu về giá vì dưới $100. Máy pha cà phê vượt ngưỡng giá, nhưng giao dịch không thành công nên bị loại khỏi kết quả in ra.
Chúng ta sẽ quay lại ví dụ cửa hàng trực tuyến này ở phần sau của hướng dẫn.
Trong phần tiếp theo, chúng ta sẽ tập trung vào toán tử or.
Python: Toán tử or
Toán tử logic OR trong logic Boolean cần hai toán hạng. Nó đánh giá là true nếu ít nhất một trong các toán hạng là true:
Phép toán
Giá trị đầu ra
true OR true
true
true OR false
true
false OR true
true
false OR false
false
Chúng ta có thể tái tạo bảng chân trị này bằng toán tử or của Python:
options = True, False
for a inoptions:for b inoptions:print(f"{a} or {b} gives {a or b}")Được hỗ trợ bởi
True or True gives True
True or False gives True
False or True gives True
False or False gives False
Được hỗ trợ bởi
Chúng ta cũng có thể xem lại ví dụ về tên người ở trên nhưng thay and bằng or:
names ="James","Bob","David","Jane","Kate","Mary"for name innames:iflen(name)<5 or name[0]=="J":print(name)Được hỗ trợ bởi
Câu lệnh if giờ chứa một biểu thức or. Vì vậy, vòng lặp for in ra tất cả các tên hoặc có ít hơn năm chữ cái hoặc bắt đầu bằng chữ cái "J". Chuỗi "Jane" đáp ứng cả hai yêu cầu. Các tên còn lại được in vì đáp ứng một trong hai yêu cầu.
Toán tử or trong Python: truthy và falsy
Toán tử or cũng xét các giá trị truthy và falsy chứ không chỉ các giá trị Boolean True và False. Hãy xem vài ví dụ:
if42 or [10,20,30]:print("At least one operand is truthy")else:print("None of the operands is truthy")Được hỗ trợ bởi
Trong ví dụ đầu, số nguyên 42 và danh sách không rỗng [10, 20, 30] đều là truthy. Vì toán tử or chỉ cần ít nhất một toán hạng truthy, toàn bộ biểu thức đánh giá là truthy.
Trong ví dụ thứ hai, 42 là truthy nhưng danh sách rỗng [] là falsy vì nó là một dãy rỗng. Chỉ cần một trong hai toán hạng là truthy, toàn bộ biểu thức or đánh giá là truthy.
Trong ví dụ cuối, cả 0 và [] đều là falsy. Do đó, toàn bộ biểu thức đánh giá là falsy.
Toán tử or cũng dùng short-circuit khi đánh giá biểu thức để tránh đánh giá không cần thiết. Hãy xem vài ví dụ minh họa:
print(42 or [10,20,30])print(42 or [])print([] or 42)print([] or 0)Được hỗ trợ bởi
Trong ví dụ đầu, toán hạng thứ nhất là 42, một giá trị truthy. Vì or chỉ cần một toán hạng truthy để quyết định tính chân lý cuối cùng của toàn biểu thức, toán hạng thứ nhất được trả về ngay. Toán hạng thứ hai không được đánh giá vì giá trị của nó không ảnh hưởng kết quả cuối. Toán tử or trả về toán hạng đầu, 42, chứ không phải Boolean True. Trong Python, mọi giá trị truthy có tác dụng tương đương Boolean True trong các tình huống như câu lệnh if và while.
Trong ví dụ thứ hai, toán hạng đầu cũng là 42, và biểu thức trả về số nguyên này dù toán hạng thứ hai là falsy.
Trong ví dụ thứ ba và thứ tư, toán hạng đầu là danh sách rỗng, vốn falsy. Vì vậy, toán hạng thứ hai được trả về trong cả hai trường hợp.
Ví dụ: Cửa hàng trực tuyến dành cho lập trình viên
Hãy quay lại các giao dịch từ cửa hàng trực tuyến bán hàng cho lập trình viên. Đây là bốn giao dịch mẫu dùng trong ví dụ:
data =[{"Item":"Python Book","Price":50,"Quantity":1,"Success": True},{"Item":"Coffee Machine","Price":125,"Quantity":1,"Success": False},{"Item":"Headphones","Price":250,"Quantity":1,"Success": True},{"Item":"Cables","Price":15.99,"Quantity":3,"Success": True},]Được hỗ trợ bởi
Bạn cần xác định một số giao dịch để nghiên cứu thêm hành vi khách hàng. Bạn muốn tìm các giao dịch hoặc thất bại hoặc bao gồm mặt hàng có giá dưới $75. Vì có hai điều kiện và bạn chỉ cần giao dịch đáp ứng ít nhất một trong hai, bạn có thể dùng toán tử or:
for item indata:if item["Success"]== False or item["Price"]<75:print(item)Được hỗ trợ bởi
{'Item':'Python Book','Price':50,'Quantity':1,'Success': True}{'Item':'Coffee Machine','Price':125,'Quantity':1,'Success': False}{'Item':'Cables','Price':15.99,'Quantity':3,'Success': True}Được hỗ trợ bởi
Vòng lặp for này hiển thị các dòng khớp ít nhất một yêu cầu. Cuốn sách Python và dây cáp được đưa vào vì giá dưới $75. Máy pha cà phê được đưa vào vì giao dịch không thành công.
Có một cách khác để lọc các giao dịch không thành công, chúng ta sẽ khám phá ở phần tiếp theo.
Python: Toán tử not
Toán tử NOT khác với AND và OR vì nó chỉ cần một toán hạng. NOT chuyển true thành false và ngược lại. Đây là bảng chân trị cho NOT:
Phép toán
Giá trị đầu ra
NOT true
false
NOT false
true
Chúng ta có thể tái hiện điều này bằng toán tử not của Python:
options = True, False
for a inoptions:print(f"not {a} evaluates to {not a}")Được hỗ trợ bởi
not True evaluates to False
not False evaluates to True
Được hỗ trợ bởi
Toán tử not trong Python: truthy và falsy
Giống như and và or, toán hạng dùng với not không nhất thiết phải là Boolean. Vì mọi đối tượng đều hoặc truthy hoặc falsy, bất kỳ đối tượng nào cũng có thể dùng với not.
if not "python":print("The `if` statement evaluated as `True`")else:print("The `if` statement evaluated as `False`")Được hỗ trợ bởi
Ví dụ: Cửa hàng trực tuyến dành cho lập trình viên
Ở các phần trước, chúng ta đã dùng các giao dịch từ một cửa hàng trực tuyến. Trong ví dụ này, chúng ta muốn hiển thị tất cả các giao dịch không thành công. Một cách là dùng toán tử bằng nhau == để kiểm tra liệu data["Success"] có bằng False hay không. Tuy nhiên, chúng ta cũng có thể dùng toán tử not:
data =[{"Item":"Python Book","Price":50,"Quantity":1,"Success": True},{"Item":"Coffee Machine","Price":125,"Quantity":1,"Success": False},{"Item":"Headphones","Price":250,"Quantity":1,"Success": True},{"Item":"Cables","Price":15.99,"Quantity":3,"Success": True},]for item indata:if not item["Success"]:print(item)Được hỗ trợ bởi
{'Item':'Coffee Machine','Price':125,'Quantity':1,'Success': False}Được hỗ trợ bởi
Vì item["Success"] bằng False với các giao dịch không thành công, not item["Success"] trả về True. Do đó, vòng lặp for in ra các giao dịch không thành công:
Trong phần tiếp theo, chúng ta sẽ học cách kết hợp nhiều toán tử logic trong một biểu thức.
Python: Thứ tự ưu tiên toán tử
Trong các ví dụ trước, mỗi lần chúng ta chỉ dùng một trong các toán tử logic. Ở phần này, chúng ta sẽ xem điều gì xảy ra khi kết hợp nhiều toán tử logic trong một biểu thức.
Python: and có ưu tiên cao hơn or
Chúng ta sẽ tiếp tục làm việc với các giao dịch từ cửa hàng trực tuyến đã dùng trước đó. Hãy thử câu điều kiện sau:
data =[{"Item":"Python Book","Price":50,"Quantity":1,"Success": True},{"Item":"Coffee Machine","Price":125,"Quantity":1,"Success": False},{"Item":"Headphones","Price":250,"Quantity":1,"Success": True},{"Item":"Cables","Price":15.99,"Quantity":3,"Success": True},]
for item indata:if item["Price"]>100 or item["Quantity"]>2 and item["Success"]:print(item)Được hỗ trợ bởi
{'Item':'Coffee Machine','Price':125,'Quantity':1,'Success': False}{'Item':'Headphones','Price':250,'Quantity':1,'Success': True}{'Item':'Cables','Price':15.99,'Quantity':3,'Success': True}Được hỗ trợ bởi
Câu lệnh if chứa hai toán tử logic. Trước khi xem Python xử lý biểu thức này như thế nào, hãy diễn đạt nó bằng tiếng Anh: Nếu giá mặt hàng trên $100 hoặc số lượng bán lớn hơn hai và giao dịch thành công thì in ra mặt hàng.
Câu này mơ hồ nếu không có thêm dấu câu và có thể vẫn gây nhầm lẫn dù thêm dấu phẩy. Ví dụ, giao dịch với máy pha cà phê có nên được tính không? Giá mặt hàng vượt ngưỡng yêu cầu nhưng giao dịch không thành công.
Python giải quyết sự mơ hồ này bằng cách cho toán tử and ưu tiên cao hơn toán tử or. Nghĩa là biểu thức and được đánh giá trước, và kết quả của nó được dùng trong biểu thức or.
Vì vậy, biểu thức item["Quantity"] > 2 and item["Success"] được đánh giá trước. Biểu thức này trả về một giá trị truthy chỉ với giao dịch có dây cáp. Nó đánh giá là falsy đối với các mặt hàng còn lại.
Giá trị từ biểu thức and sau đó được dùng với toán tử or. Biểu thức or trả về giá trị truthy cho bất kỳ mặt hàng nào có giá trị truthy từ biểu thức and—chỉ có giao dịch dây cáp—và cho các mặt hàng có giá trên $100. Có hai mặt hàng vượt ngưỡng giá: máy pha cà phê và tai nghe.
Python: dấu ngoặc và toán tử logic
Tuy nhiên, nếu chúng ta cần các giao dịch có mặt hàng giá trên $100 hoặc có số lượng trên hai, nhưng cũng muốn đảm bảo giao dịch thành công thì sao? Trong trường hợp này, chúng ta muốn biểu thức or có ưu tiên cao hơn and để được đánh giá trước. Ta có thể đạt được điều này bằng cách đặt dấu ngoặc quanh biểu thức or:
for item indata:if(item["Price"]>100 or item["Quantity"]>2) and item["Success"]:print(item)Được hỗ trợ bởi
{'Item':'Headphones','Price':250,'Quantity':1,'Success': True}{'Item':'Cables','Price':15.99,'Quantity':3,'Success': True}Được hỗ trợ bởi
Dấu ngoặc bổ sung trao quyền ưu tiên cho biểu thức or. Giao dịch máy pha cà phê không còn được đưa vào vì nó đánh giá falsy đối với toán hạng thứ hai của and.
Python: not có ưu tiên cao hơn and và or
Toán tử not có ưu tiên cao hơn and và or. Vì vậy, not được đánh giá trước hai toán tử logic còn lại.
Hãy xét câu lệnh if sau, bao gồm cả not và and:
for item indata:if not item["Success"] and item["Price"]>100:print(item)Được hỗ trợ bởi
{'Item':'Coffee Machine','Price':125,'Quantity':1,'Success': False}Được hỗ trợ bởi
Vì not được đánh giá trước, biểu thức này sẽ áp dụng toán tử not lên item["Success"] trước. Giá trị từ biểu thức not sau đó được dùng làm toán hạng thứ nhất trong biểu thức and. Chỉ mục máy pha cà phê thỏa điều kiện này—đây là giao dịch duy nhất thất bại và có giá trên $100.
Tuy nhiên, chúng ta có thể trao ưu tiên cho toán tử and bằng cách dùng dấu ngoặc:
for item indata:ifnot(item["Success"] and item["Price"]>100):print(item)Được hỗ trợ bởi
{'Item':'Python Book','Price':50,'Quantity':1,'Success': True}{'Item':'Coffee Machine','Price':125,'Quantity':1,'Success': False}{'Item':'Cables','Price':15.99,'Quantity':3,'Success': True}Được hỗ trợ bởi
Trong trường hợp này, biểu thức and được đánh giá trước. Chỉ mục có tai nghe đánh giá thành True vì đó là giao dịch thành công duy nhất với giá trên $100. Tuy nhiên, chúng ta thêm một toán tử not trước biểu thức trong ngoặc. Do đó, mã in ra ba giao dịch còn lại.
Nói chung, nếu một biểu thức trở nên quá phức tạp vì có quá nhiều toán tử, tốt nhất là tách ra để dễ đọc hơn.
Kết luận
Các toán tử logic and, or và not của Python được dùng rộng rãi trong nhiều ứng dụng lập trình và khoa học dữ liệu. Chúng mô phỏng hành vi của các toán tử logic Boolean AND, OR và NOT thường dùng trong logic và toán học.
Tuy nhiên, các toán tử Python có thể nhận bất kỳ đối tượng nào chứ không chỉ giá trị Boolean. Toán tử and và or dùng đánh giá ngắn mạch (short-circuit) và trả về một trong các toán hạng làm đầu ra.
Các toán tử logic của Python là công cụ then chốt để lọc dữ liệu, nhận diện đặc trưng trong tập dữ liệu và tạo các quy tắc phức tạp để điều khiển luồng chương trình. Nếu bạn muốn tìm hiểu thêm, hãy xem lộ trình nghề nghiệp chín khóa Data Analyst With Python.
Tôi học Vật lý và Toán ở bậc đại học tại Đại học Malta. Sau đó, tôi chuyển đến London và lấy bằng Tiến sĩ Vật lý tại Imperial College. Tôi nghiên cứu các kỹ thuật quang học mới để chụp ảnh võng mạc người. Hiện nay, tôi tập trung vào việc viết về Python, truyền đạt về Python và giảng dạy Python.
Câu hỏi thường gặp về toán tử logic trong Python
Tôi có thể dùng toán tử and để kiểm tra nhiều điều kiện cùng lúc không?⌄
Có, bạn có thể xâu chuỗi nhiều điều kiện cùng lúc bằng toán tử and. Ví dụ: if x > 5 and x < 10 and x != 7.
Sự khác nhau giữa toán tử and và toán tử AND theo bit (&) là gì?⌄
Toán tử and thực hiện phép AND logic trên các giá trị Boolean, trả về True chỉ khi cả hai toán hạng đều True. Toán tử AND theo bit (&) thực hiện phép AND theo bit trên biểu diễn nhị phân của các giá trị số nguyên.
Python có các toán tử && và || như một số ngôn ngữ khác không?⌄
Không, Python dùng từ khóa and và or thay vì ký hiệu && và || cho các phép logic.
Khám phá những kiến thức cơ bản về Trí tuệ Nhân tạo (AI), học cách ứng dụng AI một cách hiệu quả trong công việc, và tìm hiểu sâu về các mô hình như ChatGPT để nắm bắt xu hướng phát triển của lĩnh vực AI.
Trong lập trình, chúng ta thường cần đưa ra quyết định dựa trên nhiều điều kiện. Chẳng hạn, bạn có thể muốn chỉ thực thi một hành động nào đó nếu đồng thời thỏa mãn một số điều kiện. Hoặc bạn có thể muốn kích hoạt một hành động thay thế nếu bất kỳ một trong số các điều kiện được đáp ứng.
Python cung cấp một tập các toán tử logic –
and,or,not– để xử lý những tình huống này.Trong hướng dẫn này, chúng ta sẽ học cách các toán tử logic của Python hoạt động và cách sử dụng chúng trong lập trình và khoa học dữ liệu. Lưu ý rằng chúng tôi sẽ dùng các từ viết hoa AND, OR và NOT để biểu diễn các toán tử này về mặt khái niệm. Còn khi tham chiếu đến từ khóa Python, chúng tôi sẽ dùng quy ước:
and,orvànot.Nếu bạn đang tìm một lộ trình học Python đã được tuyển chọn, hãy xem lộ trình kỹ năng sáu khóa Python Programming này.
Trước khi đi vào chi tiết, hãy bắt đầu với một câu trả lời thật ngắn gọn cho những bạn đang vội.
Câu trả lời ngắn: Toán tử logic trong Python là gì?
Toán tử logic của Python (
and,or,not) là các từ khóa đặc biệt đóng vai trò liên từ trong mã, kết nối và đánh giá nhiều điều kiện trong một biểu thức duy nhất.Xem ví dụ sau:
Ở đây, toán tử and đảm bảo rằng thông điệp chỉ được in nếu
cả haiđiều kiện đều thỏa mãn: nhiệt độ trên 20 độvàtrời nắng.Hãy xem một ví dụ khác dùng toán tử
or:Trong trường hợp này, chúng ta sẽ ra ngoài đi dạo nếu hoặc trời nắng hoặc chúng ta có ô.
Cuối cùng, toán tử
notđảo ngược giá trị chân lý của một điều kiện:Ở đây, thông điệp chỉ được in nếu không có nắng.
Các toán tử logic cho phép chúng ta diễn đạt ngắn gọn và mạnh mẽ các điều kiện phức tạp, giúp chương trình đưa ra quyết định dựa trên nhiều yếu tố. Bây giờ, hãy đi sâu hơn và bắt đầu với toán tử logic
and.Python: Toán tử
andTrong logic Boolean, phép AND liên quan đến việc so sánh hai giá trị hoặc biểu thức. Kết quả là đúng chỉ khi cả hai giá trị đều đúng. Nếu một trong hai hoặc cả hai giá trị là sai, kết quả của phép AND là sai. Sau đây là tóm tắt cách AND hoạt động:
Phép toán
Giá trị đầu ra
true AND true
true
true AND false
false
false AND true
false
false AND false
false
Chúng ta có thể tái tạo bảng chân trị này với toán tử
andcủa Python:Biến
optionschứa hai giá trị Boolean. Vòng lặpforlồng nhau duyệt qua hai lần để tạo mọi hoán vị củaTruevàFalse.Thường thì các biểu thức dùng làm toán hạng cho and bao gồm các toán tử so sánh hoặc bằng nhau:
Tên chỉ được in nếu có ít hơn năm chữ cái và bắt đầu bằng
"J". Cần đáp ứng cả hai yêu cầu.Các toán tử so sánh và bằng nhau, như
<và==, đánh giá thànhTruehoặcFalse.Tuy nhiên, toán tử
andcủa Python hoạt động trên mọi kiểu dữ liệu chứ không chỉ BooleanTruevàFalse. Giá trị đầu ra cũng có thể là bất kỳ kiểu dữ liệu nào.Hãy khám phá chi tiết hơn về toán tử
andcủa Python trong phần này. Trước hết, chúng ta sẽ bàn về tính đúng/sai (truthiness).Python: truthy và falsy
Mọi đối tượng Python đều có thể được chuyển thành kiểu Boolean bằng hàm dựng sẵn
bool(). Một đối tượng là truthy nếubool(object)trả vềTrue. Với đối tượng falsy,bool(object)trả vềFalse.Toán tử
andcủa Python xét tính truthy của các toán hạng. Nếu cả hai toán hạng đều truthy, toán tửandcũng trả về một giá trị truthy. Nếu một hoặc cả hai toán hạng là falsy,andtrả về một giá trị falsy. Hãy xem vài ví dụ:Bây giờ, hãy xét ví dụ này:
Và hãy xem ví dụ cuối cùng này:
Kiểu số, như số nguyên và số thực, là truthy nếu khác 0 và là falsy khi bằng 0. Các dãy, như chuỗi, là truthy khi không rỗng và falsy khi rỗng.
Do đó, chỉ ví dụ đầu tiên trong ba ví dụ trên thỏa điều kiện cả hai toán hạng đều truthy để toán tử
andđánh giá thành truthy.Toán tử
andkhông phải lúc nào cũng trả về giá trị Boolean. Một biểu thức cóandcũng có thể đánh giá thành một trong các toán hạng. Hãy đi sâu hơn với chính các ví dụ trước. Thay vì dùng biểu thứcandtrong câu lệnhif, ta sẽ đánh giá trực tiếp:Bạn có nhận ra chuyện gì đang xảy ra với các biểu thức này không?
Hãy bắt đầu với ví dụ thứ ba, có
0và"python"làm hai toán hạng. Toán tửandtìm hai toán hạng đều truthy. Vì toán hạng đầu là0, nó là falsy. Chương trình không cần kiểm tra toán hạng thứ hai vì toàn bộ biểu thức sẽ là falsy bất kể giá trị của toán hạng thứ hai.Tuy nhiên, toán tử
andkhông trả vềFalse. Thay vào đó, nó trả về trực tiếp toán hạng đầu. Vì toán hạng đầu là falsy, toàn bộ biểu thứcandđánh giá thành falsy. Điều này không gây vấn đề trong Python, vì ở những nơi Python cần giá trị đúng/sai, nó có thể dùng tính truthy của đối tượng.Trong ví dụ đầu, toán hạng đầu là
42, vốn truthy. Chương trình đánh giá toán hạng thứ hai và trả về nó. Vì toán hạng thứ hai là chuỗi"python", một giá trị truthy, toàn bộ biểu thức đánh giá là truthy.Trong ví dụ thứ hai, toán hạng đầu cũng là
42. Vì nó truthy, chương trình đánh giá và trả về toán hạng thứ hai, là chuỗi rỗng. Chuỗi rỗng là falsy, vì vậy toàn bộ biểu thứcandđánh giá là falsy.Khi toán hạng đầu là truthy, toán tử
andluôn trả về giá trị của toán hạng thứ hai, bất kể toán hạng thứ hai là truthy hay falsy.Khi toán hạng đầu là falsy, Python không đánh giá toán hạng thứ hai. Điều này gọi là short-circuiting, một dạng đánh giá lười (lazy evaluation). Bạn có thể kiểm chứng với đoạn mã sau:
Toán hạng thứ hai là
5/0, bình thường sẽ phát sinhZeroDivisionError. Tuy nhiên, biểu thức5/0không được đánh giá trong ví dụ này vì toán hạng đầu là falsy. Ngoại lệ không bao giờ được phát sinh.Ví dụ: Cửa hàng trực tuyến dành cho lập trình viên
Hãy xét một ví dụ đơn giản phản ánh ứng dụng thực tế. Các giao dịch tại một cửa hàng trực tuyến cung cấp hàng hóa cho lập trình viên được ghi nhận và truy cập qua API. Dữ liệu được chuyển thành một danh sách các dictionary. Mỗi phần tử trong danh sách đại diện cho một giao dịch và mỗi giao dịch là một dictionary chứa thông tin liên quan:
Mỗi giao dịch bao gồm tên và giá của mặt hàng, số lượng trong đơn và trạng thái giao dịch có thành công hay không.
Giả sử chúng ta cần các giao dịch thành công cho các mặt hàng có giá từ $100 trở lên. Ta có thể dùng toán tử
andđể lọc các dòng cần thiết:Kết quả cho thấy giao dịch duy nhất đáp ứng cả hai yêu cầu. Với mỗi phần tử trong danh sách giao dịch, câu lệnh
ifkiểm tra tính truthy của hai biểu thức:"Success"trong mỗi dictionary làTruehoặcFalse.item["Price"] >= 100cũng trả vềTruehoặcFalse.Cuốn sách Python và dây cáp không đạt yêu cầu về giá vì dưới $100. Máy pha cà phê vượt ngưỡng giá, nhưng giao dịch không thành công nên bị loại khỏi kết quả in ra.
Chúng ta sẽ quay lại ví dụ cửa hàng trực tuyến này ở phần sau của hướng dẫn.
Trong phần tiếp theo, chúng ta sẽ tập trung vào toán tử
or.Python: Toán tử
orToán tử logic OR trong logic Boolean cần hai toán hạng. Nó đánh giá là true nếu ít nhất một trong các toán hạng là true:
Phép toán
Giá trị đầu ra
true OR true
true
true OR false
true
false OR true
true
false OR false
false
Chúng ta có thể tái tạo bảng chân trị này bằng toán tử
orcủa Python:Chúng ta cũng có thể xem lại ví dụ về tên người ở trên nhưng thay
andbằngor:Câu lệnh
ifgiờ chứa một biểu thứcor. Vì vậy, vòng lặpforin ra tất cả các tên hoặc có ít hơn năm chữ cái hoặc bắt đầu bằng chữ cái"J". Chuỗi"Jane"đáp ứng cả hai yêu cầu. Các tên còn lại được in vì đáp ứng một trong hai yêu cầu.Toán tử
ortrong Python: truthy và falsyToán tử or cũng xét các giá trị truthy và falsy chứ không chỉ các giá trị Boolean
TruevàFalse. Hãy xem vài ví dụ:Giờ hãy xét ví dụ này:
Và hãy xét ví dụ cuối cùng này:
Trong ví dụ đầu, số nguyên
42và danh sách không rỗng[10, 20, 30]đều là truthy. Vì toán tửorchỉ cần ít nhất một toán hạng truthy, toàn bộ biểu thức đánh giá là truthy.Trong ví dụ thứ hai,
42là truthy nhưng danh sách rỗng[]là falsy vì nó là một dãy rỗng. Chỉ cần một trong hai toán hạng là truthy, toàn bộ biểu thức or đánh giá là truthy.Trong ví dụ cuối, cả
0và[]đều là falsy. Do đó, toàn bộ biểu thức đánh giá là falsy.Toán tử
orcũng dùng short-circuit khi đánh giá biểu thức để tránh đánh giá không cần thiết. Hãy xem vài ví dụ minh họa:Trong ví dụ đầu, toán hạng thứ nhất là
42, một giá trị truthy. Vìorchỉ cần một toán hạng truthy để quyết định tính chân lý cuối cùng của toàn biểu thức, toán hạng thứ nhất được trả về ngay. Toán hạng thứ hai không được đánh giá vì giá trị của nó không ảnh hưởng kết quả cuối. Toán tử or trả về toán hạng đầu,42, chứ không phải BooleanTrue. Trong Python, mọi giá trị truthy có tác dụng tương đương BooleanTruetrong các tình huống như câu lệnhifvàwhile.Trong ví dụ thứ hai, toán hạng đầu cũng là
42, và biểu thức trả về số nguyên này dù toán hạng thứ hai là falsy.Trong ví dụ thứ ba và thứ tư, toán hạng đầu là danh sách rỗng, vốn falsy. Vì vậy, toán hạng thứ hai được trả về trong cả hai trường hợp.
Ví dụ: Cửa hàng trực tuyến dành cho lập trình viên
Hãy quay lại các giao dịch từ cửa hàng trực tuyến bán hàng cho lập trình viên. Đây là bốn giao dịch mẫu dùng trong ví dụ:
Bạn cần xác định một số giao dịch để nghiên cứu thêm hành vi khách hàng. Bạn muốn tìm các giao dịch hoặc thất bại hoặc bao gồm mặt hàng có giá dưới $75. Vì có hai điều kiện và bạn chỉ cần giao dịch đáp ứng ít nhất một trong hai, bạn có thể dùng toán tử
or:Vòng lặp
fornày hiển thị các dòng khớp ít nhất một yêu cầu. Cuốn sách Python và dây cáp được đưa vào vì giá dưới $75. Máy pha cà phê được đưa vào vì giao dịch không thành công.Có một cách khác để lọc các giao dịch không thành công, chúng ta sẽ khám phá ở phần tiếp theo.
Python: Toán tử
notToán tử NOT khác với AND và OR vì nó chỉ cần một toán hạng. NOT chuyển true thành false và ngược lại. Đây là bảng chân trị cho NOT:
Phép toán
Giá trị đầu ra
NOT true
false
NOT false
true
Chúng ta có thể tái hiện điều này bằng toán tử
notcủa Python:Toán tử
nottrong Python: truthy và falsyGiống như
andvàor, toán hạng dùng vớinotkhông nhất thiết phải là Boolean. Vì mọi đối tượng đều hoặc truthy hoặc falsy, bất kỳ đối tượng nào cũng có thể dùng vớinot.Hãy xem thêm ví dụ này:
Các giá trị truthy được chuyển thành
Falsevới toán tửnotvà các giá trị falsy được chuyển thànhTrue.Không giống
andvàor, toán tửnotluôn trả về một đối tượng Boolean:Ví dụ: Cửa hàng trực tuyến dành cho lập trình viên
Ở các phần trước, chúng ta đã dùng các giao dịch từ một cửa hàng trực tuyến. Trong ví dụ này, chúng ta muốn hiển thị tất cả các giao dịch không thành công. Một cách là dùng toán tử bằng nhau
==để kiểm tra liệudata["Success"]có bằngFalsehay không. Tuy nhiên, chúng ta cũng có thể dùng toán tửnot:Vì
item["Success"]bằngFalsevới các giao dịch không thành công, notitem["Success"]trả vềTrue. Do đó, vòng lặp for in ra các giao dịch không thành công:Trong phần tiếp theo, chúng ta sẽ học cách kết hợp nhiều toán tử logic trong một biểu thức.
Python: Thứ tự ưu tiên toán tử
Trong các ví dụ trước, mỗi lần chúng ta chỉ dùng một trong các toán tử logic. Ở phần này, chúng ta sẽ xem điều gì xảy ra khi kết hợp nhiều toán tử logic trong một biểu thức.
Python:
andcó ưu tiên cao hơnorChúng ta sẽ tiếp tục làm việc với các giao dịch từ cửa hàng trực tuyến đã dùng trước đó. Hãy thử câu điều kiện sau:
Câu lệnh
ifchứa hai toán tử logic. Trước khi xem Python xử lý biểu thức này như thế nào, hãy diễn đạt nó bằng tiếng Anh: Nếu giá mặt hàng trên $100 hoặc số lượng bán lớn hơn hai và giao dịch thành công thì in ra mặt hàng.Câu này mơ hồ nếu không có thêm dấu câu và có thể vẫn gây nhầm lẫn dù thêm dấu phẩy. Ví dụ, giao dịch với máy pha cà phê có nên được tính không? Giá mặt hàng vượt ngưỡng yêu cầu nhưng giao dịch không thành công.
Python giải quyết sự mơ hồ này bằng cách cho toán tử
andưu tiên cao hơn toán tửor. Nghĩa là biểu thứcandđược đánh giá trước, và kết quả của nó được dùng trong biểu thứcor.Vì vậy, biểu thức
item["Quantity"] > 2 and item["Success"]được đánh giá trước. Biểu thức này trả về một giá trị truthy chỉ với giao dịch có dây cáp. Nó đánh giá là falsy đối với các mặt hàng còn lại.Giá trị từ biểu thức and sau đó được dùng với toán tử
or. Biểu thứcortrả về giá trị truthy cho bất kỳ mặt hàng nào có giá trị truthy từ biểu thứcand—chỉ có giao dịch dây cáp—và cho các mặt hàng có giá trên $100. Có hai mặt hàng vượt ngưỡng giá: máy pha cà phê và tai nghe.Python: dấu ngoặc và toán tử logic
Tuy nhiên, nếu chúng ta cần các giao dịch có mặt hàng giá trên $100 hoặc có số lượng trên hai, nhưng cũng muốn đảm bảo giao dịch thành công thì sao? Trong trường hợp này, chúng ta muốn biểu thức
orcó ưu tiên cao hơnandđể được đánh giá trước. Ta có thể đạt được điều này bằng cách đặt dấu ngoặc quanh biểu thứcor:Dấu ngoặc bổ sung trao quyền ưu tiên cho biểu thức
or. Giao dịch máy pha cà phê không còn được đưa vào vì nó đánh giá falsy đối với toán hạng thứ hai củaand.Python:
notcó ưu tiên cao hơnandvàorToán tử
notcó ưu tiên cao hơnandvàor. Vì vậy,notđược đánh giá trước hai toán tử logic còn lại.Hãy xét câu lệnh if sau, bao gồm cả
notvàand:Vì
notđược đánh giá trước, biểu thức này sẽ áp dụng toán tử not lênitem["Success"]trước. Giá trị từ biểu thứcnotsau đó được dùng làm toán hạng thứ nhất trong biểu thức and. Chỉ mục máy pha cà phê thỏa điều kiện này—đây là giao dịch duy nhất thất bại và có giá trên $100.Tuy nhiên, chúng ta có thể trao ưu tiên cho toán tử
andbằng cách dùng dấu ngoặc:Trong trường hợp này, biểu thức
andđược đánh giá trước. Chỉ mục có tai nghe đánh giá thànhTruevì đó là giao dịch thành công duy nhất với giá trên $100. Tuy nhiên, chúng ta thêm một toán tửnottrước biểu thức trong ngoặc. Do đó, mã in ra ba giao dịch còn lại.Nói chung, nếu một biểu thức trở nên quá phức tạp vì có quá nhiều toán tử, tốt nhất là tách ra để dễ đọc hơn.
Kết luận
Các toán tử logic
and,orvànotcủa Python được dùng rộng rãi trong nhiều ứng dụng lập trình và khoa học dữ liệu. Chúng mô phỏng hành vi của các toán tử logic Boolean AND, OR và NOT thường dùng trong logic và toán học.Tuy nhiên, các toán tử Python có thể nhận bất kỳ đối tượng nào chứ không chỉ giá trị Boolean. Toán tử
andvàordùng đánh giá ngắn mạch (short-circuit) và trả về một trong các toán hạng làm đầu ra.Các toán tử logic của Python là công cụ then chốt để lọc dữ liệu, nhận diện đặc trưng trong tập dữ liệu và tạo các quy tắc phức tạp để điều khiển luồng chương trình. Nếu bạn muốn tìm hiểu thêm, hãy xem lộ trình nghề nghiệp chín khóa Data Analyst With Python.