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摆脱一些累赘的状态变量,还是可取的。

  • 相关阅读:
    ifup和ifdown
    shell 字符串操作 + 变量替换
    idea普通项目转maven项目
    重磅发布 | 阿里云视图计算,边缘计算的主“战”场
    视图计算背后的技术架构思考
    连续三年入围 Gartner 容器竞争格局,阿里云容器服务新布局首次公开
    6 张图带你彻底搞懂分布式事务 XA 模式
    Flink 在唯品会的实践
    贝壳基于 Flink 的实时计算演进之路
    关于写文章的一点经验
  • 原文地址:https://www.cnblogs.com/baiyb/p/8545171.html
Copyright © 2011-2022 走看看