《编写高质量代码 改善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 * # 可以导入所有模块

 

 

 

 

 

 

             

 

 

 

          

 

posted @ 2019-12-03 17:43  一花一世界V5  阅读(172)  评论(0编辑  收藏  举报