建议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 disdis.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 * # 可以导入所有模块
原文地址:https://www.cnblogs.com/alphabetax/p/11958558.html