本系列来自《编写高质量代码 改善python程序的91个建议》的读书笔记整理。

  本章主要内容

建议8:利用assert语句来发现问题
建议9:数据交换值时不推荐使用中间交换变量
建议10:充分利用Lazy evaluation的特性
建议11:理解枚举替代实现的缺陷
建议12:不推荐使用type来进行类型检查
建议13:尽量转换为浮点类型再做除法
建议14:警惕eval()的安全漏洞
建议15:使用enumerate()获取序列迭代的索引和值
建议16:分清==与is的适用场景
建议17:考虑兼容性,尽可能使用Unicod
建议18:构建合理的包层次来管理module

建议8:利用assert语句来发现问题

    1)__debug__的值默认为True,且只读,无法修改(py2.7)。
    2)断言是有代价的,对性能产生一定影响。禁用断言的方法是在运行脚本的时候加上-O标记(不优化字节码,而是忽略与断言相关的语句)。
    使用断言注意点:
    1)不要滥用,这是使用断言的最基本的原则;
    2)如果Python本身的异常能够处理就不要再使用断言;
    3)不要使用断言来检查用户的输入;
    4)在函数调用后,当需要确认返回值是否合理时可以使用断言;
    5)当条件时业务逻辑继续下去的先决条件时,可以使用断言。

建议9:数据交换值时不推荐使用中间交换变量

 >>> from timeit import Timer
>>> Timer('temp=x;x=y;y=temp','x=2;y=3').timeit()
0.03472399711608887
>>> Timer('x,y=y,x','x=2;y=3').timeit()
0.031581878662109375

建议10:充分利用Lazy evaluation的特性

    Lazy evaluation常被译作“延时计算”或“惰性计算”,指的是仅仅在真正需要执行计算的时候才计算表达式的值。典型例子:生成器表达式。
    1)避免不必要的计算,带来性能上的提升;
    2)节省空间,使用无限循环的数据结构成为可能。

建议11:理解枚举替代实现的缺陷

    1)替代方法:使用类属性;借助函数;使用collections.namedtuple.
 >>> from collections import namedtuple
>>> Seasons=namedtuple('Seasons','Spring Summer Autumn Winter')._make(xrange(4))
>>> print Seasons
Seasons(Spring=0, Summer=1, Autumn=2, Winter=3)
>>> print Seasons.Autumn
2
    2)替代缺陷:允许枚举值重复;支持无意义的操作.
 >>> Seasons._replace(Spring=2) # 不合理
Seasons(Spring=2, Summer=1, Autumn=2, Winter=3)
>>> Seasons.Summer+Seasons.Autumn == Seasons.Winter # 无意义
True
    3)py2.7的替代方案(py3.4后引入Enum类型):flufl.enum
 from flufl.enum import Enum

 class Seasons(Enum):
Spring = "Spring"
Summer = 2
Autumn = 3
Winter = 4 Seasons = Enum('Seasons', 'Spring Summer Autumn Winter')
print Seasons
print Seasons.Summer.value

建议12:不推荐使用type来进行类型检查

    1)基于内建类型扩展的用户自定义类型,type函数并不能准确返回结果;
    2)在旧式类中,所有类的实例的type值都相等。
    3)可以用isinstance()函数检查。

建议13:尽量转换为浮点类型再做除法

        当涉及除法运算的时候尽量先将操作数转换成浮点类型再做运算。
        浮点数不精确性导致的无限循环:
 >>> i=1
>>> while i!=1.5:
... i=i+0.1
... print i

建议14:警惕eval()的安全漏洞

 # -*-coding:UTF-8 -*-

 import sys
from math import * def ExpCalcBot(string):
try:
print 'Your answer is', eval(string)
except NameError:
print "The expression you enter is not valid." while True:
print 'Please enter a number or operation. Enter e to complete. ' inputStr = raw_input()
if inputStr == 'e':
sys.exit()
elif repr(inputStr) != ' ':
ExpCalcBot(inputStr)

输入:__import__("os").system("dir")   显示当前目录下的所有文件.

        __import__("os").system("del */Q")   删除当前目录下的所有文件.
        因此,在实际应用过程中国呢如果使用对象不是信任源,应该尽量避免使用eval,在需要使用eval的地方可以用安全性更好的ast.literal_eval替代。

建议15:使用enumerate()获取序列迭代的索引和值

        注意,在获取迭代过程中字典的key和value,应该使用如下iteritems()方法。
 >>> person={'name': 'Josn', 'age': 19, 'hobby': 'football'}
>>> for k,v in person.iteritems():
... print k, ":", v

建议16:分清==与is的适用场景

 >>> a="Hi"
>>> b="Hi"
>>> a is b
True
>>> a==b
True
>>> a1 ="I am using long string for testing" # 注意区分
>>> b1 ="I am using long string for testing"
>>> a1 is b1
False
>>> a1==b1
True

    is:表示的是对象标识符,检查对象的标识符是否一致,也就是比较两个对象在内存中是否拥有同一块内存空间;
    ==:表示的是值相等,用来判断两个对象的值是否相等,可以被重载。
    字符串驻留(string interning)机制:对于较小的字符串,为了提高系统性能会保留其值的一个副本,当创建新的字符串时直接指向该副本即可。

建议17:考虑兼容性,尽可能使用Unicode

    python内建的字符串有两种类型:str和Unicode,共同祖先为basestring。
    windows本地默认编码是CP936。
    解码:str.decode([编码参数[,错误处理]])  
    编码:str.encode([编码参数[,错误处理]])
    错误处理参数有3种方式:
        (1)strict:默认值,抛出UnicodeError异常;
        (2)ignore:忽略不可转换的字符;
        (3)replace:将不可转换字符用?代替。
    有些软件在保存UTF-8编码时,会在文件最开始地方插入不可见的BOM,可以利用codecs解决。
 import codecs

 content = open('manage.py', 'r').read()

 if content[:3] == codecs.BOM_UTF8:
