翻看公司的代码文档,在代码风格文档中,写着:为了提高代码的可维护性,代码中减少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摆脱一些累赘的状态变量,还是可取的。