Chained comparisons - 1 < 2 < 3
Hiện tượng kỳ lạ
Phần tiêu đề “Hiện tượng kỳ lạ”# Toán học tự nhiênprint(1 < 2 < 3) # True ✅print(3 > 2 > 1) # True ✅print(1 < 3 > 2) # True ✅
# Nhưng...print(1 < 2 and 2 < 3) # Trueprint((1 < 2) < 3) # True (nhưng logic khác!)
# Thậm chíprint(1 == 1 < 2) # Trueprint(1 < 2 == True) # False ❌ What?!What the Python?! Sao lại có thể chain comparisons như toán học?! 🤔
Giải thích
Phần tiêu đề “Giải thích”Chained comparisons = Syntactic sugar
Phần tiêu đề “Chained comparisons = Syntactic sugar”# Python cho phépa < b < c
# Tương đươnga < b and b < c
# KHÔNG phải(a < b) < c # ❌ Sai!Evaluate left-to-right
Phần tiêu đề “Evaluate left-to-right”# 1 < 2 < 3# = 1 < 2 and 2 < 3# = True and True# = True
# 3 < 2 < 1# = 3 < 2 and 2 < 1# = False and False# = FalseMỗi giá trị evaluate 1 lần
Phần tiêu đề “Mỗi giá trị evaluate 1 lần”def get_value(): print("Called!") return 2
# Chỉ call 1 lầnresult = 1 < get_value() < 3# Output: "Called!" (chỉ 1 lần)# Result: TrueCác operators hỗ trợ
Phần tiêu đề “Các operators hỗ trợ”# Comparison operatorsa < b < c # Less thana <= b <= c # Less than or equala > b > c # Greater thana >= b >= c # Greater than or equala == b == c # Equalitya != b != c # Inequality (cẩn thận!)
# Mix operatorsa < b <= c # OKa == b < c # OKUse cases hữu ích
Phần tiêu đề “Use cases hữu ích”Range checking
Phần tiêu đề “Range checking”# ✅ Rõ ràng và Pythonicage = 25if 18 <= age < 65: print("Working age")
# ❌ Dài dòngif age >= 18 and age < 65: print("Working age")Sorting check
Phần tiêu đề “Sorting check”# Kiểm tra sortednumbers = [1, 2, 3, 4, 5]is_sorted = all(numbers[i] <= numbers[i+1] for i in range(len(numbers)-1))
# Hoặca, b, c = 1, 2, 3if a <= b <= c: print("Sorted")Cạm bẫy
Phần tiêu đề “Cạm bẫy”Trap 1: Chaining với equality
Phần tiêu đề “Trap 1: Chaining với equality”# Trông hợp lýprint(1 == 1 == 1) # True ✅
# Nhưng...print(1 == 1 == True) # True (vì 1 == True)print(True == 1 == 1) # True
# Nhầm lẫnprint(1 == True == 1) # True (không phải False!)Trap 2: Chaining !=
Phần tiêu đề “Trap 2: Chaining !=”# KHÔNG như toán học!print(1 != 2 != 3) # True# = 1 != 2 and 2 != 3# = True and True
print(1 != 2 != 1) # True ❌# = 1 != 2 and 2 != 1# = True and True# Nhưng toán học: 1 ≠ 2 ≠ 1 không hợp lý!Trap 3: Mix với boolean
Phần tiêu đề “Trap 3: Mix với boolean”# Confusingprint(1 < 2 == True) # False!# = 1 < 2 and 2 == True# = True and False# = False
print((1 < 2) == True) # TrueBest Practices
Phần tiêu đề “Best Practices”✅ Nên dùng
Phần tiêu đề “✅ Nên dùng”# Range checksif min_val <= x <= max_val: pass
# Sorted checksif a <= b <= c: pass
# Multiple equalityif x == y == z == 0: pass❌ Tránh
Phần tiêu đề “❌ Tránh”# Tránh chain !=if a != b != c: # ❌ Confusing pass
# Tránh mix với True/Falseif x < y == True: # ❌ Confusing pass
# Quá phức tạpif a < b > c <= d != e: # ❌ Hard to read passTóm tắt
Phần tiêu đề “Tóm tắt”Chained comparisons trong Python:
- ✅
a < b < c=a < b and b < c- ✅ Mỗi giá trị evaluate 1 lần
- ⚠️
!=chaining confusing- 🎯 Best cho range checks:
min <= x <= max
Pattern:
# Range checkif low <= value <= high: pass
# Sorted checkif a <= b <= c: pass