<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          來挑戰(zhàn)下這 10 個(gè) Python 問題

          共 3974字,需瀏覽 8分鐘

           ·

          2022-05-21 11:30

          你好,我是征哥,Python 很容易入門,但卻不易精通,即使對有經(jīng)驗(yàn)的工程師,某些現(xiàn)象也是反直覺的,以下這 10 個(gè)問題就非常有趣,且有一定的挑戰(zhàn)性,結(jié)果可能會讓你感到困惑,來看看你能回答正確幾個(gè)?

          這里先給出題目,最后給出答案,建議先拿個(gè)紙,寫下你的答案,最后再驗(yàn)證。

          請寫出以下代碼的輸出結(jié)果:

          1、懶惰的 Python

          class?A:
          ????def?function(self):
          ????????return?A()
          a?=?A()
          A?=?int
          print(a.function())

          2、四舍五入

          >>> round(7?/?2)
          >>>?round(3?/?2)
          >>>?round(5?/?2)

          3、type 和 object

          >>>?isinstance(type,?object)
          >>>?isinstance(object,?type)
          >>>?isinstance(object,?object)
          >>>?isinstance(type,?type)

          4、空的布爾值

          >>>?any([])
          >>>?all([])

          5、類內(nèi)部函數(shù)的優(yōu)先級

          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)

          6、求和

          >>>?sum("")
          >>>?sum("",?[])
          >>>?sum("",?{})

          7、意外的屬性

          >>>?sum([
          ????el.imag?
          ????for?el?in?[
          ????????0,?5,?10e9,?float('inf'),?float('nan')
          ????]
          ])

          8、輸出負(fù)數(shù)倍的字符串

          >>>?"this?is?a?very?long?string"?*?(-1)

          9、見過負(fù)數(shù)的 0

          max(-0.0,?0.0)

          10、違反數(shù)學(xué)規(guī)則

          >>>?x?=?(1?<53)?+?1
          >>>?x?+?1.0?>?x

          答案與解釋

          以下結(jié)果均在 Python 3.8.5 版本驗(yàn)證過。

          1、懶惰的 Python

          class?A:
          ????def?function(self):
          ????????return?A()
          a?=?A()
          A?=?int
          print(a.function())

          正確的結(jié)果是 0:

          這個(gè)不難,因?yàn)?Python 的函數(shù)定義其實(shí)是可執(zhí)行語句,函數(shù)在被調(diào)用前都是不存在的,實(shí)際調(diào)用時(shí)才會綁定變量。

          在上面的示例中,在函數(shù)定義期間,Python 允許引用尚未定義的類或函數(shù)。但是,在執(zhí)行期間,A 已經(jīng)是 int 類,這意味著函數(shù)方法將返回一個(gè)新創(chuàng)建的 int 實(shí)例,int 實(shí)例的默認(rèn)值就是 0。

          如果沒有 A = int,結(jié)果就是:

          2、四舍五入

          >>>?round(7/2)
          4
          >>>?round(3/2)
          2
          >>>?round(5/2)
          2

          正確的結(jié)果是 4 2 2,你肯定覺得最后的 round(2.5) == 2 有點(diǎn)違反數(shù)學(xué)規(guī)則,這是因?yàn)?Python 的 round 方法實(shí)現(xiàn)了銀行家的四舍五入[1],其中所有半值將四舍五入到最接近的偶數(shù)。

          3、type 和 object

          >>>?isinstance(type,?object)
          True
          >>>?isinstance(object,?type)
          True
          >>>?isinstance(object,?object)
          True
          >>>?isinstance(type,?type)
          True
          >>>

          都是 True,有點(diǎn)懷疑 object 和 true 是不是一個(gè)東西?

          在 Python 中,一切都是對象,因此對對象的任何實(shí)例檢查都將返回 True

          isinstance(Anything,?object)?#=> True。

          type 表示用于構(gòu)造所有 Python 類型的元類。因此,所有類型:int、str、object 都是 type 類的實(shí)例,就像 python 中的所有對象一樣,它也是一個(gè)對象。但 type 是 Python 中唯一是它自身的一個(gè)實(shí)例的對象。

          >>>?type(1)
          <class?'int'>
          >>>?type(int)
          <class?'type'>
          >>>?type(type)
          <class?'type'>
          >>>?

          4、空的布爾值

          >>>?any([])
          False
          >>>?all([])
          True
          >>>?any([True,False])
          True
          >>>?all([True,False])
          False
          >>>?

          當(dāng)參數(shù)是空列表的時(shí)候,any 和 all 的結(jié)果有點(diǎn)出乎意料。但是明白了它的檢查邏輯,就合情合理了:

          Python 中的邏輯運(yùn)算符是惰性的,any 的算法是尋找第一次出現(xiàn)為真的元素,如果沒有找到,則返回 False,由于序列為空,因此沒有元素可以為真,因此 any([]) 返回 False。

          同樣的,all 算法是查找第一個(gè)為假的元素,如果沒有找到,則返回 True,由于空序列中沒有假的元素,所以 all([]) 返回 True,是不是有點(diǎn)空洞真理的概念?

          5、類內(nèi)部函數(shù)的優(yōu)先級

          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í)例級別 > 類級別 > 父類級別,上面的代碼,在初始化時(shí)綁定的函數(shù)就是實(shí)例級別,在類內(nèi)部定義的就是類級別。

          但是雙下劃線包裹的魔法函數(shù)不在這個(gè)規(guī)則之內(nèi),也就是說 Python 優(yōu)先查找類級別的魔法函數(shù)。

          如果說把雙下劃線去掉,那么結(jié)果就是 26 啦:

          6、求和

          >>>?sum("")
          0
          >>>?sum("",?[])
          []
          >>>?sum("",?{})
          {}

          為了搞清楚這里發(fā)生了什么,我們需要檢查 sum 函數(shù)的簽名:

          sum(iterable,?/,?start=0)

          sum 從左到右開始求和可迭代的項(xiàng)目,并返回總數(shù)。iterable 一般是數(shù)字,起始值不允許是字符串。

          在上述所有情況下,空字符串都被視為空序列,因此 sum 將簡單地將起始參數(shù)作為總結(jié)果返回。在第一種情況下,它默認(rèn)為零,對于第二種和第三種情況,它意味著空列表和字典作為開始參數(shù)傳入。

          7、意外的屬性

          >>>?sum([
          ...?????el.imag
          ...?????for?el?in?[
          ...?????????0,?5,?10e9,?float('inf'),?float('nan')
          ...?????]
          ...?])
          0.0

          正確的結(jié)果:0.0。

          上面的代碼有個(gè) imag 屬性,但是我們根本沒有定義它,運(yùn)行也沒有報(bào)錯(cuò),怎么回事呢?

          這是因?yàn)?Python 中的所有數(shù)值類型(int、real、float)都繼承自基對象類,它們都支持 real 和 imag 屬性,分別返回實(shí)部和虛部。這也包括 Infinity 和 NaN。

          8、輸出負(fù)數(shù)倍的字符串

          >>>?"this?is?a?very?long?string"?*?(-1)
          ''
          >>>

          正確的結(jié)果是 '',所有的負(fù)數(shù)倍的字符串,都當(dāng)作 0 倍,返回 ''。

          9、見過負(fù)數(shù)的 0.0

          max(-0.0,?0.0)

          為什么會這樣?出現(xiàn)這種情況是由于兩個(gè)原因。負(fù)零和零在 Python 中被視為相等。max 的邏輯是,如果多個(gè)最大值,返回遇到的第一個(gè)。因此 max 函數(shù)返回第一次出現(xiàn)的零,它恰好是負(fù)數(shù)。

          10、違反數(shù)學(xué)規(guī)則

          >>>?x?=?(1?<53)?+?1
          >>>?x?+?1.0?>?x
          False

          正確的結(jié)果是 False,這違反了數(shù)學(xué)規(guī)則啊,為什么呢?

          這種違反直覺的行為歸咎于三件事:長算術(shù)、浮點(diǎn)精度限制和數(shù)值比較。

          Python 可以支持非常大的整數(shù),如果隱式超過限制則切換計(jì)算模式,但 Python 中的浮點(diǎn)精度是有限的。

          2?3?+?1?=?9007199254740993

          是不能完全表示為 Python 浮點(diǎn)數(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í)并不會拋出錯(cuò)誤,也不會嘗試將兩個(gè)操作數(shù)轉(zhuǎn)換為相同的類型。相反,他們比較實(shí)際的數(shù)值。因?yàn)?9007199254740992.0 比 9007199254740993 小,因此 Python 返回 False。

          參考資料

          [1]

          銀行家的四舍五入:?https://en.wikipedia.org/wiki/Rounding#Round_half_to_even


          往期推薦
          1、Python中堪稱神仙的6個(gè)內(nèi)置函數(shù)
          2、用 Python 遠(yuǎn)程控制 Windows 服務(wù)器,太好用了!
          3、神器!竟能把圖片視頻無損清晰放大N倍!
          4、Python 字符串深度總結(jié)
          5、瀏覽器可以運(yùn)行 Python 代碼了,Python 也許會變成前后端通吃的語言
          點(diǎn)擊關(guān)注公眾號,閱讀更多精彩內(nèi)容
          瀏覽 42
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天中文字幕 | 伊人大香蕉75 | 五月婷婷第四色 | 国产精品三级在线观看 | 国产高潮视频 |