《编写高质量代码 改善python程序的91个建议》第二章 惯用法 8-18
Posted alphabetax
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《编写高质量代码 改善python程序的91个建议》第二章 惯用法 8-18相关的知识,希望对你有一定的参考价值。
建议8:调试语句assert expression, "sentence", python -O xx.py 可以禁用断言,建议少用断言;
建议9:数据交换不推荐使用中间值
语句执行时间:
from timeit import Timer Timer(‘x,y = y,x‘).timeit()
## x,y = y,x 相当于元组(x,y)= (y,x) 涉及packing和unpacking
def swap()
x = 2
y = 3
x,y = y,x
import dis
dis.dis(fun) # 显示CPU指令集过程
## CPU指令集中存在汇编语言 ROT_TWO 来交换两个数,所以python中直接交换时会直接调用该汇编命令,运行时间更快;
## 使用中间值会涉及多出来的变量赋值
建议10: 学会使用 Lazy evaluation, 延迟计算
from time import time t = time() do_sth... interval = time() - t
if exp1 or exp2 # 较真的尽可能放前面
if exp1 and exp2 # 较真的尽可能放后面
建议11: 是否支持枚举enum, 存在类似替代方法。python3.4之后的版本支持枚举, PEP435
建议12:不建议使用type检查数据类型,因为类继承方面,区分基类与子类。
建议使用类型转换,list(list1)、str(name)或者 isinstance(object, classinfo);
isinstance(2, float), isinstance("a", (str, unicode)), isinstance((1,3), (str,list,tuple))支持多种类型列表;
isinstance(子类对象, 基类名) : True
建议13:转换成浮点数再做除法;
因为都是整数时,存在截断情况;另while i !=1.5 有些浮点数计算机无法准确计算;
建议14:警惕使用eval()的安全漏洞,用ast.literal_evel替代;
建议15:推荐使用 enumuerate()获取序列号及值
li = [‘a‘, ‘b‘, ‘c‘, ‘d‘]
for i,e in zip(range(len(li)), li) ## zip:对应位置组队成一个元组,多个元组再组成列表
print(i,e)
for i,e enumerate(li)
print(i,e)
e = enumerate(seq, start=0)
e.next() ## 遍历获得一个个元组
#-----------------------------
#内部实现 函数迭代器
def enumerate(sequence, start=0)
n = start
for elem in sequence:
yield n,elem ## yield 函数迭代器,yield相当于return及本次调用的停止与下次调用的起点
n += 1
#字典迭代
for k,v in persioninfo.iteritems():
print(k+":"+v)
建议16: 分清 == 与 is 适用场景
is 相当于 id(a) == id(b) 最同一块内存地址:
一般id相同,其值也相同,NaN除外因为 NaN不能比较大小,不能被重载;
== 是比较两个值是否相等;可以被重载 a==b 相当于a.__equal__(b);
另: python 中字符串驻留机制,小字符串会驻留在系统中仅保持一份;
a = "Hi" b = "Hi" => a is b : True 系统仅保留一份“Hi”
a ="Hello world! I‘m back." b ="Hello world! I‘m back." => a is b :False 两个字符串不是同一块
建议17:考虑兼容性,尽可能使用Unicode编码
子类的基类: type(strUnicode).__bases__ :<type ‘basestring‘>
不同编码间的转换: A <---> Unicode <---> B, 即 (filehandle.read().decode("utf-8")).encode("gbk")
申明编码方法:
# coding=utf-8 第一种
#!/usr/bin/python 第二种
#-*- coding:utf-8
#!/usr/bin/python 第三种
# vim: set fileencoding=utf-8
#--- u"Chinese Test"表示Unicode编码
from __futre__ import unicode_literals ## Unicode字符串
建议18:构建包层次管理模块
每个python 都是一个模块;
包package, 即特殊的目录: 目录+ __init__.py文件, 允许嵌套;
Package:
__init__.py ## 可以为空, 可以写入 from Model2 import classA
Model1.py
Model2.py
Subpackage:
__init__.py ## 可以为空, 可以写入 from Model1 import classB
Model1.py
Model2.py
## 访问: Package.Model, Package.Subpackage.Model2
## import Package.Model1
## from Package import Model1
## from Package.Mdel1 import classTest
##----------------------------------------------
__all__ = ["Model1", "Model2", "Subpackage"] ## __init__.py里可以这么写
from Package import * # 可以导入所有模块
以上是关于《编写高质量代码 改善python程序的91个建议》第二章 惯用法 8-18的主要内容,如果未能解决你的问题,请参考以下文章
《编写高质量代码 改善python程序的91个建议》第二章 惯用法 8-18
《编写高质量代码 改善python程序的91个建议》第二章 基础语法 19-35