<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 中那些令人防不勝防的坑

          共 3263字,需瀏覽 7分鐘

           ·

          2020-01-12 23:22

          c5c6bc3f4440a5b1e70f35d4dccf36e5.webp


          ? ? ?作者:Rocky0429


          ? ? ?來源:Python空間



          b3f45be4010439275711ce3ca0f09998.webp



          大家好,我是 Rocky0429,一個正在學習 Python 的蒟蒻...


          在學習 Python 的過程中,我為它的簡潔優(yōu)雅而癡迷,但它又是如此的調(diào)皮,在提供了很多舒服的功能特性之外,又悄悄挖了很多帶有迷惑性的坑,令人防不勝防...

          人不能兩次踏入同一條河流,在無數(shù)次踩進同樣的坑里之后,我覺得我有必要整理一下,一為自警,二為給大家提個醒,希望你不要和我犯相同的錯誤。
          這會是一個系列,每篇 5 個,系列文章更新不定,不想錯過的,記得點個關注,不迷路。

          5cf1f7728493747b4fc01a12e40aa41f.webp

          0x00 走丟的外部變量

          首先我們先來看這么一個例子:


          e =?429

          try:
          ? ?raise?Exception()
          except?Exception?as?e:
          ? ?pass

          print(e)


          PS:except Exception as e?可以捕獲除了與程序退出(sys.exit())相關之外的所有異常。


          在繼續(xù)向下看之前,你可以先思考一下上述例子可能出現(xiàn)的結(jié)果是什么,也可以自己嘗試著在編譯器里輸入一下。思考完了請繼續(xù)往下看。


          出現(xiàn)的結(jié)果如下:


          Traceback (most recent?call?last):
          ?File?"test.py", line?8,?in?<module>
          ? ?print(e)
          NameError:?name?'e'?is?not?defined


          竟然報錯了,那么這到底是為什么呢?


          其實這是因為在 Python3 中使用 as 分配異常的時候,在 except 的末尾將會把這個異常清除掉(在 Python2 中則不會出現(xiàn)這樣的情況)。這就好像將上面的示例變成下面的樣子:


          e =?429

          try:
          ? ?raise?Exception()
          except?Exception?as?e:
          ? ?try:
          ? ? ? ?pass
          ? ?finally:
          ? ? ? ?del?e

          print(e)


          通過上面的變形代碼,我們可以很清楚的看明白發(fā)生這一切的根源是什么:因為 e 被刪除了。這也變相的告訴我們,如果想要在 except 后面引用 e,必須將它先賦值給其它變量


          這樣看來,是變量 e 執(zhí)行了 except 子句而被刪除,但是為什么 e 會去執(zhí)行 except 子句呢?僅僅是因為 e 和 as 后面的 e 長的一毛一樣?


          答案是否定的,其實這個是因為子句在 Python 中沒有獨立的作用域,所以上述示例中的所有內(nèi)容都處于同一個作用域里,所以變量 e 會因為執(zhí)行了 except 子句而被刪除。



          0x01?同樣是加,卻不一定等價

          在我們來表示「加」這個概念的時候,一般我們會用兩種方式:a = a + b或者是 a += b 。在很多人的概念里這兩個其實就是一種,不分彼此,比如之前我就是這么認為的,直到有一天有人拿著下面的坑過來讓我踩...


          首先我們先來看第一個例子:


          >>> a = [1,2,3]
          >>> b = a
          >>> a = a + [4,5,6]


          一個很簡單的例子,你知道此時的 a 和 b 分別是多少么?請先自己思考一下再繼續(xù)向下看:


          >>> a
          [1, 2, 3, 4, 5, 6]
          >>> b
          [1, 2, 3]


          估計很多人都會答對,表達式 a = a + [4,5,6] ,等號右邊其實是形成了一個新的列表,最后讓 a 引用了這個新的列表,而 b = a 引用的是之前的 a,所以 b 保持不變。


          明白了上面的例子,我們接下來再看一個稍微有點區(qū)別的例子:


          >>> a = [1,2,3]
          >>> b = a
          >>> a += [4,5,6]


          上面的例子和文章開頭的例子區(qū)別在從 + 變成了 +=,按照我們慣性思維去想,肯定以為這倆例子就是一個東西的兩種不同寫法而已,可實際上真的是這樣嗎?讓我們來看一下此時的 a,b:


          >>> a
          [1, 2, 3, 4, 5, 6]
          >>> b
          [1, 2, 3, 4, 5, 6]


          咦?同樣是印象里的「加」,好像真的哪里有點不一樣誒。。


          通過上面我們就可以看出 a = a + b 和 a += b 并不總是表現(xiàn)相同,起碼在列表上就是這么表現(xiàn)的。在這里的 a += [4,5,6] 實際上使用的是?extend?函數(shù),所以 a 和 b 仍然指向已被修改的同一列表。?


          既然在這里說到了 + 和 +=,索性再多補充一點:在使用「加」的概念來連接字符串的時候,+= 其實比 + 的速度更快?


          下面我們來實際的演示一下用 + 連接三個字符串:


          >>> import timeit
          >>> timeit.timeit("a = a + b + c", setup="a='a'*10000;b='b'*10000;c='c'*10000",number=100)
          0.07921688999340404
          >>> timeit.timeit("a += b + c", setup="a='a'*10000;b='b'*10000;c='c'*10000",number=100)
          0.002059974998701364


          上面的兩個結(jié)果很容易看出來,在處理速度上,+= 比 + 處理的速度要快的多。出現(xiàn)這樣現(xiàn)象的原因是 += 執(zhí)行的是追加操作,追加操作的話就會比 + 少了一個銷毀然后新建的動作,比如在 a += b + c 上 a 就不會被銷毀。



          0x02?不一般的小括號


          很多學過別的編程語言的同學,很容易會忽略小括號?“()” 在 Python 中的一個重要表現(xiàn),那就是小括號還能表示“元組”?這一不可變數(shù)據(jù)類型


          >>> type(())
          <class?'tuple'>
          >>> tur = (1, 2)
          >>> type(tur)
          <class?'tuple'>


          但是如果小括號內(nèi)只有一個元素的話,比如像下面這樣,它就是小括號內(nèi)的元素類型:


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


          天吶個天...


          那么如果想要表示一個元素的元組咋整呢?要像下面這樣:


          >>> tur = (1, )
          >>> type(tur)
          <class?'tuple'>


          加個逗號 “,” 就 ok 啦...
          11df0bda282f9e22ea946838c0782bdd.webp


          0x03 列表的刪除沒有那么簡單

          假如我們有一個列表,我想刪除列表中的元素:
          >>> lst = [1, 2, 3, 4, 5]
          >>> for?i in?lst:
          ... lst.remove(i)


          在剛開始學習 Python 之初,這是很多同學容易想到的做法,然而我們來看一下程序運行完以后的結(jié)果:

          >>> lst
          [2, 4]


          看到這個結(jié)果,我...
          fca66d01a607e1ff93af04e4d3ff29ac.webp
          這是為啥子呢?是因為在 for 循環(huán)中,如果我們刪除了 index =?0 (即 1)的值,原本 index = 1 ?及其之后的值會向前補位,所以當前 index = 1 的值為之前 index = 2 的值。
          列表的刪除操作我們經(jīng)常要用,所以大家要打起十二分的精神來對它。

          0x04? is not 不分家
          is not 在 Python 中是一伙的,用的時候要靠在一起,分開以后就是兩個東西,結(jié)果會不一樣...
          >>> [1, 2, 3] is?not?None
          True
          >>> [1, 2, 3] is?(not?None)
          False


          這就在于,is not?是個單獨的二元運算符,當它兩側(cè)的變量指向同一個對象的時候,結(jié)果為 False,否則結(jié)果為 True,希望引起大家的注意...

          看完有所收獲?點個在看,讓更多人可以看到~謝謝啦


          今天的分享就到這,拜里個拜~


          ◆?◆?◆ ?◆?



          長按二維碼關注我們



          數(shù)據(jù)森麟公眾號的交流群已經(jīng)建立,許多小伙伴已經(jīng)加入其中,感謝大家的支持。大家可以在群里交流關于數(shù)據(jù)分析&數(shù)據(jù)挖掘的相關內(nèi)容,還沒有加入的小伙伴可以掃描下方管理員二維碼,進群前一定要關注公眾號奧,關注后讓管理員幫忙拉進群,期待大家的加入。


          管理員二維碼:


          猜你喜歡

          ?笑死人不償命的知乎沙雕問題排行榜

          ?用Python扒出B站那些“驚為天人”的阿婆主!

          ?互聯(lián)網(wǎng)大佬學歷&背景大揭秘,看看是你的老鄉(xiāng)還是校友

          ?上萬條數(shù)據(jù)撕開微博熱搜的真相!

          ?你相信逛B站也能學編程嗎??

          瀏覽 42
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  亚洲色撸撸视频图片 | 国产美国黄色毛片 | 三级在线视频播放 | 奇米888四色成人影视色区 | 国产成人无码AV一区二区网站 |