您好,登錄后才能下訂單哦!
今天小編給大家分享一下Python問題怎么解決的相關(guān)知識點,內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
class A: def function(self): return A() a = A() A = int print(a.function())
>>> round(7 / 2) >>> round(3 / 2) >>> round(5 / 2)
>>> isinstance(type, object) >>> isinstance(object, type) >>> isinstance(object, object) >>> isinstance(type, type)
>>> any([]) >>> all([])
class A: answer = 42 def __init__(self): self.answer = 21 self.__add__ = lambda x, y: x.answer + y def __add__(self, y): return self.answer - y print(A() + 5)
>>> sum("") >>> sum("", []) >>> sum("", {})
>>> sum([ el.imag for el in [ 0, 5, 10e9, float('inf'), float('nan') ] ])
>>> "this is a very long string" * (-1)
max(-0.0, 0.0)
>>> x = (1 << 53) + 1 >>> x + 1.0 > x
以下結(jié)果均在 Python 3.8.5 版本驗證過。
class A: def function(self): return A() a = A() A = int print(a.function())
正確的結(jié)果是 0:
這個不難,因為 Python 的函數(shù)定義其實是可執(zhí)行語句,函數(shù)在被調(diào)用前都是不存在的,實際調(diào)用時才會綁定變量。
在上面的示例中,在函數(shù)定義期間,Python 允許引用尚未定義的類或函數(shù)。但是,在執(zhí)行期間,A 已經(jīng)是 int 類,這意味著函數(shù)方法將返回一個新創(chuàng)建的 int 實例,int 實例的默認(rèn)值就是 0。
如果沒有 A = int,結(jié)果就是:
>>> round(7/2) 4 >>> round(3/2) 2 >>> round(5/2) 2
正確的結(jié)果是 4 2 2,你肯定覺得最后的 round(2.5) == 2 有點違反數(shù)學(xué)規(guī)則,這是因為 Python 的 round 方法實現(xiàn)了銀行家的四舍五入[1],其中所有半值將四舍五入到最接近的偶數(shù)。
>>> isinstance(type, object) True >>> isinstance(object, type) True >>> isinstance(object, object) True >>> isinstance(type, type) True >>>
都是 True,有點懷疑 object 和 true 是不是一個東西?
在 Python 中,一切都是對象,因此對對象的任何實例檢查都將返回 True。
isinstance(Anything, object) #=> True。
type 表示用于構(gòu)造所有 Python 類型的元類。因此,所有類型:int、str、object 都是 type 類的實例,就像 python 中的所有對象一樣,它也是一個對象。但 type 是 Python 中唯一的是它自身的一個實例的對象。
>>> type(1)>>> type(int)>>> type(type)>>>
>>> any([]) False >>> all([]) True >>> any([True,False]) True >>> all([True,False]) False >>>
當(dāng)參數(shù)是空列表的時候,any 和 all 的結(jié)果有點出乎意料。但是明白了它的檢查邏輯,就合情合理了:
Python 中的邏輯運算符是惰性的,any 的算法是尋找第一次出現(xiàn)為真元素,如果沒有找到,則返回 False,由于序列為空,因此沒有元素可以為真,因此 any([]) 返回 False。
同樣的,all 算法是查找第一個 false 元素,如果沒有找到,則返回 True,由于空序列中沒有假元素,所以 all([]) 返回 True,是不是有點空洞真理概念?
class A: answer = 42 def __init__(self): self.answer = 21 self.__add__ = lambda x, y: x.answer + y def __add__(self, y): return self.answer - y print(A() + 5)
正確的結(jié)果是:16:
對象函數(shù)的查找順序是:實例級別 > 類級別 > 父類級別,上面的代碼,在初始化時綁定的函數(shù)就是實例級別,在類內(nèi)部定義的就是類級別。
但是雙下劃線包裹的魔法函數(shù)不在這個規(guī)則之內(nèi),也就是說 Python 優(yōu)先查找類級別的魔法函數(shù)。
如果說把雙下劃線去掉,那么結(jié)果就是 26 啦:
>>> sum("") 0 >>> sum("", []) [] >>> sum("", {}) {}
為了搞清楚這里發(fā)生了什么,我們需要檢查 sum 函數(shù)的簽名:
sum(iterable, /, start=0)
sum 從左到右開始求和可迭代的項目,并返回總數(shù)。iterable 一般是數(shù)字,起始值不允許是字符串。
在上述所有情況下,空字符串都被視為空序列,因此 sum 將簡單地將起始參數(shù)作為總結(jié)果返回。在第一種情況下,它默認(rèn)為零,對于第二種和第三種情況,它意味著空列表和字典作為開始參數(shù)傳入。
>>> sum([ ... el.imag ... for el in [ ... 0, 5, 10e9, float('inf'), float('nan') ... ] ... ]) 0.0
上面的代碼有個 imag 屬性,但是我們根本沒有定義它,運行也沒有報錯,怎么回事呢?
這是因為 Python 中的所有數(shù)值類型(int、real、float)都繼承自基對象類,它們都支持 real 和 imag 屬性,分別返回實部和虛部。這也包括 Infinity 和 NaN。
>>> "this is a very long string" * (-1) '' >>>
正確的結(jié)果是 '',所有的負(fù)數(shù)倍的字符串,都當(dāng)作 0 倍,返回 ''。
max(-0.0, 0.0)
為什么會這樣?出現(xiàn)這種情況是由于兩個原因。負(fù)零和零在 Python 中被視為相等。max 的邏輯是,如果多個最大值,返回遇到的第一個。因此 max 函數(shù)返回第一次出現(xiàn)的零,它恰好是負(fù)數(shù)。
>>> x = (1 << 53) + 1 >>> x + 1.0 > x False
正確的結(jié)果是 False,這違反了數(shù)學(xué)規(guī)則啊,為什么呢?
這種違反直覺的行為歸咎于三件事:長算術(shù)、浮點精度限制和數(shù)值比較。
Python 可以支持非常大的整數(shù),如果隱式超過限制則切換計算模式,但 Python 中的浮點精度是有限的。
2?3 + 1 = 9007199254740993
是不能完全表示為 Python 浮點數(shù)的最小整數(shù)。因此,為了執(zhí)行加 1.0,Python 將 9007199254740993 轉(zhuǎn)換為 float,將其四舍五入為 Python 可以表示的 9007199254740992.0,然后向其添加 1.0,但由于相同的表示限制,它將其設(shè)置回 9007199254740992.0:
>>> float(9007199254740993) 9007199254740992.0 >>> 9007199254740992.0 + 1.0 9007199254740992.0 >>>
此外 Python 在 float 與 int 比較時并不會拋出錯誤,也不會嘗試將兩個操作數(shù)轉(zhuǎn)換為相同的類型。相反,他們比較實際的數(shù)值。因為 9007199254740992.0 比 9007199254740993 小,因此 Python 返回 False。
以上就是“Python問題怎么解決”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。