這篇文章主要為大家展示了“Python中浮點數(shù)的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Python中浮點數(shù)的示例分析”這篇文章吧。
建陽ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!提到的部分問題,讀者們可以先思考下:
若兩個元組相等,即 a==b 且 a is b,那么相同索引的元素(如 a[0] 、b[0])是否必然相等呢?
若兩個對象的 hash 結(jié)果相等,即 hash(a) == hash(b),那么它們是否必然相等呢?
答案當然都為否(不然就不叫冷知識了),大家可以先嘗試回答一下,然后再往下看。
-----思考分割線-----
好了,先來看看第一個問題。兩個相同的元組 a、b,它們有如下的關系:
>>> a = (float('nan'),) >>> b = a >>> a # (nan,) >>> b # (nan,) >>> type(a), type(b) (<type 'tuple'>, <type 'tuple'>) >>> a == b True >>> a is b # 即 id(a) == id(b) True >>> a[0] == b[0] False
以上代碼表明:a 等于 b(類型、值與 id 都相等),但是它們的對位元素卻不相等。
兩個元組都只有一個元素(逗號后面沒有別的元素,這是單元素的元組的表示方法,即 len(a)==1 )。float() 是個內(nèi)置函數(shù),可以將入?yún)?gòu)造成一個浮點數(shù)。
為什么會這樣呢?先查閱一下文檔,這個內(nèi)置函數(shù)的解析規(guī)則是:
sign ::= "+" | "-" infinity ::= "Infinity" | "inf" nan ::= "nan" numeric_value ::= floatnumber | infinity | nan numeric_string ::= [sign] numeric_value
它在解析時,可以解析前后的空格、前綴的加減號(+/-)、浮點數(shù),除此之外,還可以解析兩類字符串(不區(qū)分大小寫):"Infinity"或"inf",表示無窮大數(shù);“nan”,表示不是數(shù)(not-a-number),確切地說,指的是除了數(shù)以外的所有東西。
前面分享的第一個冷知識就跟“nan”有關,作為整體,兩個元組相等,但是它們唯一的元素卻不相等。之所以會這樣,因為“nan”表示除了數(shù)以外的東西,它是一個范圍,所以不可比較。
作為對比,我們來看看兩個“無窮大的浮點數(shù)”是什么結(jié)果:
>>> a = (float('inf'),) >>> b = a >>> a # (inf,) >>> b # (inf,) >>> a == b # True >>> a is b # True >>> a[0] == b[0] # True
注意最后一次比較,它跟前面的兩個元組恰好相反,由此,我們可以得出結(jié)論:兩個無窮大的浮點數(shù),數(shù)值相等,而兩個“不是數(shù)的東西”,數(shù)值不相等。
化簡一下,可以這樣看:
>>> a = float('inf') >>> b = float('inf') >>> c = float('nan') >>> d = float('nan') >>> a == b # True >>> c == d # False
以上就是第一個冷知識的揭秘。接著看第二個:
>>> hash(float('nan')) == hash(float('nan')) True
前面剛說了兩個“不是數(shù)的東西”不相等,這里卻顯示它們的哈希結(jié)果相等,這挺違背常理的。
我們可以推理出一條簡單的結(jié)論:不相等的兩個對象,其哈希結(jié)果可能相等。
原因在于,hash(float('nan')) 的結(jié)果等于 0,它是個固定值,作比較時當然就相等了。
其實,關于 hash() 函數(shù),還埋了一個彩蛋:
>>> hash(float('inf')) # 314159 >>> hash(float('-inf')) # -314159
有沒有覺得這個數(shù)值很熟悉?。克菆A周率的前五位 3.14159,去除小數(shù)點后的結(jié)果。在早期的 Python 版本中,負無窮大數(shù)的哈希結(jié)果其實是 -271828,正是取自于自然對數(shù) e。這兩個數(shù)都是硬編碼在 Python 解釋器中的,算是某種致敬吧。
由于 float('nan') 的哈希值相等,這通常意味著它們不可以作為字典的不同鍵值,但是事實卻出人意料:
>>> a = {float('nan'): 1, float('nan'): 2} >>> a {nan: 1, nan: 2} # 作為對比: >>> b = {float('inf'): 1, float('inf'): 2} >>> b {inf: 2}
如上所示,兩個 nan 鍵值在表示上一模一樣(注意,它們沒有用引號括起來),它們可以共存,而 inf 卻只能歸并成一個,再次展示出了 nan 的神奇。
好了,兩個很冷的小知識分享完畢,背后的原因都在于 float() 取浮點數(shù)時,Python 允許了 nan(不是數(shù))的存在,它表示不確切的存在,所以導致了這些奇怪的結(jié)果。
最后,我們作下小結(jié):
包含 float('nan') 的兩個元組,當做整體作比較時,結(jié)果相等;兩個相等的元組,其對位的元素可能不相等
float('nan') 表示一個“不是數(shù)”的東西,它本身不是確定值,兩個對象作比較時不相等,但是其哈希結(jié)果是固定值,作比較時相等;可用作字典的鍵值,而且是不沖突的鍵值
float('inf') 表示一個無窮大的浮點數(shù),可看作確定的值,兩個對象做比較時相等,其哈希結(jié)果也相等;可用作字典的鍵值,但是會產(chǎn)生沖突
float('nan') 的哈希結(jié)果為 0,float('inf') 的哈希結(jié)果為 314159
以上是“Python中浮點數(shù)的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)頁標題:Python中浮點數(shù)的示例分析-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://jinyejixie.com/article4/ccpjie.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供虛擬主機、電子商務、移動網(wǎng)站建設、網(wǎng)站收錄、定制網(wǎng)站、網(wǎng)頁設計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容