and or的 徹底研究

2021-08-08 15:30:26 字數 3261 閱讀 7472

在前面的篇章中,我們似乎已經全部了解了and和or

1. 執行順序:從左到右依次結合執行

2. 查詢方式:and查詢真值為false,or查詢真值為true,然後返回找到的物件

還談論了邏輯運算中語句和物件的概念:

邏輯判斷和儲存操作,針對的群體必定是物件,執行語句會先執行,將執行結果當做物件進行操作

但是,目前為止,這些都是基本的屬性和知識

讓我們用一行**打破原有的觀念,開啟關於and和or更深層次的大門

print(1 and 0 or 3)#3

列印的是多少?不是零,而是三

print(0 if 1 else 3)#0
列印0,所以,我們之前認為相同的作用不同的表達根本是不成立的

1 ? 0 : 3
和最原始的三目對比,發現and...or簡直是錯漏百出,完全違背了初衷

但是之前不是都成功了麼,怎麼錯了?

這是由於慣性思維的兩個盲點:

1. 單獨操作:之前進行的實驗,都是單一的使用得出結論,當多個連用時,會出現新的規律

2. 返回物件:返回的物件過於單一,沒有涉及到全部的可能

這兩個問題在多個語句連線使用時,可以歸結為乙個問題,現在先**一下and和or的本質功能

本質:兩者都是進行邏輯判斷,但是判斷方式存在差異

and:判斷兩邊條件是否同時成立,當第乙個條件成立,判斷第二個,第乙個條件不成立直接返回

or:判斷兩邊條件之一是否同時成立,第乙個成立直接返回,第乙個不成立判斷第二個

加上返回原生物件,就組合成了之前的一般性認知和用法

現在先對兩者單獨的使用方式進行進一步的加深

and:組合and的判斷本質和判斷中語句會執行轉換成物件兩個特性,形成if語句

def mark5(mark):

return mark > 5 and mark -5

return mark < 5 and 5- mark

相當於

def mark5(mark):

if mark > 5:

return mark -5

if mark < 5:

return 5 - mark

這裡很輕易的看出來,利用and語句可以極大的簡化**

同時,從邏輯上可以明白:想要and最後面的語句得到執行,必須滿足前置的全部條件

def print_five_to_ten(num):

print(num >= 5 and num <= 10 and num)

可以看到,and是乙個追求十全九美的方法,它只容許最後一步的錯誤

它的錯誤只能出現乙個,而且只能出現在最末,否則,and只會返回停止繼續操作處的物件,得不到完整的執行

所以,在多重條件判斷中,我們可以將條件用and進行連線,將語句寫在最末,替換if的多重判斷執行語句

if num >= 5:

if num <= 10:

print(num)

或者是

if num >= 5 and num <= 10:

print(5)

and簡化替換

num >= 5 and num <= 10 and print(num)

不論是**量還是**結構,and比if都具有更強大的優勢

or:單獨作用不大,和and用法一樣,但是意義相反,同時不滿足才能執行最末語句,只允許一次的成功

def mark5(mark):

mark<5 or mark > 10 or print(mark)

這個特性,在某些時候,和and替換,可以省去not的操作

and和or的連線技巧

在前面的小例子,也蘊含了不引人注意的兩個重要特質

and:連線部分,每個部分都是整體中不可分割的部分,一榮俱榮,一損俱損(最末的執行語句或物件依舊會返回,但是整體的真值是絕對的)

or:分隔整體,將整體分個成多個部分,一人得道,雞犬**,其中乙個部分為真,整個表示式真值就會為真

所以,連線使用的情況下,or會承擔更重要的角色,將整體進行劃分,然後and成為區域性的整體,進行細節的排程

現在重新理解一下這行**

print(1 and 0 or 3)
1. 經過or分隔的兩個部分,分作了左邊的and操作語句和右邊的3

2. 計算and操作語句,得到0

3. 計算 0 or 3,0真值為false,返回3

可以看到,and的跳出操作只是侷限於部分的整體,整個的表示式依靠or進行返回

所以,對於整體真值,and和or有不同的權力分配

1. and:小隊長,區域性整體中擁有絕對權力,可以結束該部分的語句執行操作

2. or:國家領導,自身的操作足夠決定整個表示式的值,排程整個執行流程

因此,對於and和or的連線使用,必須從兩個方面進行理解

1. 邏輯判斷:基本的邏輯操作決定了語句的執行步驟,or權力大於and

2. 返回物件:根據步驟合理安排條件判斷和語句執行,最終執行語句或獲取物件

實際演練:求三個數中最大值

max = lambda a,b,c:a >=b and a >= c and a or b >= a and b >= c and b or c

一句話**完成全部判斷操作

還有,明白了邏輯判斷的本質和返回物件的原生,更加讓人容易忽視的就是執行**和物件的轉換

尤其是執行**中包含了邏輯判斷,更加容易干擾人的實現,擾亂人的思維

print(1 and 0 or 3)
這只是乙個最典型且典型得容易讓人忽視的例子,但是體現的本質是如此的深厚,至今仍能夠總結出兩點教訓

1. 邏輯語句是整體的部分,但是判斷完畢後有被視為計算物件的操作,對物件會在此進行邏輯判斷.....(如此往復,直到最簡)

2. 時刻關注操作的物件的值,每一步邏輯操作中,得到的物件會不停的變更,尤其是物件也會作為條件進行判斷

當物件是乙個真值為false的值時,對整個連線語句的邏輯破壞性是十分強大的(我們已經親身體驗過)

最後值得注意的一點,無返回值方法執行完畢,預設得到物件為none

根據邏輯順序新增執行語句時,注意物件值對整體邏輯的影響

ViewState徹底研究

1.為什麼需要產生viewstate概念?2.使用demo了解asp.net page的life cycle,進而了解viewstate工作原理?當 classic asp 中的表單被提交時,所有的表單值都會被清空。設想一下,您提交了一張帶有大量資訊的表單,而伺服器返回了乙個錯誤。您將不得不返回表單...

CSS設計徹底研究

這本書不錯,詳細介紹了css的相關知識,對初學者和想進一步學習的人都有幫助。行內樣式 id樣式 類樣式 標記樣式 font weight bold font size 30px text decoration underline 強調標籤 盒子模型 給出2個值,前者表示上下,後者為左右 給出3個值,...

CSS徹底研究 2

margin border padding結構 內容content 組成盒模型 注意width,height 取的是content區域的寬高,不包括padding border margin,但是盒子實際所佔高度要算上外面三個 padding border margin 賦值順序,順時針,上 top...