自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

不可思議,Python 的鏈?zhǔn)讲僮骶谷豢梢赃@樣

開(kāi)發(fā) 后端
學(xué)習(xí) Python 的過(guò)程中,有沒(méi)有讓你出乎意料的情景,在細(xì)品之后,又覺(jué)得情理之中呢?(有的話(huà)文末留言哈)我就遇到過(guò),初見(jiàn)時(shí)不可思議,仔細(xì)學(xué)習(xí)之后,又覺(jué)得豁然開(kāi)朗,Python 的鏈?zhǔn)讲僮骶褪沁@樣的場(chǎng)景。

[[434237]]

學(xué)習(xí) Python 的過(guò)程中,有沒(méi)有讓你出乎意料的情景,在細(xì)品之后,又覺(jué)得情理之中呢?(有的話(huà)文末留言哈)我就遇到過(guò),初見(jiàn)時(shí)不可思議,仔細(xì)學(xué)習(xí)之后,又覺(jué)得豁然開(kāi)朗,Python 的鏈?zhǔn)讲僮骶褪沁@樣的場(chǎng)景。

不可思議

比如說(shuō),你看到 True is False 的結(jié)果是 False, False is False 的結(jié)果是 True ,不會(huì)覺(jué)得有什么問(wèn)題:

  1. >>> True is False 
  2. False 
  3. >>> False is False 
  4. True 

然后,當(dāng)你你看到 True is False is False 的結(jié)果是 False,可能就覺(jué)得不可思議。

  1. >>> True is False is False 
  2. False 
  3. >>> 

因?yàn)闊o(wú)論是從前計(jì)算,還是從后計(jì)算,結(jié)果都應(yīng)該是 True 啊:

  1. >>> (True is Falseis False 
  2. True 
  3. >>> True is (False is False
  4. True 
  5. >>> 

豁然開(kāi)朗

當(dāng)認(rèn)知和實(shí)際情況不一致的時(shí)候,恰恰是我們需要學(xué)修正自己的時(shí)候。這種操作屬于鏈?zhǔn)讲僮?,Python 的官方文檔有解釋?zhuān)篽ttps://docs.python.org/3/reference/expressions.html#comparisons

翻譯一下,大致意思就是 Python 中的比較運(yùn)算與 C 語(yǔ)言不同,這些比較操作具有相同的優(yōu)先級(jí),該優(yōu)先級(jí)低于任何算術(shù),移位或按位運(yùn)算。

這些比較操作包括 in, not in, is, is not, <, <=, >, >=, !=, == 操作符,會(huì)產(chǎn)生 True 或 False 的結(jié)果,這些比較操作符號(hào)可以任意的鏈?zhǔn)奖容^,比如:x < y <= z,x < y 與 y <= z 具有相同的優(yōu)先級(jí),不存在先計(jì)算 x < y ,得到結(jié)果后再與<=z 進(jìn)行比較的情況,因此x < y <= z 與 x < y and y <= z是等價(jià)的。

x < y and y <= z 中,如果 x < y 的結(jié)果是 False,那么 y <= z 根本不會(huì)被計(jì)算。

也就是說(shuō)a op1 b op2 c ... y opN z 等價(jià)于 a op1 b and b op2 c and ... y opN z,每一個(gè)表達(dá)式最多被執(zhí)行一次。

注意,a op1 b op2 c 并不代表 a 和 c 有必然的關(guān)系,比如這樣寫(xiě)x < y > z 也是合法的,雖然并不好看。

那么開(kāi)始的問(wèn)題就變得簡(jiǎn)單了:

  1. True is False is False 

相當(dāng)于

  1. (True is Falseand (False is False

結(jié)果自然就是 False。

相信,現(xiàn)在你已經(jīng)明白了下面的現(xiàn)象:

  1. >>> 1 in [0,1] == True 
  2. False 
  3. >>> not True in [True,False
  4. False 

然后,我再分享一下鏈?zhǔn)讲賾?yīng)用的好例子和壞例子。

好例子,一目了然:

  1. if 0 < x < 1: 
  2.     print("x in range (0,1)"
  3.  
  4. if 0 <= x < 1: 
  5.     print("x in range [0,1)"
  6.  
  7. if x <= y <= z: 
  8.     print("y in range [x,z]"
  9.  
  10. if x >= y >= 1: 
  11.     print("y in range [1,x]"
  12.  
  13. if x == y == z: 
  14.     print("x,y,z all equal"

壞例子,不知所云。我們應(yīng)該避免這樣寫(xiě):

  1. if x < y > z: 
  2.     print("y > max(x,z)"
  3.  
  4. if x != y != z: 
  5.     print("kinda looks like x,y,z all distinct, but may have x==z"
  6.  
  7. if 0 > x < y != z > 1: 
  8.     print("WHY??"
  9.  
  10. if 0 < x > 1 >> y << 1 < z > 1: 
  11.     print("please remove this from the language"

用法沒(méi)問(wèn)題,但可能讓人產(chǎn)生疑問(wèn)的,類(lèi)似文章開(kāi)頭的例子,也盡量避免:

  1. if 0 < x < y == z < 1: 
  2.     print("x,y in (0,1) with x<y and z==y"
  3.  
  4. if x <= y <= z != 1: 
  5.     print("y in range(x,z) with z != 1"
  6.  
  7. if x == y == z != 1: 
  8.     print("x,y,z all equal something that isn't 1"
  9.  
  10. if x is y is z: 
  11.     print("x,y,z all identical"
  12.  
  13. if x is y is z in [1, 2, 3]: 
  14.     print("x,y,z all identical and in [1,2,3]"

 

責(zé)任編輯:武曉燕 來(lái)源: Python七號(hào)
相關(guān)推薦

2023-04-06 09:44:00

ChatGPT行業(yè)質(zhì)量

2017-03-21 08:52:20

神經(jīng)網(wǎng)絡(luò)聲譽(yù)

2013-10-10 13:07:25

方物

2024-04-07 00:00:00

億級(jí)數(shù)據(jù)ES

2011-02-23 08:50:22

C#.NETdynamic

2022-01-24 15:57:34

Python返回功能代碼

2010-07-15 16:21:03

不可思議的服務(wù)器

2020-07-02 15:40:11

Spring BootJar包Java

2011-07-18 13:35:14

HTML 5

2013-07-31 15:06:58

未來(lái)的WebWebGLWeb

2014-07-26 22:18:51

2017-11-08 14:07:45

數(shù)據(jù)庫(kù)MySQL慢查分析

2014-01-14 10:33:42

開(kāi)源硬件開(kāi)源

2012-02-13 11:01:27

N9Android 4.0

2016-07-06 11:56:52

思科漢堡光纖骨干網(wǎng)

2012-05-16 17:28:32

智能手機(jī)

2023-04-04 22:31:11

GPT-5人工智能

2014-11-13 10:08:21

2021-03-03 07:12:47

Windows10操作系統(tǒng)微軟

2020-09-16 10:24:37

物聯(lián)網(wǎng)環(huán)保應(yīng)用IOT
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)