#我們在時經常遇到的一個情況是,建立一個值的集合。
舉個例子,我們可以建立一個立方數字列表,透過迭代方式將其填入。大多數語言的標準方法如下:
cubes = [] for i in range(20): cubes.append(i ** 3)
在Python中,我們可以使用列表表達式,產生所需的資料。可以把這段程式碼壓縮成一行,避免定義清單以及繁瑣的填滿操作。
cubes = [i ** 3 for i in range(20)]
看,我們已經將三行程式碼轉換成一行,這無疑是不錯的選擇——你的眼睛不用上下左右的檢查程式碼。
壓縮程式碼到一行會增加閱讀的困難度,但對於推導表達式來說,這種情況不適用。一旦您熟悉了語法,所有您所需的元素都呈現得非常清晰,這使其比for循環版本更易於閱讀。
另一點是賦值現在更像是原子運算——我們宣告什麼是cubes,而不是給如何建構它的指令。透過這樣做,程式碼更易於閱讀,因為我們關注的是變數cubes的意義而不是它的建構方式。
最後,表達式通常比在循環中建立集合更快,如果考慮效能,這也是重要因素。
增量賦值是一種快速而簡單的Python語法。
只要有這樣的程式碼:
count = count + other_value
都可以替換成下面的程式碼:
count += other_value
程式碼是簡短且清晰的-我們不需要考慮計數變數兩次。還有一些可用的運算符,包括減等於(-=)、位元與等於(&=)、除等於(/=)和乘等於(*=)。
你需要小心一點,因為你分配給的型別必須定義適當的運算子。例如,numpy陣列不支援/=操作。
我們在人們的程式碼中經常看到的一種情況是將結果賦給臨時變量,然後立即返回它。
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未提供任何額外資訊。因此不必將結果賦給臨時變數。
經常會遇到的一種情況是,您經常希望將一個變數設為兩個不同值中的一個。
if condition: x = 1 else: x = 2
這可以使用Python的條件表達式語法(python的三元運算子版本)在一行上編寫:
x = 1 if condition else 2
這肯定更簡潔,但它是一個更有爭議的重構(就像列表表達式)。有些程式設計師不喜歡這種表達方式,因為覺得與在if語句中完整寫出條件相比,它們更難理解。
如果條件表達式比較簡短且可以合併,那麼這種改進可以提高效率,這是我們的觀點。與列表表達式的範例類似,當我們閱讀程式碼時,通常不需要知道x是如何分配的,只需看到它被賦值,然後繼續向前。
轉換成簡單的句子:可以使用像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'
最後介紹的重構技巧是,函數需要傳回結果是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中文網其他相關文章!