《编写高质量代码 改善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 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

时间: 2024-09-29 18:26:11

《编写高质量代码 改善python程序的91个建议》第二章 惯用法 8-18的相关文章

《编写高质量代码 改善python程序的91个建议》第二章 基础语法 19-35

建议19:有节制使用from...import... import    VS  from...import.... import  test                  ##  test 进入局部命令空间 + 进入系统模块字典中 sys.module['test']: from test  import  a      ##  a 进入局部命令空间  + test进入系统模块字典中(a 不在系统模块字典中): ## test_import.py from a import add fro

编写高质量代码 改善Python程序的91个建议PDF版

链接:https://pan.baidu.com/s/1iGakOIFUaOW9q8ZI7_0QXw 原文地址:http://blog.51cto.com/13929572/2174547

编写高质量代码–改善python程序的建议(二)

原文发表在我的博客主页,转载请注明出处! 建议七:利用assert语句来发现问题断言(assert)在很多语言中都存在,它主要为调试程序服务,能够快速方便地检查程序的异常或者发现不恰当的输入等,可防止意想不到的情况出现.其语法如下: assert expression1 ["," expression2] 其中expression1的值会返回True或者False,当值为False的时候会引发AssertionError,而expression2是可选的,常用来传递具体的异常信息. 不

编写高质量代码改善python程序91个建议学习01

编写高质量代码改善python程序91个建议学习 第一章 建议1:理解pythonic的相关概念 狭隘的理解:它是高级动态的脚本编程语言,拥有很多强大的库,是解释从上往下执行的 特点: 美胜丑,显胜隐,简胜杂,杂胜乱,平胜陡,疏胜密 python定义 #python排序 def quicksort(arr): less=[];greater=[] if len(arr)<=1: return arr pivot=arr.pop() for x in arr: if x<=pivot: less

编写高质量代码改善C#程序的157个建议——建议45:为泛型类型参数指定逆变

建议45:为泛型类型参数指定逆变 逆变是指方法的参数可以是委托或者泛型接口的参数类型的基类.FCL4.0中支持逆变的常用委托有: Func<int T,out TResult> Predicate<in T> 常用委托有: IComparer<in T> 下面例子演示了泛型类型参数指定逆变所带来的好处: class Program { static void Main() { Programmer p = new Programmer { Name = "Mi

编写高质量代码改善C#程序的157个建议——建议27:在查询中使用Lambda表达式

建议27:在查询中使用Lambda表达式 LINQ实际上是基于扩展方法和Lambda表达式的.任何LINQ查询都能通过扩展方法的方式来代替. var personWithCompanyList = from person in personList select new { PersonName = person.Name, CompanyName = person.CompanyID==0?"Micro":"Sun" }; foreach (var item in

编写高质量代码改善C#程序的157个建议——建议26:使用匿名类型存储LINQ查询结果

建议26:使用匿名类型存储LINQ查询结果 从.NET3.0开始,C#开始支持一个新特性:匿名类型.匿名类型有var.赋值运算符和一个非空初始值(或以new开头的初始化项)组成.匿名类型有如下基本特性: 即支持简单类型也指出复杂类型.简单类型必须是一个非空初始值,复杂类型则是一个以new开头的初始化项. 匿名类型的属性是只读的,没有属性设置器,它一旦被初始化就不可更改. 如果两个匿名类型的属性值相同,那么就认为这两个匿名类型相等. 匿名类型可以再循环中用作初始化器. 匿名类型支持智能感知. 匿名

编写高质量代码改善C#程序的157个建议——建议20:使用泛型集合代替非泛型集合

建议20:使用泛型集合代替非泛型集合 在建议1中我们知道,如果要让代码高效运行,应该尽量避免装箱和拆箱,以及尽量减少转型.很遗憾,在微软提供给我们的第一代集合类型中没有做到这一点,下面我们看ArrayList这个类的使用情况: ArrayList al=new ArrayList(); al.Add(0); al.Add(1); al.Add("mike"); foreach (var item in al) { Console.WriteLine(item); } 上面这段代码充分演

编写高质量代码改善C#程序的157个建议——建议12: 重写Equals时也要重写GetHashCode

建议12: 重写Equals时也要重写GetHashCode 除非考虑到自定义类型会被用作基于散列的集合的键值:否则,不建议重写Equals方法,因为这会带来一系列的问题. 如果编译上一个建议中的Person这个类型,编译器会提示这样一个信息: “重写 Object.Equals(object o)但不重写 Object.GetHashCode()” 如果重写Equals方法的时候不重写GetHashCode方法,在使用如FCL中的Dictionary类时,可能隐含一些潜在的Bug.还是针对上一