6 個(gè)例子教你重構(gòu) Python 代碼【導(dǎo)語(yǔ)】:對(duì)自己寫的冗長(zhǎng)代碼,想重構(gòu)但又無(wú)思路?小編整理了系列介紹python代碼重構(gòu)優(yōu)..." />
<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ǎng)的 Python 代碼,如何重構(gòu)?

          共 3241字,需瀏覽 7分鐘

           ·

          2020-12-18 17:26

          ?△點(diǎn)擊上方Python貓”關(guān)注 ,回復(fù)“1”領(lǐng)取電子書(shū)

          作者:Nick Thapen,翻譯:Python開(kāi)發(fā)者

          接上篇——>6 個(gè)例子教你重構(gòu) Python 代碼

          【導(dǎo)語(yǔ)】:對(duì)自己寫的冗長(zhǎng)代碼,想重構(gòu)但又無(wú)思路?小編整理了系列介紹python代碼重構(gòu)優(yōu)化的方法,助你一臂之力。


          編寫干凈的 Pythonic 代碼就是盡可能使其易于理解,但又簡(jiǎn)潔。


          這是 Python 重構(gòu)系列中的之一,本系列文章的重點(diǎn)是為什么這些重構(gòu)是好主意,而不僅僅是如何做。


          1.將for循環(huán)轉(zhuǎn)換為list/dictionary/set 表達(dá)式


          我們?cè)跁r(shí)經(jīng)常遇到的一個(gè)情況是,創(chuàng)建一個(gè)值的集合。

          比如我們創(chuàng)建一個(gè)列表,然后迭代地用值填充它,這里我們想創(chuàng)建一個(gè)立方數(shù)字的列表。大多數(shù)語(yǔ)言的標(biāo)準(zhǔn)方法如下:

          cubes = []for i in range(20):    cubes.append(i ** 3)

          在Python中,我們可以使用列表表達(dá)式,生成需要的數(shù)據(jù)。就可以將代碼簡(jiǎn)化為一行,省去定義列表,然后再去填充列表的略顯繁瑣的操作。

          cubes = [i ** 3 for i in range(20)]

          看,我們已經(jīng)將三行代碼轉(zhuǎn)換成一行,這無(wú)疑是不錯(cuò)的選擇——你的眼睛不用上下左右的檢查代碼。


          把代碼壓縮到一行會(huì)使閱讀變得更加困難,但對(duì)于推導(dǎo)表達(dá)式來(lái)說(shuō),情況并非如此。您需要的所有元素都被很好地呈現(xiàn)出來(lái),一旦您習(xí)慣了語(yǔ)法,它實(shí)際上比f(wàn)or循環(huán)版本更具可讀性。


          另一點(diǎn)是賦值現(xiàn)在更像是一個(gè)原子操作——我們聲明什么是cubes,而不是給出如何構(gòu)建它的指令。這使得代碼讀起來(lái)更舒適,因?yàn)槲覀冴P(guān)心變量cubes是什么,而不是它的構(gòu)造細(xì)節(jié)。


          最后,表達(dá)式通常比在循環(huán)中構(gòu)建集合更快,如果考慮性能,這也是重要因素。


          2.用增量賦值替換賦值


          增量賦值是一種快速而簡(jiǎn)單的Python語(yǔ)法。


          只要有這樣的代碼:

          count = count + other_value

          都可以替換成下面的代碼:

          count += other_value

          代碼是簡(jiǎn)短和清晰的-我們不需要考慮計(jì)數(shù)變量?jī)纱巍?/span>其他可以使用的運(yùn)算符包括-=,*=,/=和**=。


          不過(guò)有件事需要稍微小心一點(diǎn),你要分配給的類型必須定義適當(dāng)?shù)倪\(yùn)算符。例如,numpy數(shù)組不支持/=操作。


          3.只使用一次的內(nèi)聯(lián)變量


          我們?cè)谌藗兊拇a中經(jīng)常看到的一種情況是將結(jié)果賦給臨時(shí)變量,然后立即返回它。

          def state_attributes(self):    """Return the state attributes."""    state_attr = {        ATTR_CODE_FORMAT: self.code_format,        ATTR_CHANGED_BY: self.changed_by,    }    return state_attr

          其實(shí)更好的方法是直接返回結(jié)果,而不是再用一個(gè)臨時(shí)變量存放結(jié)果

          def state_attributes(self):    """Return the state attributes."""    return {        ATTR_CODE_FORMAT: self.code_format,        ATTR_CHANGED_BY: self.changed_by,    }

          這樣可以縮短代碼并刪除不必要的變量,從而減少閱讀代碼的腦力消耗。


          臨時(shí)變量可能有用的地方是,如果它們被用作參數(shù)或條件,并且名稱可以代表內(nèi)容。在上面的例子中,返回的是state屬性,并且state_attr沒(méi)有提供任何額外的信息。因此不必將結(jié)果賦給臨時(shí)變量。


          4.用if表達(dá)式替換if語(yǔ)句


          經(jīng)常會(huì)遇到的一種情況是,您經(jīng)常希望將一個(gè)變量設(shè)置為兩個(gè)不同值中的一個(gè)。

          if condition:    x = 1else:    x = 2

          這可以使用Python的條件表達(dá)式語(yǔ)法(python的三元運(yùn)算符版本)在一行上編寫:

          x = 1 if condition else 2

          這肯定更簡(jiǎn)潔,但它是一個(gè)更有爭(zhēng)議的重構(gòu)(就像列表表達(dá)式)。一些程序員不喜歡這樣的表達(dá)式,因?yàn)橛X(jué)得它們比完全寫出if條件更難解析。


          我們的觀點(diǎn)是,只要條件表達(dá)式很短并且適合合并,那就是一種改進(jìn),提升效率。與列表表達(dá)式的示例類似,當(dāng)我們閱讀代碼時(shí),通常不需要知道x是如何分配的,只需看到它被賦值,然后繼續(xù)向前。


          5.用生成器代替不需要的表達(dá)式


          一個(gè)技巧是像any、all和sum這樣的函數(shù)允許傳入generator而不是collection。這意味著,與其這樣做:

          hat_found = any([is_hat(item) for item in wardrobe])

          可以將代碼改成:

          hat_found = any(is_hat(item) for item in wardrobe)

          這將刪除一對(duì)括號(hào),使代碼稍微清晰一些。如果any函數(shù)找到結(jié)果,會(huì)立即返回,而不必構(gòu)建整個(gè)列表。這可以導(dǎo)致性能提升。


          請(qǐng)注意,我們實(shí)際上是將生成器傳遞到any()中,嚴(yán)格地說(shuō),代碼應(yīng)該如下所示:

          hat_found = any((is_hat(item) for item in wardrobe))

          但是Python允許您省略這對(duì)括號(hào)。下面是接受generator的標(biāo)準(zhǔn)庫(kù)函數(shù):

          'all', 'any', 'enumerate', 'frozenset', 'list', 'max', 'min', 'set', 'sum', 'tuple'

          6.將條件簡(jiǎn)化為return語(yǔ)句


          最后介紹的重構(gòu)技巧是,函數(shù)需要返回結(jié)果是True或False的情況。一種常見(jiàn)的方法是:

          def function():    if isinstance(a, b) or issubclass(b, a):        return True    return False

          但是,直接返回結(jié)果會(huì)更簡(jiǎn)潔,如下所示:

          def function():    return isinstance(a, b) or issubclass(b, a)

          只有當(dāng)表達(dá)式的計(jì)算結(jié)果為布爾值時(shí),才能這樣操作。例如

          def any_hats():    hats = [item for item in wardrobe if is_hat(item)]    if hats or self.wearing_hat():        return True    return False

          這個(gè)示例,可以通過(guò)bool()將hat和self.wearing_hat()合成bool列表,就可以消除if條件,達(dá)到簡(jiǎn)化程序的目的。

          def any_hats():    hats = [item for item in wardrobe if is_hat(item)]    return bool(hats or self.wearing_hat())

          參考鏈接:https://sourcery.ai/blog/explaining-refactorings-2/

          Python貓技術(shù)交流群開(kāi)放啦!群里既有國(guó)內(nèi)一二線大廠在職員工,也有國(guó)內(nèi)外高校在讀學(xué)生,既有十多年碼齡的編程老鳥(niǎo),也有中小學(xué)剛剛?cè)腴T的新人,學(xué)習(xí)氛圍良好!想入群的同學(xué),請(qǐng)?jiān)诠?hào)內(nèi)回復(fù)『交流群』,獲取貓哥的微信(謝絕廣告黨,非誠(chéng)勿擾!)~

          近期熱門文章推薦:

          Python最會(huì)變魔術(shù)的魔術(shù)方法,我覺(jué)得是它!
          惡補(bǔ)了 Python 裝飾器的六種寫法,你隨便問(wèn)~
          這有 73 個(gè)例子,徹底掌握 f-string 用法!
          為什么 Python 多線程無(wú)法利用多核?

          感謝創(chuàng)作者的好文
          瀏覽 47
          點(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无码 | 香蕉伊人在线观看 | 国产免费无码一区二区 | 三级片中文 |