content = content[:3] print content.decode("utf-8")
    编码声明的三种方式:
 # coding=<encoding name> #方式一
#!/usr/bin/env python # -*- coding:<encoding name> -*- #方式二 #!/usr/bin/env python
# vim:set fileencoding=<encoding name> #方式三

建议18:构建合理的包层次来管理module

    包中__init__.py文件的作用:1)使包和普通目录区分;
              2)在该文件中声明模块级别的import语句从而使其变成包级别可见;
              3)通过该文件中定义__all__变量,控制需要导入的子包或者模块。
    使用包的好处:
    1)合理组织代码,便于维护和使用;
    2)能够有效地避免名称空间冲突。

python编程规范系列--建议08~18的更多相关文章

  1. python编程规范系列--建议01~07

    本系列来自<编写高质量代码 改善python程序的91个建议>的读书笔记整理. 本书主要内容     1)容易被忽视的重要概念和常识,如代码的布局和编写函数的原则等:     2)编写py ...

  2. Python 编程规范-----转载

    Python编程规范及性能优化 Ptyhon编程规范 编码 所有的 Python 脚本文件都应在文件头标上 # -*- coding:utf-8 -*- .设置编辑器,默认保存为 utf-8 格式. ...

  3. Python编程规范(PEP8)

    Python编程规范(PEP8) 代码布局 缩进 对于每一次缩进使用4个空格.使用括号.中括号.大括号进行垂直对齐,或者缩进对齐. 制表符还是空格? 永远不要将制表符与空格混合使用.Python最常用 ...

  4. Python学习手册之 Python 之禅、Python 编程规范和函数参数

    在上一篇文章中,我们介绍了 Python 的正则表达式使用示例,现在我们介绍 Python 之禅. Python 编程规范和函数参数.查看上一篇文章请点击:https://www.cnblogs.co ...

  5. Python编程规范及性能优化(转载)

    转载地址:http://codeweblog.com/python编程规范及性能优化/

  6. PEP8 Python编程规范

    官方文档: https://www.python.org/dev/peps/pep-0008/ ---------------------------------------------------- ...

  7. Python 编程规范梳理

    缘由 由于项目团队中新加入了几名攻城狮, 大家之前的背景各不相同,写出的代码也是“风格迥异”.正所谓:“无规则不成方圆”,因此需要对编程进行必要的规范. 整体的思路是:依照PEP8 Python 编码 ...

  8. Python 编程规范 —— TODO 注释(结合 PyCharm)

    编程是代码和注释的统一: TODO 自然表示需要做而未做的一些待完成的事项,有助于事后的检索,以及对整体项目做进一步的修改迭代. # TODO(kl@gmail.com): Use a "* ...

  9. PEP 8 python编程规范

    一 代码编排 缩进.4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格. 每行最大长度79,换行可以使用反斜杠,最好使用圆括号.换行点要在操作符的后边敲回车. 类和to ...

随机推荐

  1. 【Demo】jQuery 表格内容动态排序

    实现功能: 通过点击表头某个字段,实现内容的升序或降序排序. 效果如下: 完整代码: <!DOCTYPE html> <html> <head> <meta ...

  2. 1-19-1 RHEL6启动原理和故障排除

    大纲: 一.RHEL6系统启动原理 BIOS--->mbr--->bootloader--->内核--->init--->/etc/rc.d/rc.sysinit---& ...

  3. 十四 web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码

    打码接口文件 # -*- coding: cp936 -*- import sys import os from ctypes import * # 下载接口放目录 http://www.yundam ...

  4. nyoj299——如何优雅的写矩阵快速幂

    Matrix Power Series 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 Given a n × n matrix A and a positive i ...

  5. compass框架的sprite雪碧图的用法简要

    ---恢复内容开始--- **简介** CSS SPRITE 即 CSS雪碧,即是将诸多图片合成一张图片,然后使用CSS 的background和background-position属性渲染. 这样 ...

  6. SpringInAction--自动化装配Bean(隐式装配)

    关于Bean的介绍就具体不多介绍了,,, Spring在配置时候有三种方案可选 1.在xml中进行显示配置 2.在java中进行显示配置 3.隐式的Bean发现机制和自动装配 今天学习的就是自动化装配 ...

  7. 20165202 2017-2018-2 《Java程序设计》第9周学习总结

    教材学习内容总结 Ch13 URL类 URL类是java.net包中的一个重要的类,URL的实例封装着一个统一资源定位符,使用URL创建对象的应用程序称作客户端程序. 一个URL对象通常包含最基本的三 ...

  8. 为什么叫金拱门- golden arch

    不要再纠结为什么叫这么难理解的名字了.因为从golden arch直译过来的撒.金色的拱门.就叫金拱门咯. 关于M的商标的历史来源如下: "McDonald's logo" red ...

  9. PostgreSQL 9.6 同步多副本、remote_apply记录

    摘自:https://yq.aliyun.com/articles/61274 同步多副本配置方法 参数配置如下 synchronous_standby_names (string) 支持两种写法 n ...

  10. iOS开发之解决CocoaPods中“.h”头文件找不到的问题,简单粗暴的方法

    如果是拖进工程中的framework或者第三方文件,如果找不到,删除了重新添加或者修改search path地址,如果不知道怎么修改,在工程文件夹中,找到对应的文件,然后将文件拖到修改文件地址的位置, ...