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

          共 3823字,需瀏覽 8分鐘

           ·

          2022-05-29 08:10

          ↑?關(guān)注 + 星標(biāo)?,每天學(xué)Python新技能

          后臺(tái)回復(fù)【大禮包】送你Python自學(xué)大禮包

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

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

          請(qǐng)寫出以下代碼的輸出結(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)先級(jí)

          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í)行語(yǔ)句,函數(shù)在被調(diào)用前都是不存在的,實(shí)際調(diào)用時(shí)才會(huì)綁定變量。

          在上面的示例中,在函數(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 中,一切都是對(duì)象,因此對(duì)對(duì)象的任何實(shí)例檢查都將返回 True

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

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

          >>>?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)先級(jí)

          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

          對(duì)象函數(shù)的查找順序是:實(shí)例級(jí)別 > 類級(jí)別 > 父類級(jí)別,上面的代碼,在初始化時(shí)綁定的函數(shù)就是實(shí)例級(jí)別,在類內(nèi)部定義的就是類級(jí)別。

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

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

          6、求和

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

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

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

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

          在上述所有情況下,空字符串都被視為空序列,因此 sum 將簡(jiǎn)單地將起始參數(shù)作為總結(jié)果返回。在第一種情況下,它默認(rèn)為零,對(duì)于第二種和第三種情況,它意味著空列表和字典作為開始參數(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)都繼承自基對(duì)象類,它們都支持 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)

          為什么會(huì)這樣?出現(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ī)則啊,為什么呢?

          這種違反直覺的行為歸咎于三件事:長(zhǎng)算術(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í)并不會(huì)拋出錯(cuò)誤,也不會(huì)嘗試將兩個(gè)操作數(shù)轉(zhuǎn)換為相同的類型。相反,他們比較實(shí)際的數(shù)值。因?yàn)?9007199254740992.0 比 9007199254740993 小,因此 Python 返回 False。


          1. 秋招拿了7個(gè)offer,分享一些反思和經(jīng)驗(yàn)

          2. 9個(gè)很酷的CMD命令,你要知道!


          瀏覽 60
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(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>
                  在线成人av| 国产在视频一区二区三区吞精 | www第一页 | 久久高清无码视频 | 97成人资源站 |