本系列来自《编写高质量代码 改善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. iometer测试磁盘IO性能

    of Outstanding I/Os per target – 被选中worker的每个磁盘一次所允许的未处理的异步I/O的数量.模拟测试多个应用向 IO 请求读写,默认是 1.通常不用这个参数,除 ...

  2. python 数组中如何根据值,获取索引,如何根据索引删除值 , 以及如何根据值删除值

    假设有一数组 s = [1,2,3,4,5,6,7,8,9] (1)如何根据值获取索引 ,如果值为5 , 那对应的索引为? (2)如何根据索引删除值 , 删除数组中索引5对应的值: (3)根据数组中的 ...

  3. 奇怪的表达式求值 (java实现)

    题目参考:http://blog.csdn.net/fuxuemingzhu/article/details/68484749 问题描述; 题目描述: 常规的表达式求值,我们都会根据计算的优先级来计算 ...

  4. http code码实验

    500: 1.代码语法错误. 2.代码文件未被授权执行或访问. 502: php-fpm 未启动 302 Moved Temporarily header 跳转 404: 访问的页面不存在,或者没有权 ...

  5. IOS-github优秀开源项目大全

    github优秀开源项目大全-iOS 前言 本文旨在搜集github上优秀的开源项目 本文搜集的项目都是用于iOS开发 本文会持续更新… 完整客户端 ioctocat github的iOS客户端,目前 ...

  6. 5G信令(就是用户身份信息)——手机开机后,先从USIM中读取之前运营商分配的临时身份信息GUTI/TMSI,发送携带该身份信息的信令给基站,请求接入运营商网络。

    5G时代,跟IMSI-CATCHER SAY GOODBYE from:https://unicorn.360.com/blog/2018/04/18/GoodBye_5G_IMSI-Catcher/ ...

  7. maven_01_简介及安装

    一.简介 Maven主要服务于基于Java平台的项目构建.依赖管理和项目信息管理 何为构建 除了编写源代码,我们每天有相当一部分时间花在了编译.运行单元测试.生成文档.打包和部署等烦琐且不起眼的工作上 ...

  8. jmeter的三种参数化

    以FTP请求(用户.密码)为例:(其他都相同) 1.文件参数化 使用配置元件中的CSV Data Set Config 配置CSV Data Set Config: 文件中存储ftp登录的用户名和密码 ...

  9. thinkphp3.1 多表联合查询代码

    php代码 public function info(){ $where['openid']=session('openid');////用户session $db = M("pay&quo ...

  10. Xcode 8 插件安装

    1.删除旧插件 cd ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-in rm -rf ../Plug-ins 2.Xcode重 ...