淺談Python里面None True False之間的區(qū)別
None雖然跟True False一樣都是布爾值。
雖然None不表示任何數(shù)據(jù),但卻具有很重要的作用。
它和False之間的區(qū)別還是很大的!
例子:
>>> t = None>>> if t:... print('something')... else:... print('nothing')...nothing
區(qū)分None和False.使用is來操作!
>>> if t is None:... print('this is None!')... else:... print('this is ELSE!')...this is None!>>>
雖然是個小小的區(qū)別!但是在Python里面是重要的。你需要將None和不含任何值的空數(shù)據(jù)結(jié)構(gòu)區(qū)分開。
0值的整型/浮點型,空字符串(‘ ’),空列表([]),空元組({}),空集合(set())都是等價于False,但是不等于None。
現(xiàn)在,寫一個函數(shù):
>>> def oj(t):... if t is None:... print('this is None')... elif t:... print('this is True')... else:... print('this is False')...
進行數(shù)據(jù)測驗:
>>> oj(None)this is None>>> oj(True)this is True>>> oj(False)this is False>>> oj(0)this is False>>> oj(0.0)this is False>>> oj([])this is False>>> oj(())this is False>>> oj({})this is False
以上說明,None,F(xiàn)alse,True還是有很大不同的~
補充知識:python '0.3 == 3 * 0.1' 為False的原因
一.引入
如果你在你的解釋器中輸入以下第一行代碼:
>>> 0.3 == 3 * 0.1
False
你會發(fā)現(xiàn),輸出為False。
對于CS小白而言,對此表示費解。
因此我查了相關的資料,進行了一下總結(jié)。
二.浮點算法的問題和局限
1.計算機硬件對于浮點數(shù)的處理方式
首先,我們必須明白一件事情。浮點數(shù)在計算機硬件中表示為基數(shù)2(二進制)的分數(shù)。
例如:
0.125(10) == 1/10 + 2/100 + 5/1000
0.001(2) == 0/2 + 0/4 + 0/8
這兩個分數(shù)具有相同的值,唯一的實際區(qū)別是,第一個分數(shù)以10為基數(shù)的分數(shù)表示,第二個分數(shù)以2為基數(shù)。當我們輸入0.125時,計算機硬件會以第二種方式表示,而不是第一種。
但是不幸的是,大多數(shù)十進制分數(shù)不能完全表示為二進制分數(shù)。
結(jié)果是,通常我們輸入的十進制浮點數(shù)僅由計算機中實際存儲的二進制浮點數(shù)
近似。但是在十進制不能完全表示為二進制分數(shù)的情況下,無論多么近似,終究不是確切值。
2.例子:對于0.1的處理
例如0.1(10),無論我們愿意使用多少個2位數(shù)字,十進制值0.1都不能精確表示為2進制小數(shù),即以2為底的1/10是無限重復的分數(shù)。
0.1(10) == 0.0001100110011001100110011001100110011001100110011...(2)
當我們讓它停在某個有限的位數(shù),就可以得出一個近似值。
因為Python浮點數(shù)可使用 53位精度 ,
因此輸入十進制數(shù)時計算機內(nèi)部存儲的值0.1是
0.00011001100110011001100110011001100110011001100110011010(2)
這個值接近但是不等于1/10.
這也是造成print(0.3 == 3 * 0.1)輸出為False的原因。
如果要強制使用python輸出計算機內(nèi)保存的0.1的真實十進制值,應該為
>>> 0.1
0.1000000000000000055511151231257827021181583404541015625
由于這一串數(shù)字實在太長了,所以Python通過顯示舍入的值來保持數(shù)字的可管理性。所以實際上我們看到是:
>>> 0.1
0.1
但是我們要明白,機器中的值不完全是1/10,這只是舍入了真實機器值的顯示。
3.一點有趣的東西
上面我們提到了Python通過顯示舍入的值來保持數(shù)字的可管理性,我們看到的只是舍入了真實機器值的顯示。通過下面的例子,我們就可以更加清楚這一事實。
當我們用python寫下下面的代碼時,就會發(fā)現(xiàn)這個神奇的現(xiàn)象。
這本質(zhì)上是二進制浮點數(shù):這不是Python中的bug,也不是代碼中的bug。在支持硬件浮點算術(shù)的所有語言中,都會看到同一種東西(盡管某些語言在默認情況下或在所有輸出模式下可能不會顯示差異)。
1)0.1+0.2
>>> 0.1 + 0.2
0.30000000000000004
2)round(2.675, 2)
i)round( x [, n] )的用法
作用: 返回浮點數(shù)x的四舍五入值。
參數(shù):
x ? 數(shù)值/數(shù)值表達式。
n ? 要保留的小數(shù)位數(shù),可以省略。若省略,n默認為0,即四舍五入到整數(shù)。
ii)round( 2.675, 2)
按照我們的邏輯來看,輸入round( 2.675, 2 ),輸出應該為2.68。但是實際上是:
>>> round(2.675, 2)
2.67
三.表示錯誤(選讀)
在這里我們詳細說明“ 0.1”示例,并說明我們?nèi)绾巫约簩Υ祟惽闆r進行準確的分析。如果你不想深究其背后的原因,下面的可以忽略。
1.表示錯誤的概念、影響和原因
(1)概念
表示錯誤是指某些(在實際中為大多數(shù))小數(shù)部分不能完全表示為二進制(基數(shù)為2)分數(shù)。
(2)影響
使得Python(或Perl,C,C ++,Java,F(xiàn)ortran和其他許多語言)經(jīng)常不顯示我們所期望的確切十進制數(shù)字。
(3)原因
如今,幾乎所有機器都使用IEEE-754浮點算法,并且?guī)缀跛衅脚_都將Python浮點數(shù)映射到IEEE-754“雙精度”。754個double包含53位精度,因此在輸入時,計算機會努力將浮點數(shù)轉(zhuǎn)換為J / 2 ** N形式的最接近分數(shù), 其中J是一個正好包含53位的整數(shù)。
2.'0.1'的具體分析
轉(zhuǎn)化目標:1 / 10 ~= J / (2 ** N)
所以:J ~= 2 ** N / 10
1)求解N
因為J是一個正好包含53位的整數(shù)(但是實際上最后我們用的是J的近似值( >=2 ** 52 and < 2 ** 53)是通過N計算出來的),并且N是一個整數(shù),所以我們可以得到N的最佳值是56
>>> 2**524503599627370496>>> 2**539007199254740992>>> 2**56/107205759403792793
2)求解我們要用的J的近似值
我們通過N來求解實際的J,我們實際上用的J其實是(2**N /10)四舍五入之后的值。
i)divmod(a, b)
功能: 接收兩個數(shù)字類型(非復數(shù))參數(shù),返回一個包含商和余數(shù)的元組(a // b, a % b)。
參數(shù):
a ? 被除數(shù)
b ? 除數(shù)
ii)求解J近似值
>>> q, r = divmod(2**56, 10)>>> r6
因為余數(shù)為6>5,所以我們用的J的近似值是
>>> q+1
7205759403792794
3)求解'0.1'的近似值
因此,在754倍精度中,最接近1/10的最佳近似值是
7205759403792794 / 72057594037927936
【注】由于我們四舍五入,因此實際上比1/10大一點;如果我們不進行四舍五入,則商將小于1/10。但是在任何情況下都不能完全是 1/10!
4)獲取計算機存儲值
通過上面的分析,我們可以看到計算機永遠不會“看到” 1/10:它看到的是上面給出的精確分數(shù),它可以得到的最佳754倍近似值(即J的近似值)
>>> .1 * 2**56
7205759403792794.0
如果我們將該分數(shù)乘以10 ** 30,我們可以看到其30個最高有效十進制數(shù)字的(截斷)值:
>>> 7205759403792794 * 10**30 // 2**56
100000000000000005551115123125L
在Python 2.7和Python 3.1之前的版本中,Python將該值四舍五入為17個有效數(shù)字,即為’0.10000000000000001’。
在最新版本中,Python會基于最短的十進制分數(shù)顯示一個值,該值會正確舍入為真實的二進制值,并僅得出’0.1’。
以上這篇淺談Python里面None True False之間的區(qū)別就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。
相關文章:
1. jsp網(wǎng)頁實現(xiàn)貪吃蛇小游戲2. SpringMVC+Jquery實現(xiàn)Ajax功能3. HTML5 Canvas繪制圖形從入門到精通4. JavaScript實現(xiàn)組件化和模塊化方法詳解5. .Net Core和RabbitMQ限制循環(huán)消費的方法6. ASP.NET MVC遍歷驗證ModelState的錯誤信息7. 淺談SpringMVC jsp前臺獲取參數(shù)的方式 EL表達式8. jsp+servlet簡單實現(xiàn)上傳文件功能(保存目錄改進)9. ASP中if語句、select 、while循環(huán)的使用方法10. asp(vbs)Rs.Open和Conn.Execute的詳解和區(qū)別及&H0001的說明
