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摆脱一些累赘的状态变量,还是可取的。
python 使用else代替状态变量的更多相关文章
- Python笔记(3)迭代器与生成器
参考自:http://www.cnblogs.com/huxi/category/251137.html 迭代器 迭代器是访问集合内元素的一种方式,他不能倒退只能一直迭代下去.可以写到for循环in后 ...
- python中的 descriptor
学好和用好python, descriptor是必须跨越过去的一个点,现在虽然Python书籍花样百出,但是似乎都是在介绍一些Python库而已,对Python语言本身的关注很少,或者即使关注了,但是 ...
- 给深度学习入门者的Python快速教程 - 基础篇
实在搞不定博客园的排版,排版更佳的版本在: https://zhuanlan.zhihu.com/p/24162430 Life is short, you need Python 人生苦短,我用Py ...
- 笔记之Python网络数据采集
笔记之Python网络数据采集 非原创即采集 一念清净, 烈焰成池, 一念觉醒, 方登彼岸 网络数据采集, 无非就是写一个自动化程序向网络服务器请求数据, 再对数据进行解析, 提取需要的信息 通常, ...
- python多进程共享变量Value使用tips
前言: 在使用tornado的多进程时,需要多个进程共享一个状态变量,于是考虑使用multiprocessing.Value(对于该变量的具体细节请查阅相关资料).在根据网上资料使用Value时,由于 ...
- Python学习笔记:魔术方法详解
准备工作 为了确保类是新型类,应该把 _metaclass_=type 入到你的模块的最开始. class NewType(Object): mor_code_here class OldType: ...
- Python基础教程【读书笔记】 - 2016/7/24
希望通过博客园持续的更新,分享和记录Python基础知识到高级应用的点点滴滴! 第九波:第9章 魔法方法.属性和迭代器 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.已 ...
- 如何让你的Python代码更加pythonic ?
pythonic如果翻译成中文的话就是很python.很+名词结构的用法在中国不少. 以下为了简略,我们用P表示pythonic的写法,NP表示non-pythonic的写法,当然此P-NP非彼P-N ...
- python学习笔记之七:魔法方法,属性
在python中,有的名称会在前面和后面加上两个下划线,由这些名字组成的集合所包含的方法称为魔法方法(或者是特殊方法).如果对象实现了这些方法中的某一个,那么这个方法会在特殊的情况下(确切地说是根据名 ...
随机推荐
- 高可用Hadoop平台-运行MapReduce程序
1.概述 最近有同学反应,如何在配置了HA的Hadoop平台运行MapReduce程序呢?对于刚步入Hadoop行业的同学,这个疑问却是会存在,其实仔细想想,如果你之前的语言功底不错的,应该会想到自动 ...
- 对称加密-AES
假设有一个发送方在向接收方发送消息.如果没有任何加密算法,接收方发送的是一个明文消息:“我是小灰”. 如果消息被中间人截获到,即使中间人无法篡改消息,也可以窥探到消息的内容,从而暴露了通信双方的私密. ...
- tomcat配置说明,配置不用访问工程名
# 配置项目访问不用输入项目名称 # [重要]亲测 <Host>中的 appBass="" 一定不能带目录,必须为空,因为启动tomcat会启动appBass下面的所有 ...
- MathType试用期到了如何继续用
1,卸载原来的MathType(不知道需不需要,其实删不删应该无所谓吧) 2,删除注册表中的一个值(不是默认,而是另外一个值) HKEY_CURRENT_USER\Software\Install O ...
- OSI与TCP/IP模型
1 OSI参考模型 谈到网络不能不谈OSI参考模型,虽然OSI参考模型的实际应用意义不是很大,但其的确对于理解网络协议内部的运作很有帮助,也为我们学习网络协议提供了一个很好的参考.在现实网络世界里,T ...
- POJ 2234 Matches Game (尼姆博弈)
题目链接: https://cn.vjudge.net/problem/POJ-2234 题目描述: Here is a simple game. In this game, there are se ...
- 使用matlibplot.pyplot设置画图的坐标系
今天看了林轩田老师的感知机算法,心血来潮想要做个可视化过程,以便观察更新的过程. 现将学习成果做个记录,下面是画出来的图,这是初始的状态,后面会通过算法找到一条经过原点的直线将两堆数据分割开来. 直线 ...
- windows下mongodb集群搭建
本文介绍在windows环境下如何搭建一个高可用性的mongodb集群.系统环境为win7,mongodb版本为3.6.3. 本文采用的是分片+副本集的方式搭建集群,将分别介绍如何使用副本集和分片来提 ...
- Textview源码+绘制过程解析
Android控件TextView的实现原理分析 为什么要规定所有与UI相关的操作都必须在主线程中执行呢?我们知道,这些与UI相关的操作都涉及到大量的控件内部状态以及需要访问窗口的绘图表面,也就是说, ...
- Centos 7 安装后设置
1.宽带连接 终端: nm-connection-editor 添加:DSL 另外一篇:Centos7宽带连接 2.输入法设置 设置-->区域和语言--> + -->搜索chines ...