亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中浮點數的示例分析

發布時間:2021-08-25 11:17:54 來源:億速云 閱讀:207 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“Python中浮點數的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Python中浮點數的示例分析”這篇文章吧。

提到的部分問題,讀者們可以先思考下:

  • 若兩個元組相等,即 a==b 且 a is b,那么相同索引的元素(如 a[0] 、b[0])是否必然相等呢?

  • 若兩個對象的 hash 結果相等,即 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() 是個內置函數,可以將入參構造成一個浮點數。

為什么會這樣呢?先查閱一下文檔,這個內置函數的解析規則是:

sign      ::= "+" | "-"
infinity    ::= "Infinity" | "inf"
nan      ::= "nan"
numeric_value ::= floatnumber | infinity | nan
numeric_string ::= [sign] numeric_value

它在解析時,可以解析前后的空格、前綴的加減號(+/-)、浮點數,除此之外,還可以解析兩類字符串(不區分大小寫):"Infinity"或"inf",表示無窮大數;“nan”,表示不是數(not-a-number),確切地說,指的是除了數以外的所有東西。

前面分享的第一個冷知識就跟“nan”有關,作為整體,兩個元組相等,但是它們唯一的元素卻不相等。之所以會這樣,因為“nan”表示除了數以外的東西,它是一個范圍,所以不可比較。

作為對比,我們來看看兩個“無窮大的浮點數”是什么結果:

>>> a = (float('inf'),)
>>> b = a
>>> a  # (inf,)
>>> b  # (inf,)

>>> a == b # True
>>> a is b # True
>>> a[0] == b[0] # True

注意最后一次比較,它跟前面的兩個元組恰好相反,由此,我們可以得出結論:兩個無窮大的浮點數,數值相等,而兩個“不是數的東西”,數值不相等。

化簡一下,可以這樣看:

>>> 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

前面剛說了兩個“不是數的東西”不相等,這里卻顯示它們的哈希結果相等,這挺違背常理的。

我們可以推理出一條簡單的結論:不相等的兩個對象,其哈希結果可能相等。

原因在于,hash(float('nan')) 的結果等于 0,它是個固定值,作比較時當然就相等了。

其實,關于 hash() 函數,還埋了一個彩蛋:

>>> hash(float('inf')) # 314159
>>> hash(float('-inf')) # -314159

有沒有覺得這個數值很熟悉啊?它正是圓周率的前五位 3.14159,去除小數點后的結果。在早期的 Python 版本中,負無窮大數的哈希結果其實是 -271828,正是取自于自然對數 e。這兩個數都是硬編碼在 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() 取浮點數時,Python 允許了 nan(不是數)的存在,它表示不確切的存在,所以導致了這些奇怪的結果。

最后,我們作下小結:

  • 包含 float('nan') 的兩個元組,當做整體作比較時,結果相等;兩個相等的元組,其對位的元素可能不相等

  • float('nan') 表示一個“不是數”的東西,它本身不是確定值,兩個對象作比較時不相等,但是其哈希結果是固定值,作比較時相等;可用作字典的鍵值,而且是不沖突的鍵值

  • float('inf') 表示一個無窮大的浮點數,可看作確定的值,兩個對象做比較時相等,其哈希結果也相等;可用作字典的鍵值,但是會產生沖突

  • float('nan') 的哈希結果為 0,float('inf') 的哈希結果為 314159

以上是“Python中浮點數的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

齐齐哈尔市| 望江县| 嘉黎县| 惠来县| 蓬溪县| 罗甸县| 林芝县| 县级市| 洪江市| 如东县| 察雅县| 陆良县| 靖远县| 上饶市| 和硕县| 孝昌县| 长子县| 永康市| 城口县| 宣武区| 金湖县| 武功县| 柞水县| 武义县| 河南省| 潮州市| 清新县| 新乐市| 乳源| 开阳县| 专栏| 吉首市| 靖安县| 七台河市| 东乌珠穆沁旗| 加查县| 永新县| 张家口市| 馆陶县| 湘阴县| 资兴市|