python中使用else代替狀態變數,pythonelse
翻看公司的代碼文檔,在代碼風格文檔中,寫著:為了提高代碼的可維護性,代碼中減少flag這類狀態變數的使用。這個問題,平時確實沒有想過,面對這種需求時,第一反應就是使用flag標記狀態。那麼使用什麼樣的技巧或代碼結構才能,才能代替狀態變數的使用呢?我想到的方法是應用else。
說到else,最常用的文法是if-elif-else,實際上else是可以與迴圈和try搭配使用的,下面我寫了一個else替換狀態變數的例子,使用插入法對數組排序。首先使用狀態變數實現,代碼如下:
def insertion_sort(input_list): if len(input_list) <= 1: return input_list _sorted = input_list[:1] for i in input_list[1:]: inserted = False for j in xrange(len(_sorted)): if i <= _sorted[j]: _sorted.insert(j, i) inserted = True break if not inserted: _sorted.append(i) return _sorted
使用inserted來標記新元素是否執行了插入操作,如果未執行的話,將元素插入到末位。
下面給出使用else替換inserted的代碼實現:
def insertion_sort1(input_list): if len(input_list) <= 1: return input_list _sorted = input_list[:1] for i in input_list[1:]: for j in xrange(len(_sorted)): if i <= _sorted[j]: _sorted.insert(j, i) break else: _sorted.append(i) return _sorted
當for迴圈執行完整,中途沒有break的話,就會執行else操作,也就起到了和inserted相同的作用。
else在try...except...else...finally的流程式控制制文法中同樣適用,當程式沒走進except時,就會使用else 中的代碼,我們就不需要定義狀態變數來記錄程式是否走入except,代碼如下:
def divide(x, y): try: result = x / y except ZeroDivisionError: print("error: division by 0!") else: print "result = %s" % result finally: print("divide finished!")
因為每個人的變成習慣不同,這種python專屬的文法並不被提倡,而且如果代碼嵌套了多層迴圈,那麼使用else代替狀態變數也降低了代碼的可讀性。但是如果python使用足夠熟練,在一些簡短的迴圈控制語句中,我們通過else擺脫一些累贅的狀態變數,還是可取的。