python逻辑运算符or的短路求值特性_[Python]计算闰年时候出现的and和or优先级的问题以及短路逻辑...
好吧題目非常easy。可是有些細節還是挺有意思的。
題目是:計算今年是否是閏年,推斷閏年條件,滿足年份模400為0,或者模4為0可是模100不為0
答案是這種:
import time
#計算今年是否是閏年。推斷閏年條件,滿足年份模400為0,或者模4為0可是模100不為0
thisyear = time.localtime()[0] #獲取年份
if thisyear%400==0 or thisyear%4==0 and thisyear%100<>0:
print 'this year is a leap year'
else:
print 'this yeat is not a leap year'
非常easy的源代碼。在此來記錄當中的一些細節。
先回想一下Python中的數組,Python的數組分三種類型:
(1) list 普通的鏈表,初始化后能夠通過特定方法動態添加元素。
定義方式:arr = [元素]
(2) Tuple 固定的數組,一旦定義后,其元素個數是不能再改變的。
定義方式:arr = (元素)
(2) Dictionary 詞典類型, 即是Hash數組。
定義方式:arr = {元素k:v}
接下來看看源代碼。
首先是time模塊,localtime()返回的是一個tuple,也就是一個固定大小的數組。數組里是當前時間的一些數據 :
localtime([seconds]) -> (tm_year,tm_mon,tm_day,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst)
然后是if推斷里面的 or?和 and 。
Python的邏輯運算符里沒有“!(非),&&(與),||(或)“,
這三個表示符號(全然是英文上的表示),即 not,and,or。
可是看源代碼,推斷是否閏年應該是:
1.假設被400整除那就是閏年
2.假設能被4整除且不能被100整除
那if推斷不應該是:
if thisyear%400==0 or (thisyear%4==0 and thisyear%100<>0):
這種嗎?
實際上確實是這種。可是在Python中,and的優先級要高于or。
我們能夠來看一個小樣例:
>>> if 1 or 1 and not 1:
... print 'OK'
...
OK
假設優先級相等應該是不會輸出,事實上上面的推斷相當于:
if 1 or (1 and not 1):也就是說。
True or True and not True? 僅僅表示? (True) or (True and False)
講到這里能夠再看一個有意思的東西,來看看Python里面的短路機制:
def a():
print 'this is A!'
return 1
def b():
print 'this is B!'
return 1
def c():
print 'this is C!'
return 1
if a() or b() and not c():
print 'OK!'
假設說and的優先級要高于or,那么豈不是應該先B再C再A。怎么直接就輸出了A呢?
事實上在其它語言中也有這種情況,僅僅是當時沒有在意,這是布爾運算符的一個有趣的特性。
布爾運算符有個有趣的特性:僅僅有在須要求值時才進行求值。
舉例來說,表達式x and y須要兩個變量都為真時才為真,
所以假設x為假,表達式就會立馬返回false,而無論y的值(事實上各個語言都有這個特性)。
實際上,假設x為假。表達式會返回x得值----否則它就返回y的值。
這種行為被稱為短路邏輯(short-circuit logic)或惰性求值(lazy evaluaion):
布爾運算符通常被稱為邏輯運算符。就像你看到的那樣第2個值有時“被短路了”。
這種行為對于or來說也相同適用。
在表達式x or y中。x為真時,它直接返回x的值。否則返回y值。
注意,這意味著在布爾運算符之后的全部代碼都不會運行。
再看看剛剛的那個樣例,and優先級高,表明最靠近它兩邊的表達式是與的關系。這種組合是優先的。
非常明顯,遇到第一個True,就不是必需再計算or后面的東西了,結果已經是True了。
在Python中運用and?和 or能夠實現三元運算,比方在JS中的一個函數:
function trans(v) {
return (v==0)?1:v;
}
在Python中能夠有下面兩種替換方案:
def trans(v):
return 1 if v==0 else v
或者:
def trans(v):
return v==0 and 1 or v
解釋一下:
假設v等于0,則跟1做與運算,為true,則不進行后面的或運算,直接返回1;
假設v等于0為false,則跟1做與運算,為false,繼續進行或運算,返回v。
總結
以上是生活随笔為你收集整理的python逻辑运算符or的短路求值特性_[Python]计算闰年时候出现的and和or优先级的问题以及短路逻辑...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OPPO Find X6系列火爆:超20
- 下一篇: 博主带卷尺吃披萨发现尺寸不够:99元12