开心六月综合激情婷婷|欧美精品成人动漫二区|国产中文字幕综合色|亚洲人在线成视频

    1. 
      
        <b id="zqfy3"><legend id="zqfy3"><fieldset id="zqfy3"></fieldset></legend></b>
          <ul id="zqfy3"></ul>
          <blockquote id="zqfy3"><strong id="zqfy3"><dfn id="zqfy3"></dfn></strong></blockquote>
          <blockquote id="zqfy3"><legend id="zqfy3"></legend></blockquote>
          打開(kāi)APP
          userphoto
          未登錄

          開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

          開(kāi)通VIP
          Python最差實(shí)踐

          題圖:Photo by Andrew Ridley on Unsplash

          設(shè)計(jì)模式是前人多年總結(jié)出來(lái)的經(jīng)驗(yàn),而反設(shè)計(jì)模式(Anti-Pattern)就是那些違反正確方式寫(xiě)代碼的方法,往往這樣的代碼從可讀性、安全性、正確性等方面都有問(wèn)題。今天列一些平時(shí)寫(xiě)代碼的壞習(xí)慣,避開(kāi)這些問(wèn)題使得我們的代碼效率更高,可讀性更強(qiáng),Bug更少。

          1、使用標(biāo)準(zhǔn)庫(kù)中的名字

          py文件名跟系統(tǒng)自帶的模塊名一樣導(dǎo)致找不到模塊是初學(xué)者犯錯(cuò)最多的時(shí)候,我最開(kāi)始也犯這樣的錯(cuò),比如學(xué) random 模塊時(shí),將自己的文件名也命名為 random.py, 執(zhí)行的時(shí)候報(bào)錯(cuò)。為什么?因?yàn)?你在import random的時(shí)候,解釋器有優(yōu)先從當(dāng)前目錄加載模塊,剛好,當(dāng)前目錄有個(gè)random.py ,所以就不會(huì)去Python的標(biāo)準(zhǔn)庫(kù)目錄找random模塊了。

          # random.py
          import random

          print(random.choice([1, 2, 3]))
          AttributeError: module 'random' has no attribute 'choice'

          2. 使用內(nèi)建名稱作為變量名

          程序員最頭疼的事情就是如何給變量命名,如何給類命名,如何給函數(shù)命名,有種不好的習(xí)慣就是我們?yōu)榱送祽谢蛘呦氩怀龊玫拿謺r(shí),直接使用內(nèi)建函數(shù)或者內(nèi)建模塊的名字來(lái)命名,例如:

          id = 5
          len = 3
          list = [1,2,3]
          str = 'jack'

          以上幾個(gè)變量名都是系統(tǒng)內(nèi)建函數(shù)名稱,一旦被你自己的變量名占用后,后面要使用該函數(shù)時(shí)直接報(bào)錯(cuò)

          >>> str(1)
          TypeError: 'str' object is not callable

          最佳的命名方式要做到見(jiàn)名知義,避免與內(nèi)建函數(shù)沖突,如果實(shí)在想不到更好的名字,可以考慮加下劃線

          id_ = 5length = 3numbers = [1,2,3]name = 'jack'

          3、變量作用域

          你第一次碰到下面這段代碼的時(shí)候,可能你會(huì)很驚訝,這怎么會(huì)報(bào)錯(cuò)?

          a = 1

          def fun():
             a += 2
             print(a)

          fun()

          報(bào) UnboundLocalError 錯(cuò)誤

          UnboundLocalError: local variable 'a' referenced before assignment

          規(guī)則:

          1. 如果變量在函數(shù)中被引用沒(méi)有被賦值,那么就是全局變量

          2. 如果變量在函數(shù)的任意位置被賦予過(guò)新的值,那么該變量就是局部變量

          3. 如果變量在函數(shù)中重新賦予了值,又希望是全部變量,則需要用關(guān)鍵字 global 修飾該變量

          a = 1

          def fun():
             global a
             a += 2
             print(a)

          fun()

          4、使用可變對(duì)象作為默認(rèn)參數(shù)

          這個(gè)例子可能你在其他地方有看過(guò),如果面試官問(wèn)題,為什么會(huì)這樣的時(shí)候,你是否能答出來(lái)。

          def func(i=0, nums=[]):
             nums.append(i)
             print(i)
             print(nums)

          func(i=1)
          func(i=1)

          輸出結(jié)果

          1
          [1]

          1
          [1, 1]

          一個(gè)函數(shù)調(diào)用兩次,結(jié)果卻不一樣,這是什么原因?初學(xué)者以為這是 Python 的 bug,其實(shí)這是陷阱,函數(shù)自身也是對(duì)象,默認(rèn)參數(shù)會(huì)作為該函數(shù)對(duì)象的兩個(gè)屬性存在。類似于:func.i, func.nums。函數(shù)創(chuàng)建之后,nums 已經(jīng)有一個(gè)默認(rèn)值 [],第一次調(diào)用時(shí),相當(dāng)于 func.nums.append(1), 第二次調(diào)用相當(dāng)于 func.nums.append(2),因?yàn)榱斜硎强勺儗?duì)象,所以,每調(diào)用一次,就往列表里面增加了一個(gè)元素。

          正確的實(shí)現(xiàn)方法是:

          def func(i=0, nums=None):
             if nums is None:
                 nums = []
             nums.append(i)
             print(i)
             print(nums)

          func(i=1)
          func(i=1)

          5、 不使用列表推導(dǎo)式

          將一個(gè)列表中的所有元素做平方處理,普通的做法就是新建一個(gè)列表,逐個(gè)迭代計(jì)算出每個(gè)值的平方,再加入到新數(shù)組中。喜歡裝X的可能會(huì)把代碼寫(xiě)的巨難懂,各種技巧都給你用上,最后只為實(shí)現(xiàn)一個(gè)簡(jiǎn)單的需求。90% 的情況下,列表推導(dǎo)式可以代替 map、filter 函數(shù)。

          普通寫(xiě)法

          items = [1, 2, 3, 4, 5]squared = []for i in items:    squared.append(i**2)

          裝B寫(xiě)法

          items = [1, 2, 3, 4, 5]squared = list(map(lambda x: x**2, items))

          最佳寫(xiě)法

          items = [1, 2, 3, 4, 5]
          squared = [x**2 for x in items]

          6、不使用 enumerate 函數(shù)獲取列表元素下標(biāo)索引

          在某些場(chǎng)景,不可避免需要用到列表元素中的下標(biāo)索引位置,一般程序員的做法就是按照最原始C語(yǔ)言的寫(xiě)法

          普通寫(xiě)法

          color = ['red', 'blue', 'green']

          for i in range(len(color)):
             print(i, color[i])

          裝B寫(xiě)法

          color = ['red', 'blue', 'green']

          for i, item in zip(range(len(color)), color):
             print(i, item)

          最佳寫(xiě)法

          color = ['red', 'blue', 'green']

          for i, item in enumerate(color):
             print(i, item)

          7、使用 from xxx  import *

          偷懶的程序員喜歡直接 import * ,雖然能節(jié)省一些代碼,但是 import *里面隱藏著一些潛在的危險(xiǎn)。如果 a,b 兩個(gè)包里面都有一個(gè)叫做 foo 的模塊,那么其中一個(gè)就會(huì)被覆蓋。正確的做法就是顯示地把需要用到的模塊 import 進(jìn)來(lái),如果遇到重名的模塊,則用 as 將其重命名。

          from a import foo as foo_a
          from b import foo as foo_b

          8、使用Python2.X

          Python2.7 在2020年官方不再維護(hù),現(xiàn)在都2019年了,所以如果你的系統(tǒng)特別是新系統(tǒng)還用Python2.7的話,不失為最差的開(kāi)發(fā)實(shí)踐,所以,趕緊升級(jí)到Python3.6吧



          本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
          打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
          猜你喜歡
          類似文章
          python自學(xué)教程(三)函數(shù)與模塊
          Python中的函數(shù)式編程教程,學(xué)會(huì)用一行代碼搞定所有內(nèi)容
          Python程序員必知必會(huì)的開(kāi)發(fā)者工具
          深入理解 Python 內(nèi)部函數(shù)和閉包(進(jìn)階)
          Python入門(mén)之你必須了解的語(yǔ)法與類型
          Python基礎(chǔ)面試80問(wèn) 你能回答多少?
          更多類似文章 >>
          生活服務(wù)
          分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
          綁定賬號(hào)成功
          后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
          如果VIP功能使用有故障,
          可點(diǎn)擊這里聯(lián)系客服!

          聯(lián)系客服