Python代码重构参考

作者: admin 分类: 公众号存档            3 次浏览 发布时间: 2018-08-01 23:59

公众号:杨建荣的学习笔记 · 作者:杨建荣 · 发布:2018-08-01 23:59:36 · 原文链接

    在数据库方向上相对来说能够容易推出开发规范和标准,但是你很少听到公司里面出针对开发同学的开发规范。我觉得其中的一个原因是程序猿比较执拗,以技术服人,经常彼此看不上,如果你出了10个规范,估计能让他从另外的角度给你20个建议,如果给个样例,估计他能够给你变出很多的花样来改进,说你的不够极客风,所以干脆就参考官方文档吧。

    开发方向有一个概念一直很火,那就是代码重构,代码的重构有思路和方法,而且实践性强,因为是在思路层面抽象了一层,其实适应面会更广。

    简单参考了下Python代码重构的一些例子,自己也在这个基础上做了一些小的改动,一并分享出来。

    假设我们有这样的一个基础数据结构 列表:

    namelist = [‘yang’,’jianrong’,’jeanron’]

遍历我们常用的办法应该是简单的for循环了。

for item in namelist:

    print item

显然这样的方法没法得到下标,还有什么办法呢。

使用range是一种思路。

for i in range(len(namelist)):

    print i,’–>’,namelist[i]

输出如下:

0 –> yang

1 –> jianrong

2 –> jeanron

但是相对来说,更建议使用enumerate

for idx,item in enumerate(namelist):

    print idx,’–>’,item

输出如下:

0 –> yang

1 –> jianrong

2 –> jeanron

然后我们创建另外一个新的列表 namelist2

namelist2=[‘jeanron100′,’yang’]

然后遍历两个列表,注意两个列表的元素个数不同。

for i in range(len(namelist)):

    print namelist[i]

    print namelist2[i]

输出如下:

yang

jeanron100

jianrong

yang

jeanron

Traceback (most recent call last):

  File “<stdin>”, line 3, in <module>

IndexError: list index out of range

明显下标溢出了。

可以使用如下的方式:

for item1,item2 in zip(namelist,namelist2):

    print item1

    print item2

yang

jeanron100

jianrong

yang

不过需要注意,namelist的输出结果集不是最完整的

在这个基础上如果更近一步,可以使用izip

from itertools import izip

for item1,item2 in izip(namelist,namelist2):

    print item1

    print item2

输出入下:

yang

jeanron100

jianrong

yang

替换变量

x=10

y=-10

常规的思路,我们需要一个中间变量

tmp=x

x=y

y=tmp

>>> print x,y

-10 10

但是不建议这么做,在Python里面,我们可以做得更简单些。

>>> x,y=y,x

>>> print x,y

10 -10

如果要通过下标输出列表数据

>>> print namelist

[‘yang’, ‘jianrong’, ‘jeanron’]

常规的思路是这样的。

>>> first_name=namelist[1]

>>> last_name=namelist[2]

输出如下:

>>> print first_name,last_name

jianrong jeanron

我们可以稍作下改进,做下映射,和Python里面经典的 %s 值匹配是类似的。

>>> first_name,last_name,_=namelist

>>> print first_name

yang

>>> print last_name

jianrong

>>> print _

jeanron

还有一个是for else的使用。

比如我们做匹配的需求时,可以使用如下的条件。

condition = lambda name: len(name) == 4

如果要遍历列表查看数据,可以使用如下的方式:

found = False

for name in namelist:

    if condition(name):

        print ‘Found’,name

        found = True

        break

    if not found:

        print ‘Not Found’

输出如下:

Found yang

这里的一个很大不同就是匹配到数据之后直接退出。

当然下面的方式看起来就比较正统了,也是建议的。

>>> for name in namelist:

…     if condition(name):

…         print ‘Found’,name

…     else:

…         print ‘Not Found’

… 

Found jean

Not Found

Not Found

Found yang

参考链接:https://www.douban.com/note/634885269/

admin

杨建荣,《Oracle DBA工作笔记》《MySQL DBA工作笔记》作者,dbaplus社群发起人之一,腾讯云TVP,现任竞技世界系统部经理,拥有十多年数据库开发和运维经验,目前专注于开源技术、运维自动化和性能调优

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注