[英]Is `a<b<c` valid python?
我很好奇我是否可以使用a<b<c
作為條件而不使用標准a<b and b<c
。 所以我試了一下,我的測試結果通過了。
a = 1
b = 2
c = 3
assert(a<b<c) # In bounds test
assert(not(b<a<c)) # Out of bounds test
assert(not(a<c<b)) # Out of bounds test
只是為了更好的衡量,我嘗試了更多的數字,這次是在負區域。 其中a, b, c = -10, -9, -8
。 測試再次通過。 即使是更高范圍的測試服也適用於 a a, b, c = 10, 11, 12
。 甚至a, b, c = 10, 20, 5
。
並在 C++ 中完成了相同的實驗。 這是我的心態:
#include <iostream>
using namespace std;
int main()
{
int a,b,c;
a=10;
b=20;
c=5;
cout << ((a<b<c)?"True":"False") << endl; // Provides True (wrong)
cout << ((a<b && b<c)?"True":"False") << endl; // Provides False (proper answer)
return 0;
}
我最初認為這個實現是無效的,因為在我遇到的所有其他語言中,它都會在到達c
之前評估一個布爾值。 對於這些語言, a<b
將評估為布爾值並繼續評估b<c
將無效,因為它會嘗試根據數字評估布爾值(很可能會引發編譯時錯誤或偽造預期的比較)。 出於某種原因,這讓我有點不安。 我想我只需要確信這是語法的一部分。 提供 Python 文檔中提供此功能的位置的參考也很有幫助,這樣我就可以了解他們在多大程度上提供了這樣的功能。
這在此處記錄。
形式上,如果 a, b, c, ..., y, z 是表達式並且 op1, op2, ..., opN 是比較運算符,那么 a op1 b op2 c ... y opN z 等價於 a op1 b和 b op2 c 和 ... y opN z,除了每個表達式最多計算一次。
而且,作為一個例子,
比較可以任意鏈接,例如,x < y <= z 等價於 x < y 和 y <= z,除了 y 只計算一次(但在這兩種情況下,當找到 x < y 時根本不計算 z是假的)。
Python“自然地”鏈接關系運算符。 請注意,Python 的關系運算符包括in
和is
(及其否定),當將它們與符號關系運算符混合時,可能會導致一些令人驚訝的結果。
a <b <c
它執行如下
(a <b)<c
(假)<c =>(0)<c
真正.....
這件事發生在你身上
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.