Computer >> Máy Tính >  >> Lập trình >> Python

Kỹ thuật tạo mạch ngắn trong Python?

Một sai lầm phổ biến đối với những người mới lập trình là hiểu sai về cách thức hoạt động của các toán tử boolean, điều này bắt nguồn từ cách trình thông dịch python đọc các biểu thức này. Ví dụ:sau khi tìm hiểu ban đầu về các câu lệnh "và" và "hoặc", người ta có thể giả định rằng biểu thức X =('x' hoặc 'y') sẽ kiểm tra xem biến X có tương đương với một trong các chuỗi 'a không 'hoặc' b '. Đây không phải là như vậy. Để hiểu những gì tôi đang cố gắng nói, hãy bắt đầu một phiên tương tác với trình thông dịch và nhập các biểu thức sau:

>>> 'x' == ('x' or 'y')
True
>>> 'y' == ('x' or 'y')
False
>>> 'x' == ('x' and 'y')
False
>>> 'y' == ('x' and 'y')
True

Tại thời điểm này, toán tử và và hoặc dường như bị hỏng. Không hợp lý khi đối với hai biểu thức đầu tiên, ‘x’ tương đương với ‘x’ hoặc ‘y’ thì không. Hơn nữa, không có nghĩa là ‘y’ tương đương với ‘x’ và ‘y’. Sau khi kiểm tra những gì trình thông dịch thực hiện với các toán tử Boolean, những kết quả này trên thực tế hoạt động chính xác những gì bạn đang yêu cầu về chúng, nó không giống như những gì bạn nghĩ bạn đang hỏi.

Đối với một hoặc một biểu thức, trình thông dịch python trước tiên sẽ nhận câu lệnh đầu tiên và kiểm tra xem có đúng hay không. Khi câu lệnh đầu tiên là true, thì python trả về giá trị của đối tượng đó mà không cần xem xét đối số thứ hai. Điều này là do đối với một hoặc biểu thức, toàn bộ điều là đúng nếu một trong các giá trị là đúng; và chương trình không xem xét câu lệnh thứ hai. Tuy nhiên, nếu giá trị đối tượng đầu tiên đánh giá là false, python sẽ kiểm tra câu lệnh thứ hai và trả về giá trị đó. Nửa sau xác định giá trị chân lý của biểu thức vì nửa đầu là sai. Sự “lười biếng” này từ phía trình thông dịch được gọi là “sự chập chờn” và là một cách phổ biến để đánh giá biểu thức Boolean trong nhiều ngôn ngữ lập trình.

Tương tự, đối với một và biểu thức, python sử dụng kỹ thuật ngắn mạch để tăng tốc độ đánh giá giá trị sự thật. Nếu câu lệnh đầu tiên là false thì toàn bộ điều đó phải là false và nó trả về giá trị đối tượng đó (false), ngược lại, nếu giá trị đầu tiên là true, nó sẽ kiểm tra câu lệnh thứ hai và trả về giá trị đó. Hãy xem những gì trình thông dịch “nhìn thấy” khi nó đi qua mã

Trường hợp đầu tiên

'x' == ('x' or 'y') # Look at parentheses first, so evaluates "('x' or 'y")"
# 'x' is a nonempty string, so the first value is True
>>> 'x' == 'x' # the string 'x' is equivalent to the string 'x' , so our expression is True
True

Trường hợp thứ hai

'y' == ('x' or 'y')# Look at parentheses first, so evaluates expression "('x' or 'y')"
# 'x' is a nonempty string, so the first value is True
#Return that first value : 'x'
'y' == 'x'# the string 'y' is not equivalent to the string 'x', so the expression is False

Trường hợp thứ ba

>>> 'x' == ('x' and 'y')# Look at parentheses first, so evaluate expression "('x' and 'y')"
#'x' is a nonempty string, so the first value is True, examine second value
# 'y' is a nonempty string, so second value is True
#Return that second value as result of whole expression: 'y'
>>> 'x' == 'y'# the string 'x' is not equivalent to the string 'y', so expression is False
False

Trường hợp thứ tư

>>> 'y' == ('x' and 'y')# Look at parenthese first, so evaluates expression "('x' and 'y')"
True
# 'x' is a nonempty string, so the first value is True, examine second value
# 'y' is a nonempty string, so second value is True
# Return that second value as result of whole expression: 'y'
>>> 'y' == 'y'# the string 'y' is equivalent to the string 'y', so expression is True
True

Đánh giá ngắn mạch có nghĩa là khi đánh giá biểu thức Boolean như AND và OR, bạn có thể dừng lại ngay khi tìm thấy điều kiện đầu tiên thỏa mãn hoặc phủ định biểu thức.

Ngắn mạch được giải thích bằng tài liệu chính thức:

Hoạt động

Kết quả
Mô tả
x hoặc y
Nếu x sai, thì y khác x
Chỉ đánh giá đối số thứ hai (y) nếu đối số đầu tiên là sai
x và y
Nếu x sai thì x khác y
Chỉ đánh giá đối số thứ hai (y) nếu đối số đầu tiên (x) là True
không phải x
Nếu x sai, thì Đúng, còn lại Sai
Không có mức độ ưu tiên thấp hơn các toán tử không boolean