2 回答

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
在許多情況下,Python的外觀和行為與自然英語(yǔ)相似,但這是抽象失敗的一種情況。人們可以使用上下文線索來(lái)確定“Jon”和“Inbar”是加入動(dòng)詞“equals”的對(duì)象,但Python解釋器更具有文字意識(shí)。
if name == "Kevin" or "Jon" or "Inbar":
在邏輯上等同于:
if (name == "Kevin") or ("Jon") or ("Inbar"):
對(duì)于用戶Bob來(lái)說(shuō),相當(dāng)于:
if (False) or ("Jon") or ("Inbar"):
該or
運(yùn)營(yíng)商選擇以積極的第一個(gè)參數(shù)真值:
if ("Jon"):
由于“Jon”具有正的真值,因此該if
塊執(zhí)行。這就是導(dǎo)致“授予訪問(wèn)權(quán)限”被打印的原因,無(wú)論給出的名稱(chēng)如何。
所有這些推理也適用于表達(dá)式if "Kevin" or "Jon" or "Inbar" == name
。第一個(gè)值為"Kevin"
true,因此if
塊執(zhí)行。
有兩種常用方法可以正確構(gòu)建此條件。
使用多個(gè)
==
運(yùn)算符顯式檢查每個(gè)值:if name == "Kevin" or name == "Jon" or name == "Inbar":
編寫(xiě)一系列有效值,并使用
in
運(yùn)算符測(cè)試成員資格:if name in ("Kevin", "Jon", "Inbar"):
一般來(lái)說(shuō),第二個(gè)應(yīng)該是首選,因?yàn)樗菀组喿x,也更快:
In [1]: name = "Inbar"In [2]: %timeit name == "Kevin" or name == "Jon" or name == "Inbar"10000000 loops, best of 3: 116 ns per loopIn [3]: %timeit name in ("Kevin", "Jon", "Inbar")10000000 loops, best of 3: 65.2 ns per loop

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超7個(gè)贊
簡(jiǎn)單的工程問(wèn)題,讓我們更進(jìn)一步。
In [1]: a,b,c,d=1,2,3,4In [2]: a==bOut[2]: False
但是,繼承自語(yǔ)言C,Python將非零整數(shù)的邏輯值評(píng)估為T(mén)rue。
In [11]: if 3: ...: print ("yey") ...:yey
現(xiàn)在,Python構(gòu)建在該邏輯上,并允許您使用邏輯文字,例如或整數(shù),等等
In [9]: False or 3Out[9]: 3
最后
In [4]: a==b or c or dOut[4]: 3
寫(xiě)它的正確方法是:
In [13]: if a in (b,c,d): ...: print('Access granted')
為安全起見(jiàn),我還建議您不要硬編碼密碼。
添加回答
舉報(bào)