zoukankan      html  css  js  c++  java
  • python 使用else代替状态变量

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

  • 相关阅读:
    文本属性和字体属性
    BZOJ 2724: [Violet 6]蒲公英
    BZOJ4010: [HNOI2015]菜肴制作
    BZOJ 2160: 拉拉队排练
    HDU-5157Harry and magic string
    HDU-5421Victor and String
    BZOJ2565: 最长双回文串(回文树)
    BZOJ3676: [Apio2014]回文串(回文树)
    BZOJ 3195: [Jxoi2012]奇怪的道路(状压dp)
    BZOJ1758: [Wc2010]重建计划(01分数规划+点分治+单调队列)
  • 原文地址:https://www.cnblogs.com/baiyb/p/8545171.html
Copyright © 2011-2022 走看看