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

python 使用else代替状态变量的更多相关文章

  1. Python笔记(3)迭代器与生成器

    参考自:http://www.cnblogs.com/huxi/category/251137.html 迭代器 迭代器是访问集合内元素的一种方式,他不能倒退只能一直迭代下去.可以写到for循环in后 ...

  2. python中的 descriptor

    学好和用好python, descriptor是必须跨越过去的一个点,现在虽然Python书籍花样百出,但是似乎都是在介绍一些Python库而已,对Python语言本身的关注很少,或者即使关注了,但是 ...

  3. 给深度学习入门者的Python快速教程 - 基础篇

    实在搞不定博客园的排版,排版更佳的版本在: https://zhuanlan.zhihu.com/p/24162430 Life is short, you need Python 人生苦短,我用Py ...

  4. 笔记之Python网络数据采集

    笔记之Python网络数据采集 非原创即采集 一念清净, 烈焰成池, 一念觉醒, 方登彼岸 网络数据采集, 无非就是写一个自动化程序向网络服务器请求数据, 再对数据进行解析, 提取需要的信息 通常, ...

  5. python多进程共享变量Value使用tips

    前言: 在使用tornado的多进程时,需要多个进程共享一个状态变量,于是考虑使用multiprocessing.Value(对于该变量的具体细节请查阅相关资料).在根据网上资料使用Value时,由于 ...

  6. Python学习笔记:魔术方法详解

    准备工作 为了确保类是新型类,应该把 _metaclass_=type 入到你的模块的最开始. class NewType(Object): mor_code_here class OldType: ...

  7. Python基础教程【读书笔记】 - 2016/7/24

    希望通过博客园持续的更新,分享和记录Python基础知识到高级应用的点点滴滴! 第九波:第9章  魔法方法.属性和迭代器  在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.已 ...

  8. 如何让你的Python代码更加pythonic ?

    pythonic如果翻译成中文的话就是很python.很+名词结构的用法在中国不少. 以下为了简略,我们用P表示pythonic的写法,NP表示non-pythonic的写法,当然此P-NP非彼P-N ...

  9. python学习笔记之七:魔法方法,属性

    在python中,有的名称会在前面和后面加上两个下划线,由这些名字组成的集合所包含的方法称为魔法方法(或者是特殊方法).如果对象实现了这些方法中的某一个,那么这个方法会在特殊的情况下(确切地说是根据名 ...

随机推荐

  1. Linux-(inotify-tools&rsync)

    inotifywait命令 mac中的是:fswatch,fsevents-tools. 1.命令格式: inotifywait [参数] [events] [targetDir] 2.命令功能: 平 ...

  2. Mysql字符串转换为整型

    使用Convert(字段名, 类型)方法 SELECT CONVERT(filedName, UNSIGNED INTEGER) ;

  3. Selenium3自动化问题二:各chrome版本对应的chromedriver版本

    一:问题说明 最近用到selenium3在火狐浏览器中执行自动化脚本,遇到了一些问题,最后解决方案中占比最多的就是浏览器和驱动版本不一致导致的,故这里给出chrome.firefox驱动的不同版本对应 ...

  4. 自我总结 (三) --(Java Web学习)

    自我完善的过程就是在不断的自我总结不断的改进. 在前的近半个月里,我们经过了考试,也开始了java web的项目. 先看看这次的考试.考完之后我就觉得有点不对劲的,结果 结果真的是一塌糊涂.上周五的时 ...

  5. 第七章 过滤器基础 Filter

    简介:SUN从Servlet2.3开始添加一项激动人心的功能,就是过滤器(Filter).WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图 ...

  6. ASP.NET开发,且编且改,分清职责

    本篇Insus.NET使用一个实例,分享在ASP.NET开发时,一个功能一个方法(函数),且编且改,一步一个脚印把实例完成.在方法多变多形式的情况之下,怎样把写出来程序简单明了. 下面是一个Excel ...

  7. DataTable数据显示于MVC应用程序

    这篇博文是把DataTable的数据显示于MVC的应用程序上. 首先我们在数据库中创建一个表,并添加数据,然后创建存储过程: 接下来,我们去下载一个BusinessBase组件:http://www. ...

  8. params关键字、工具辅助类与、加密与解密

    一.params关键字 在C#中如果给方法的参数加上关键字params则会形成可变参数,在传递时可以是0-n个对象. 示例: using System; using System.Collection ...

  9. MFC函数—CWinApp::LoadStdProfileSettings

    从 InitInstance 成员函数内调用该函数,启用和加载最近使用的(MRU)文件和最后浏览状态的列表.void LoadStdProfileSettings(   UINT nMaxMRU = ...

  10. 常见对象(int和String类型的相互转换)

    public class Test03 { //基本数据类型包装类有八种,其中其中都有parsexxx的方法 //可以加将这七种字符串表现形式转换成基本数据类型 //char的包装类Character ...