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

          【Python】有趣且鮮為人知的 Python 特性,火了!

          共 4444字,需瀏覽 9分鐘

           ·

          2021-03-04 11:06

          小編最近逛Github發(fā)現(xiàn)了一個(gè)給力的Python項(xiàng)目,絕對(duì)能讓你傻眼!可以通過這個(gè)項(xiàng)目測(cè)試你對(duì)Python的熟悉程度!


          這個(gè)項(xiàng)目叫做 “What the f*ck Python! ??",主要????講一些有趣且鮮為人知的 Python 特性。????

          項(xiàng)目地址為:https://github.com/leisurelicht/wtfpython-cn


          來(lái)體會(huì)一些難以理解和反人類直覺的Python特性吧!


          >>> a = 256
          >>> b = 256
          >>> a is b
          True

          >>> a = 257
          >>> b = 257
          >>> a is b
          False

          >>> a = 257; b = 257
          >>> a is b
          True


          是我眼花了么?我動(dòng)手敲了下,確實(shí)是這樣...


          這是為啥呢?


          因?yàn)?256 是一個(gè)已經(jīng)存在的對(duì)象, 而 257 不是。

          大家可以想到256是2的8次方。

          當(dāng)Python開啟后,-5~256數(shù)字已經(jīng)分配好對(duì)象了,主要考慮這些數(shù)字經(jīng)常使用。

          引用自 https://docs.python.org/3/c-api/long.html

          可以再看看這個(gè)案例:

          >>> id(256)
          10922528
          >>> a = 256
          >>> b = 256
          >>> id(a)
          10922528
          >>> id(b)
          10922528
          >>> id(257)
          140084850247312
          >>> x = 257
          >>> y = 257
          >>> id(x)
          140084850247440
          >>> id(y)
          140084850247344


          大家都知道,在Python中通過id( )可以確定兩個(gè)變量存儲(chǔ)的內(nèi)容是否是同一個(gè),通過以上的代碼結(jié)果說(shuō)明創(chuàng)建了多個(gè)257對(duì)象。

          你以為到這就結(jié)束了么?并沒有

          再來(lái)繼續(xù)看這個(gè):

          >>> a, b = 257257
          >>> id(a)
          140640774013296
          >>> id(b)
          140640774013296
          >>> a = 257
          >>> b = 257
          >>> id(a)
          140640774013392
          >>> id(b)
          140640774013488


          這又觸及我的知識(shí)盲區(qū)了!這是為啥啊?

          揭曉答案吧!當(dāng)a和b在同一行被賦值為相同內(nèi)容時(shí),Python解釋器會(huì)創(chuàng)建一個(gè)變量,然后引用它(不新創(chuàng)建了!)。注意這是在交互式的環(huán)境中,屬于交互式環(huán)境的編譯器優(yōu)化。


          我們看下一個(gè)有趣的特性:


          # 我們先初始化一個(gè)變量row
          row = [""]*3 #row i['', '', '']
          # 并創(chuàng)建一個(gè)變量board
          board = [row]*3


          >>> board
          [[''''''], [''''''], ['''''']]
          >>> board[0]
          ['''''']
          >>> board[0][0]
          ''
          >>> board[0][0] = "X"
          >>> board
          [['X'''''], ['X'''''], ['X''''']]


          ???這是為啥呢,我明明只給一個(gè)位置賦值了“X”啊!

          大家應(yīng)該想到了原因!

          當(dāng)我們初始化時(shí):



          然后我們使用乘法初始化board變量時(shí),是這樣的:



          也就是說(shuō),這三行都引用了row的內(nèi)存空間。

          所以改變其中一個(gè)位置的值,也就改變了3個(gè)位置的值!

          為了避免引用相同位置內(nèi)容,可以采用以下方法:


          >>> board = [['']*3 for _ in range(3)]
          >>> board[0][0] = "X"
          >>> board
          [['X'''''], [''''''], ['''''']]


          接著看下個(gè)案例吧:


          神奇的三引號(hào)!


          >>> print('wtfpython''')
          wtfpython
          >>> print("wtfpython""")
          wtfpython
          >>> # 下面的語(yǔ)句會(huì)拋出 `SyntaxError` 異常
          >>> # print('''wtfpython')
          >>> # print("""wtfpython")


          補(bǔ)充個(gè)說(shuō)明,Python的隱式字符串連接:


          >>> print("wtf" "python")
          wtfpython
          >>> print("wtf" ""# or "wtf"""
          wtf


          思考一下再看答案!


          答案:''' 和 """ 在 Python中也是字符串定界符, Python 解釋器在先遇到三個(gè)引號(hào)的的時(shí)候會(huì)嘗試再尋找三個(gè)終止引號(hào)作為定界符, 如果不存在則會(huì)導(dǎo)致 SyntaxError 異常。


          我們?cè)賮?lái)看下一個(gè)例子:


          # 一個(gè)簡(jiǎn)單的例子, 統(tǒng)計(jì)下面可迭代對(duì)象中的布爾型值的個(gè)數(shù)和整型值的個(gè)數(shù)
          mixed_list = [False1.0"some_string"3True, [], False]
          integers_found_so_far = 0
          booleans_found_so_far = 0

          for item in mixed_list:
              if isinstance(item, int):
                  integers_found_so_far += 1
              elif isinstance(item, bool):
                  booleans_found_so_far += 1


          返回的結(jié)果是:


          >>> integers_found_so_far
          4
          >>> booleans_found_so_far
          0


          ???我的bool值都到哪去了?



          其實(shí),布爾值是int的子類,看下面這個(gè)就懂了:


          >>> isinstance(True, int)
          True
          >>> isinstance(False, int)
          True


          如果還沒理解,可以繼續(xù)往下看:


          another_dict = {}
          another_dict[True] = "JavaScript"
          another_dict[1] = "Ruby"
          another_dict[1.0] = "Python"


          >>> another_dict[True]
          "Python"


          True 的整數(shù)值是 1, 而 False 的整數(shù)值是 0。


          >>> True == 1 == 1.0 and False == 0 == 0.0
          True


          >>> some_bool = True
          >>> "wtf"*some_bool
          'wtf'
          >>> some_bool = False
          >>> "wtf"*some_bool
          ''


          還有很多Python神奇的特性,大家自己看這個(gè)項(xiàng)目吧~


          如果覺得項(xiàng)目作者寫的不錯(cuò),給他點(diǎn)亮star吧!

          往期精彩回顧





          本站qq群704220115,加入微信群請(qǐng)掃碼:

          瀏覽 87
          點(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>
                  精品日日| 加勒比无视频网站 | 中文字幕一区二区无码成人 | 东条中文在线 | 国产九色91 回来了 |