第一章:概括
1。理解pythonic概念
具有python特色的代码,一般python代码需要做到美胜丑,显胜隐,杂胜乱,平胜陡, 疏胜密。
2。pythonic代码
命名尽量按照大驼峰或小驼峰。
避免使用容易引起混淆的名称。
不要害怕过长的变量名。
3。python与C语言的不同
python省略了花括号,使用严格的代码缩进方式分隔代码块
将‘’与“”的区别减小。
简化三元操作符。
取出switch--case采用if elif else代替。
4。在代码中添加适当注释
对于关键代码和逻辑,需要添加注释使得后来的开发者能快速读懂代码。
处理不同的逻辑时,采用回车分隔
5。通过适当添加空行使代码布局更加优雅合理
(同上)
6。编写函数的4个原则
函数设计尽量短小。将同类功能封装到一个函数里。
函数申明尽量合理,简单易于使用。
实现版本向下兼容。
一个函数只做一件事,保证函数语句粒度的一致性(同第一条)
7。将常量集中到一个文件
在对于一些具有关键意义的常量,可以集中到一个文件中,使用大写字母标记。
第二章:编程惯用法。
8。利用assert断言语句来发现问题
提前判断结果并抛出其他结果的错误。不推荐直接使用,可以通过类封装。
9。数值交换时不推荐使用中间变量
诸如一下操作
temp = a a = b b = temp ========= a,b = b,a
可以直接使用python特性语句处理
10。充分利用lazy evaluation(惰性计算)
当只有真正需要执行的时候,才计算表达式的值。如if判断条件时 当第一个or条件成立则不运行第二个or条件。and条件亦然。
节省空间,使得无限循环的数据结构成为可能,在使用yieid时可以构建迭代器,当只有迭代器被调用时才会运行程序占用内存。
11。理解枚举替代现实的缺陷
在python中没有指定的枚举类型,但是可以借助类属性和函数来定义一个枚举类。
12。不推荐使用type来进行类型检查
python是一个弱类型语言,对于数据类型的要求并不是强制的,所以,而且有些类型可以进行隐式类型转换。
建议只在出错的情况下通过抛出异常。
可以使用isinstance来获取正确的python数据类型
13。尽量转换为浮点类型后再做除法。
python语言对于数字不是特别敏感,而且在设计之初,参考了c语言中的long类型作为python的整数类型,double作为浮点类型,
而且计算的返回类型和操作数类型是相同的,由于c语言是事先申明类型,所以这一特性对于c来说没有太大的关系,而python会将返回结果直接转换成整数,导致结果有所偏差。
14。警惕eval()的安全漏洞
如同sql的注入攻击,eval在获取python语句运行时也是傻瓜型运行,即获取语句直接运行,如果使用者在语句中写入比较危险的python语句,
则对系统的损害是很大的。
15。使用enumerate()获取序列迭代的索引和值
对于这种既需要使用元素值,又需要使用索引值的需求,有很多种实现方法。
方法一:在每次循环中对索引变量进行自增。
l1 = ["a", "b", "c"] index = 0 for i in li: print("index:", index, "element:", i)
方法二:使用range()和len()方法结合
li 1 = ["a", "b", "c"] for i in range(len(li1)): print(i, li[i])
方法三:使用while循环,用len()获取循环次数
li 1 = ["a", "b", "c"] index = 0 while index< len(li): print(index, li[index]) index +=1
方法四:使用zip()
li 1 = ["a", "b", "c"] for i, e in zip(rage(len(li1)), li1): print(i, e)
方法五:使用emumerate() ,这种方法是最优方法。
li 1 = ["a", "b", "c"] for i, e in enumerate(li1): print(i, e)
16。分清== 与is的使用场景
简单来说,is是比较对象的存储地址,==则是比较值。
17。考虑兼容性,尽可能使用Unicode。
18。构建合理的包层次来管理module
python中所有py文件都是一个包,python语言不像强类型语言一样,有专门功能的模板,所以对于模块的定义需要开发者自行约束。
在每个包文件中都有一个__init__,当他被第一次调用的是后,就会运行,充分利用init来实现包的初始化。
第三章:基础语法
19。有节制地使用from---import 语句
一般情况下使用import A的形式
有节制地使用from---import 语句
尽量不要使用from A import *的模式。因为这样会污染命名空间,并且无法清晰地表示导入了那些对象
防止循环导包 的情况发生,即A模块导入了B模块,B模块又导入了A模块。当遇到此种问题是时,可以在调用该模块的函数里调用模块,防止循环调用
20。优先使用absolute import来导入模块
21。i+=1不等于 ++i
i+=1代表i的自增,而++i仅仅表示i的正数的正数,也就是i本身。
22。使用with自动关闭资源
在py2的版本中我们会使用文件句柄的方式来打开一个文件,但是这种方式很容易忘记关闭连接句柄,造成文件写入错误。