怎麼重構冗長的Python程式碼

WBOY
發布: 2023-05-20 21:11:30
轉載
710 人瀏覽過

1.將for迴圈轉換為list/dictionary/set 表達式

#我們在時經常遇到的一個情況是,建立一個值的集合。

舉個例子,我們可以建立一個立方數字列表,透過迭代方式將其填入。大多數語言的標準方法如下:

cubes = []
for i in range(20):
    cubes.append(i ** 3)
登入後複製

在Python中,我們可以使用列表表達式,產生所需的資料。可以把這段程式碼壓縮成一行,避免定義清單以及繁瑣的填滿操作。

cubes = [i ** 3 for i in range(20)]
登入後複製

看,我們已經將三行程式碼轉換成一行,這無疑是不錯的選擇——你的眼睛不用上下左右的檢查程式碼。

壓縮程式碼到一行會增加閱讀的困難度,但對於推導表達式來說,這種情況不適用。一旦您熟悉了語法,所有您所需的元素都呈現得非常清晰,這使其比for循環版本更易於閱讀。

另一點是賦值現在更像是原子運算——我們宣告什麼是cubes,而不是給如何建構它的指令。透過這樣做,程式碼更易於閱讀,因為我們關注的是變數cubes的意義而不是它的建構方式。

最後,表達式通常比在循環中建立集合更快,如果考慮效能,這也是重要因素。

2.用增量賦​​值取代賦值

增量賦值是一種快速而簡單的Python語法。

只要有這樣的程式碼:

count = count + other_value
登入後複製

都可以替換成下面的程式碼:

count += other_value
登入後複製

程式碼是簡短且清晰的-我們不需要考慮計數變數兩次。還有一些可用的運算符,包括減等於(-=)、位元與等於(&=)、除等於(/=)和乘等於(*=)。

你需要小心一點,因為你分配給的型別必須定義適當的運算子。例如,numpy陣列不支援/=操作。

3.只使用一次的內聯變數

我們在人們的程式碼中經常看到的一種情況是將結果賦給臨時變量,然後立即返回它。

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
登入後複製

其實更好的方法是直接回傳結果,而不是再用一個臨時變數存放結果

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

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

當臨時變數被用作參數或條件時,它們可能會有用處,並且名稱可以反映其內容。在上述範例中,傳回的僅為state屬性,且state_attr未提供任何額外資訊。因此不必將結果賦給臨時變數。

4.用if表達式取代if語句

經常會遇到的一種情況是,您經常希望將一個變數設為兩個不同值中的一個。

if condition:
    x = 1
else:
    x = 2
登入後複製

這可以使用Python的條件表達式語法(python的三元運算子版本)在一行上編寫:

x = 1 if condition else 2
登入後複製

這肯定更簡潔,但它是一個更有爭議的重構(就像列表表達式)。有些程式設計師不喜歡這種表達方式,因為覺得與在if語句中完整寫出條件相比,它們更難理解。

如果條件表達式比較簡短且可以合併,那麼這種改進可以提高效率,這是我們的觀點。與列表表達式的範例類似,當我們閱讀程式碼時,通常不需要知道x是如何分配的,只需看到它被賦值,然後繼續向前。

5.用生成器取代不需要的表達式

轉換成簡單的句子:可以使用像any、all和sum這樣的函數將生成器作為參數,而不是集合。這意味著,與其這樣做:

hat_found = any([is_hat(item) for item in wardrobe])
登入後複製

可以將程式碼改成:

hat_found = any(is_hat(item) for item in wardrobe)
登入後複製
登入後複製

這將刪除一對括號,使程式碼稍微清晰一些。如果any函數找到結果,會立即傳回,而不必建立整個清單。這可以導致效能提升。

請注意,我們實際上是將生成器傳遞到any()中,嚴格地說,程式碼應該如下所示:

hat_found = any(is_hat(item) for item in wardrobe)
登入後複製
登入後複製

但是Python允許您省略這對括號。以下是接受generator的標準函式庫函數:

'all', 'any', 'enumerate', 'frozenset', 'list', 'max', 'min', 'set', 'sum', 'tuple'
登入後複製

6.將條件簡化為return語句

最後介紹的重構技巧是,函數需要傳回結果是True或False的情況。一個常見的方法是:

def function():
    if isinstance(a, b) or issubclass(b, a):
        return True
    return False
登入後複製

但是,直接傳回結果會更簡潔,如下所示:

def function():
    return isinstance(a, b) or issubclass(b, a)
登入後複製

只有當表達式的計算結果為布林值時,才能這樣操作。例如

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

這個範例,可以透過bool()將hat和self.wearing_hat()合成bool列表,就可以消除if條件,達到簡化程式的目的。

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

以上是怎麼重構冗長的Python程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板