在前面的篇章中,我們似乎已經全部了解了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...