Mục lục bài viết:
- Kiểu Boolean Python
- Python Booleans làm Từ khóa
- Python Booleans dưới dạng số
- Toán tử Boolean
- Các nhà khai thác không có đầu vào
- Toán tử không phải Boolean
- Toán tử và Boolean
- Toán tử hoặc Boolean
- Các toán tử Boolean khác
- Toán tử so sánh
- Bình đẳng và Bất bình đẳng
- So sánh đơn hàng
- Nhà điều hành là
- Nhà điều hành trong
- Các toán tử so sánh chuỗi
- Thử nghiệm Boolean trong Python
- Không có giá trị Boolean
- Các số dưới dạng giá trị Boolean
- Chuỗi dưới dạng giá trị Boolean
- Các loại khác dưới dạng giá trị Boolean
- Ví dụ: Mảng NumPy
- Toán tử và Chức năng
- Phần kết luận
Kiểu Boolean trong Python là một trong những kiểu dữ liệu tích hợp sẵn của Python . Nó được sử dụng để biểu thị giá trị chân lý của một biểu thức. Ví dụ, biểu thức 1 >>
>>> type[False]
>>> type[True]
Của type[]
cả hai False
và True
là bool
.
Kiểu bool
được tích hợp sẵn , có nghĩa là nó
luôn có sẵn bằng Python và không cần nhập. Tuy nhiên, bản thân tên không phải là một từ khóa trong ngôn ngữ. Mặc dù kiểu sau được coi là kiểu xấu, nhưng có thể gán cho tên bool
:
>>>
>>> bool
>>> bool = "this is not a type"
>>> bool
'this is not a type'
Mặc dù có thể về mặt kỹ thuật, nhưng để tránh nhầm lẫn, bạn không nên gán một giá trị khác cho bool
.
Python Booleans làm Từ khóa
Tên dựng sẵn không phải là từ khóa. Đối với ngôn ngữ Python, chúng là các biến thông thường . Nếu bạn gán cho chúng, thì bạn sẽ ghi đè giá trị tích hợp sẵn.
Ngược lại, các tên True
và không phảiFalse
là cài sẵn. Chúng là từ khóa . Không giống như nhiều từ khóa Python khác , và là các biểu thức Python . Vì chúng là
biểu thức, chúng có thể được sử dụng ở bất kỳ nơi nào có thể sử dụng các biểu thức khác, chẳng hạn như ,.True
False
1 + 1
Có thể gán giá trị Boolean cho các biến, nhưng không thể gán giá trị cho True
:
>>>
>>> a_true_alias = True
>>> a_true_alias
True
>>> True = 5
File "", line 1
SyntaxError: cannot assign to True
Vì True
là từ khóa nên bạn không thể gán giá trị cho nó. Quy tắc tương tự áp dụng cho False
:
>>>
>>> False = 5
File "", line 1
SyntaxError: cannot assign to False
You can’t assign to False
because
it’s a keyword in Python. In this way, True
and False
behave like other numeric constants. For example, you can pass 1.5
to functions or assign it to variables. However, it’s impossible to assign a value to 1.5
. The statement 1.5 = 5
is not valid Python. Both 1.5 = 5
and False = 5
are invalid Python code and will raise a SyntaxError
when parsed.
Python Booleans as Numbers
Booleans are considered a numeric type in Python. This means they’re numbers for all intents and purposes. In other words, you can apply arithmetic operations to Booleans, and you can also compare them to numbers:
>>>
>>> True == 1
True
>>> False == 0
True
>>> True + [False / True]
1.0
There aren’t many uses for the numerical nature of Boolean values, but there’s one technique you may find helpful. Because True
is equal to 1
and False
is equal to 0
, adding Booleans together is a quick way to count the number of True
values. This can come in handy when you need to count the number of items that satisfy a condition.
For example, if you want to analyze a verse in a classic children’s poem to see what fraction of lines contain the word "the"
, then the fact that True
is equal to 1
and False
is equal to 0
can come in quite handy:
>>>
>>> lines="""\
... He took his vorpal sword in hand;
... Long time the manxome foe he sought—
... So rested he by the Tumtum tree
... And stood awhile in thought.
... """.splitlines[]
>>> sum["the" in line.lower[] for line in lines] / len[lines]
0.5
Tính tổng tất cả các giá trị trong một biểu thức trình tạo như thế này cho phép bạn biết số lần True
xuất hiện trong trình tạo. Số lần True
trong bộ tạo bằng số dòng có chứa từ "the"
, không phân biệt chữ hoa chữ thường. Chia số này cho tổng số dòng sẽ cho bạn tỷ lệ giữa các dòng phù hợp với tổng số dòng.
Để xem tại sao điều này hoạt động, bạn có thể chia đoạn mã trên thành các phần nhỏ hơn:
>>>
>>> lines = """\
... He took his vorpal sword in hand;
... Long time the manxome foe he sought—
... So rested he by the Tumtum tree
... And stood awhile in thought.
... """
>>> line_list = lines.splitlines[]
>>> "the" in line_list[0]
False
>>> "the" in line_list[1]
True
>>> 0 + False + True # Equivalent to 0 + 0 + 1
1
>>> ["the" in line for line in line_list]
[False, True, True, False]
>>> False + True + True + False
2
>>> len[line_list]
4
>>> 2/4
0.5
Các line_list
biến giữ một danh sách các dòng. Dòng đầu tiên không có tiếng nói "the"
trong nó, vì vậy "the" in line_list[0]
là False
. Trong dòng thứ hai, "the"
không xuất hiện, vì vậy "the" in line_list[1]
là True
. Vì Boolean là số, bạn có thể thêm chúng vào số và 0 + False + True
cho 1
.
Vì ["the" in line for line in line_list]
là danh sách bốn Boolean, bạn có thể thêm chúng lại với nhau. Khi bạn thêm False + True + True + False
,
bạn nhận được 2
. Bây giờ, nếu bạn chia kết quả đó 4
cho độ dài của danh sách, bạn sẽ có được 0.5
. Từ "the"
xuất hiện trong một nửa số dòng trong vùng chọn. Đây là một cách hữu ích để tận dụng thực tế rằng Boolean là các số.
Toán tử Boolean
Toán tử Boolean là những toán tử nhận đầu vào Boolean và trả về kết quả Boolean .
Lưu ý: Sau đó, bạn sẽ thấy rằng các toán tử này có thể được cung cấp các đầu vào khác và không phải lúc nào cũng trả về kết quả Boolean. Hiện tại, tất cả các ví dụ sẽ sử dụng đầu vào và kết quả Boolean. Bạn sẽ thấy cách điều này tổng quát cho các giá trị khác trong phần về độ tin cậy .
Vì các giá trị Boolean trong Python chỉ có hai tùy chọn khả thi, True
hoặc False
, có thể chỉ định các toán tử hoàn toàn theo kết quả mà chúng gán
cho mọi kết hợp đầu vào có thể có. Các thông số kỹ thuật này được gọi là bảng sự thật vì chúng được hiển thị trong một bảng.
Như bạn sẽ thấy ở phần sau, trong một số tình huống, biết một đầu vào cho một toán tử là đủ để xác định giá trị của nó. Trong những trường hợp đó, đầu vào khác không được đánh giá. Đây được gọi là đánh giá ngắn mạch .
Tầm quan trọng của việc đánh giá ngắn mạch phụ thuộc vào từng trường hợp cụ thể. Trong một số trường hợp, nó có thể ít ảnh hưởng đến chương trình của bạn. Trong các trường hợp khác, chẳng hạn như khi cần tính toán nhiều để đánh giá các biểu thức không ảnh hưởng đến kết quả, nó mang lại lợi ích hiệu suất đáng kể. Trong những trường hợp khắc nghiệt nhất, tính đúng đắn của mã của bạn có thể phụ thuộc vào việc đánh giá ngắn mạch.
Các nhà khai thác không có đầu vào
Bạn có thể nghĩ về True
và False
như các toán tử Boolean mà không cần đầu
vào. Một trong những toán tử này luôn trả về True
và toán tử kia luôn trả về False
.
Việc coi các giá trị Boolean trong Python như các toán tử đôi khi rất hữu ích. Ví dụ: cách tiếp cận này giúp nhắc nhở bạn rằng chúng không phải là các biến. Vì lý do tương tự mà bạn không thể gán cho +
, không thể gán cho True
hoặc False
.
Chỉ có hai giá trị Boolean trong Python tồn tại. Toán tử Boolean không có đầu vào luôn trả về cùng một
giá trị. Bởi vì điều này, True
và False
là hai toán tử Boolean duy nhất không nhận đầu vào.
Các not
Boolean điều hành
Toán tử Boolean duy nhất có một đối số là not
. Nó nhận một đối số và trả về kết quả ngược lại: False
for True
và True
for False
. Đây là bảng sự thật:
Bảng này minh họa not
trả về giá trị chân lý ngược lại của đối số. Vì not
chỉ lấy một đối số nên nó không
ngắn mạch. Nó đánh giá đối số của nó trước khi trả về kết quả:
>>>
>>> not True
False
>>> not False
True
>>> def print_and_true[]:
... print["I got called"]
... return True
...
>>> not print_and_true[]
I got called
False
Dòng cuối cùng cho thấy not
đánh giá đầu vào của nó trước khi trả về False
.
Bạn có thể tự hỏi tại sao không có toán tử Boolean nào khác nhận một đối số duy nhất. Để hiểu lý do tại sao, bạn có thể nhìn vào bảng hiển thị tất cả các toán tử Boolean về mặt lý thuyết có thể sử dụng một đối số:
True
| False
| True
| True
| False
|
False
| True
| False
| True
| False
|
Chỉ có bốn toán tử khả thi với một đối số. Ngoài ra not
, ba toán tử còn lại đều có những cái tên hơi kỳ quái vì chúng không thực sự tồn tại:
Identity
: Vì toán tử này chỉ trả lại đầu vào của nó, bạn chỉ có thể xóa nó khỏi mã của mình mà không ảnh hưởng gì.Yes
: Đây là một toán tử ngắn mạch vì nó không phụ thuộc vào đối số của nó. Bạn chỉ có thể thay thế nó bằngTrue
và nhận được kết quả tương tự.No
: Đây là một toán tử ngắn mạch khác vì nó không phụ thuộc vào đối số của nó. Bạn chỉ có thể thay thế nó bằngFalse
và nhận được kết quả tương tự.
Không có toán tử nào khác có thể có với một đối số sẽ hữu ích.
Các and
Boolean điều hành
Các and
nhà điều hành phải mất hai đối số. Nó đánh giá False
trừ khi cả hai đầu vào True
. Bạn có thể xác định hành vi của and
bằng
bảng sự thật sau:
True
| True
| True
|
False
| True
| False
|
True
| False
| False
|
False
| False
| False
|
Bảng này dài dòng. Tuy nhiên, nó minh họa hành vi tương tự như mô tả ở trên. Nếu A
là False
, thì giá trị của B
không quan trọng. Bởi vì điều này, and
ngắn mạch nếu đầu vào đầu tiên là False
. Nói cách khác, nếu đầu vào đầu tiên là False
, thì đầu vào thứ hai không được đánh giá.
Mã sau có đầu vào thứ hai có tác dụng phụ , in ra, để cung cấp một ví dụ cụ thể:
>>>
>>> def print_and_return[x]:
... print[f"I am returning {x}"]
... return x
...
>>> True and print_and_return[True]
I am returning True
True
>>> True and print_and_return[False]
I am returning False
False
>>> False and print_and_return[True]
False
>>> False and print_and_return[False]
False
Trong hai trường hợp cuối cùng, không có gì được in. Hàm không được gọi vì việc gọi nó không cần thiết để xác định giá trị của and
toán tử. Nhận
thức được hiện tượng đoản mạch là rất quan trọng khi các biểu thức có tác dụng phụ. Trong hai ví dụ cuối cùng, việc đánh giá ngắn mạch ngăn cản tác dụng phụ khi in xảy ra.
Một ví dụ trong đó hành vi này có thể quan trọng là trong mã có thể tạo ra các ngoại lệ:
>>>
>>> def inverse_and_true[n]:
... 1 // n
... return True
...
>>> inverse_and_true[5]
True
>>> inverse_and_true[0]
Traceback [most recent call last]:
File "", line 1, in
File "", line 2, in inverse_and_true
ZeroDivisionError: integer division or modulo by zero
>>> False and inverse_and_true[0]
False
Hàm inverse_and_true[]
này được thừa nhận là ngớ ngẩn và nhiều linters sẽ cảnh báo về việc
biểu thức này 1 // n
là vô dụng. Nó phục vụ mục đích không thành công khi được cung cấp 0
dưới dạng tham số vì phép chia cho 0
không hợp lệ. Tuy nhiên, dòng cuối cùng không nêu ra một ngoại lệ. Do đánh giá ngắn mạch, hàm không được gọi, phép chia 0
cho không xảy ra và không có ngoại lệ nào được nêu ra.
Ngược lại, True and inverse_and_true[0]
sẽ nêu
ra một ngoại lệ. Trong trường hợp đó, giá trị của đầu vào thứ hai sẽ cần thiết cho kết quả của and
. Khi đầu vào thứ hai được đánh giá, inverse_and_true[0]
sẽ được gọi, nó sẽ chia cho 0
và một ngoại lệ sẽ được đưa ra.
Các or
Boolean điều hành
Giá trị của or
toán tử là True
trừ khi cả hai đầu vào của nó False
. Các or
nhà điều hành
cũng có thể được xác định bởi bảng sau sự thật:
True
| True
| True
|
False
| True
| True
|
True
| False
| True
|
False
| False
| False
|
Bảng này dài dòng, nhưng nó có ý nghĩa tương tự như phần giải thích ở trên.
Khi được sử dụng không chính thức, từ hoặc có thể có một trong hai nghĩa:
Độc quyền hoặc là cách hoặc được sử dụng trong cụm từ "Bạn có thể nộp đơn gia hạn hoặc nộp bài tập về nhà đúng hạn." Trong trường hợp này, bạn không thể vừa nộp đơn xin gia hạn vừa nộp bài tập về nhà đúng hạn.
Bao gồm hoặc đôi khi được chỉ định bằng cách sử dụng kết hợp và / hoặc . Ví dụ: “Nếu bạn làm tốt nhiệm vụ này, thì bạn có thể được tăng lương và / hoặc thăng chức” có nghĩa là bạn có thể được tăng lương và thăng chức.
Khi Python diễn giải từ khóa or
, nó sẽ làm như vậy bằng cách sử dụng bao gồm hoặc . Nếu cả hai đầu vào là True
, thì kết quả của or
là True
.
Bởi vì nó sử dụng bao gồm hoặc , or
toán tử trong Python cũng sử dụng đánh giá ngắn mạch. Nếu đối số đầu tiên là True
, thì kết quả là True
, và không cần đánh giá đối số thứ
hai. Các ví dụ sau đây chứng minh đánh giá ngắn mạch của or
:
>>>
>>> def print_and_true[]:
... print["print_and_true called"]
... return True
...
>>> True or print_and_true[]
True
>>> False or print_and_true[]
print_and_true called
True
The second input isn’t evaluated by or
unless the first one is False
. In practice, the short-circuit evaluation of or
is used much less often than that of and
. However, it’s important to keep this behavior in mind when reading code.
Other Boolean Operators
The mathematical theory of
Boolean logic determines that no other operators beyond not
, and
, and or
are needed. All other operators on two inputs can be specified in terms of these three operators. All operators on three or more inputs can be specified in terms of operators of two inputs.
Trong thực tế, thậm chí có cả hai or
và and
là thừa. Các and
nhà điều hành có thể được xác định theo not
và or
, và các or
nhà điều
hành có thể được xác định theo not
và and
. Tuy nhiên, and
và or
hữu ích đến mức tất cả các ngôn ngữ lập trình đều có cả hai.
Có mười sáu toán tử Boolean hai đầu vào có thể có. Ngoại trừ and
và or
, chúng hiếm khi cần thiết trong thực tế. Bởi vì điều này, True
, False
, not
, and
, và or
được chỉ được xây dựng trong các nhà khai thác Python Boolean.
Toán tử so sánh
Một số toán tử của Python kiểm tra xem liệu mối quan hệ có giữ giữa hai đối tượng hay không. Vì mối quan hệ giữ hoặc không giữ, các toán tử này, được gọi là toán tử so sánh , luôn trả về các giá trị Boolean.
Các toán tử so sánh là nguồn phổ biến nhất của các giá trị Boolean.
Bình đẳng và Bất bình đẳng
Các toán tử so sánh phổ biến nhất là toán tử bình đẳng
[ ==
] và toán tử bất bình đẳng [ !=
] . Hầu như không thể viết bất kỳ lượng mã Python có ý nghĩa nào mà không sử dụng ít nhất một trong những toán tử đó.
Toán tử bình đẳng [ ==
] là một trong những toán tử được sử dụng nhiều nhất trong mã Python. Bạn thường cần so sánh một kết quả chưa biết với một kết quả đã
biết hoặc hai kết quả chưa biết với nhau. Một số hàm trả về các giá trị cần được so sánh với một trạm gác để xem liệu một số điều kiện cạnh đã được phát hiện hay chưa. Đôi khi bạn cần so sánh kết quả từ hai hàm với nhau.
Toán tử bình đẳng thường được sử dụng để so sánh các số:
>>>
>>> 1 == 1
True
>>> 1 == 1.0
True
>>> 1 == 2
False
Bạn có thể đã sử dụng toán tử bình đẳng trước đây. Chúng là một số toán tử phổ biến nhất trong Python. Đối với tất cả các đối tượng Python dựng sẵn và đối với hầu hết các lớp của bên thứ ba, chúng trả về giá trị Boolean : True
hoặc False
.
Lưu ý: Ngôn ngữ Python không thực thi điều đó ==
và !=
trả về Booleans. Các thư viện như NumPy và pandas trả về các giá trị khác.
Chỉ đứng sau toán tử bình đẳng phổ biến là toán tử bất bình đẳng [ !=
]. Nó trả về True
nếu các đối số không bằng nhau và False
nếu chúng có. Các ví dụ tương tự nhau trên phạm vi rộng. Nhiều bài kiểm tra đơn vị kiểm tra rằng giá trị không bằng một giá trị không hợp lệ cụ thể. Ứng dụng khách web có thể kiểm tra xem có phải mã lỗi không 404 Not Found
trước khi thử một giải pháp thay thế.
Dưới đây là hai ví dụ về toán tử bất đẳng thức Python đang được sử dụng:
>>>
>>> 1 != 2
True
>>> 1 != [1 + 0.0]
False
Có lẽ điều đáng ngạc nhiên nhất về toán tử bất đẳng thức Python là thực tế là nó tồn tại ngay từ đầu. Rốt cuộc, bạn có thể đạt được kết quả tương tự như 1 != 2
với not [1 == 2]
. Python thường tránh các cú pháp bổ sung, và đặc biệt là các toán tử lõi phụ, vì những thứ có thể dễ dàng đạt được bằng các phương tiện khác.
Tuy nhiên, bất bình đẳng được sử dụng thường xuyên đến mức cần có một nhà điều hành riêng cho nó. Trong các phiên bản cũ của Python,
trong 1.x
loạt
bài này, thực sự có hai cú pháp khác nhau.
Như một trò đùa của ngày Cá tháng Tư, Python vẫn hỗ trợ một cú pháp thay thế cho sự bất bình đẳng với việc __future__
nhập đúng :
>>>
>>> from __future__ import barry_as_FLUFL
>>> 1 2
True
Điều này không bao giờ được sử dụng trong bất kỳ mã nào dành cho mục đích sử dụng thực tế. Tuy nhiên, nó có thể hữu ích cho đêm đố Python tiếp theo của bạn.
So sánh đơn hàng
Một tập hợp các toán tử kiểm tra khác là các toán tử so sánh thứ tự . Có bốn toán tử so sánh đơn hàng có thể được phân loại theo hai chất lượng:
- Hướng : Nó nhỏ hơn hay lớn hơn?
- Tính chặt chẽ : Có được phép bình đẳng hay không?
Vì hai lựa chọn là độc lập, bạn nhận được 2 * 2 == 4
các toán tử so sánh đơn hàng. Tất cả
bốn được liệt kê trong bảng này:
Nghiêm khắc |
| |
Không nghiêm khắc | =
| |
Có hai lựa chọn về hướng đi và hai lựa chọn về sự nghiêm khắc. Điều này dẫn đến tổng cộng bốn toán tử so sánh đơn hàng.
Các toán tử so sánh thứ tự không được xác định cho tất cả các đối tượng. Một số đối tượng không có thứ tự có ý nghĩa. Mặc dù các danh sách và bộ giá trị được sắp xếp theo thứ tự từ điển , nhưng từ điển không có thứ tự có ý nghĩa:
>>>
>>> {1: 3} >>>>> 1 >>> 1 >> 1 >> 2 > 3
False
>>> 2 >= 2
True
Các lập trình viên thường sử dụng các toán tử so sánh mà không nhận ra rằng chúng trả về một giá trị Python Boolean.
Người is
điều hành
Người is
điều hành kiểm tra danh tính đối tượng . Nói cách khác, chỉ x is y
đánh giá True
khi x
và y
đánh giá cho cùng một đối tượng. Các is
nhà khai thác có ngược lại, các is not
nhà điều hành.
Một cách sử dụng điển hình của is
và is not
là để so sánh danh sách cho danh tính:
>>>
>>> x = []
>>> y = []
>>> x is x
True
>>> x is not x
False
>>> x is y
False
>>> x is not y
True
Even though x == y
, they are not the same object. The is not
operator always returns the opposite of is
. There’s no difference between the expression x is not y
and the expression not [x is y]
except for readability.
Keep in mind that the above examples show the is
operator used only with lists. The behavior of the is
operator
on immutable objects like numbers and strings is more complicated.
The in
Operator
The in
operator checks for membership. An object can define what it considers members. Most sequences, such as lists, consider their elements to be members:
>>>
>>> small_even = [2, 4]
>>> 1 in small_even
False
>>> 2 in small_even
True
>>> 10 in small_even
False
Since 2
is
an element of the list, 2 in small_even
returns True
. Since 1
and 10
aren’t in the list, the other expressions return False
. In all cases, the in
operator returns a Boolean value.
Since strings are sequences of characters, you might expect them to also check for membership. In other words, characters that are
members of the string will return True
for in
, while those that don’t will return False
:
>>>
>>> "e" in "hello beautiful world"
True
>>> "x" in "hello beautiful world"
False
Since "e"
is the second element of the string, the first example returns True
. Since x
doesn’t appear in the string, the second example returns False
.
However, along with individual characters, substrings are also considered to be members of a string:
>>>
>>> "beautiful" in "hello beautiful world"
True
>>> "belle" in "hello beautiful world"
False
Since "beautiful"
is a substring, the in
operator returns True
. Since "belle"
is not a substring, the in
operator returns False
. This is despite the fact that every individual letter in "belle"
is a member of the string.
Like the operators is
and ==
,
the in
operator also has an opposite, not in
. You can use not in
to confirm that an element is not a member of an object.
Chaining Comparison Operators
Comparison operators can form chains. You can create comparison operator chains by separating expressions with comparison operators to form a larger expression:
The
expression 1 < 2 < 3
is a comparison operator chain. It has expressions separated by comparison operators. The result is True
because both parts of the chain are True
. You can break up the chain to see how it works:
>>>
>>> 1 >>>> 1 >>>> 1 > 1 == 1.0 >> 1 == 1.0 == True
True
>>> 1 2
True
>>> 1 >> 2 >> 3 >>>> 3 >>>> def foo[]:
... print["I'm foo"]
... return 1
...
>>> 0