计划
Hello,这是一个读书摘要的计划,10天读完《编写高质量代码 改善Python编程的91个建议》,我会每天摘录大概9个书中提到的建议,分享在这里,也作为自己的打卡任务。关于这本书,他并不是python入门的教学书籍,而是一本用来改善编程习惯和风格的书,可以帮助我们写出漂亮的,也就是符合pythonic的python代码。书中的知识难度不会很大,每天看几条,然后落实到实际编程中加以巩固,就能融会贯通,久而久之也就能养成好的编程习惯。如果你没有时间看原书,那么直接看我的摘要就好啦,遇到感兴趣的再去详细了解也会方便很多,当然这里摘要的内容是我觉得有用的部分啦。注意,一定要会运用!
书摘
建议38 使用copy模块深拷贝对象
浅拷贝(shallow copy):拷贝父对象,不会拷贝对象的内部的子对象。
深拷贝(deep copy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
具体展开内容点这里!
建议39 使用counter进行计数统计
1. 不同数据结构实现
dict;defaultdic;set;list各不相同
2. 更推荐的方法是,使用collections.Counter
from collections import Counter
data = ['a', '1', 'b', '2.4', 'a', '3', '1', 'a']
print Counter(data)
# Counter({'a': 3, '1': 2, 'b': 1, '2.4': 1, '3': 1})
3. Counter的三种初始化方式
```python
Counter("success") # 可迭代对象
Counter(s=3, c=2, e=1, u=1) # 关键字参数
Counter({'s':3,'c':2,'e':1,'u':1) # 字典
4. 使用方法
elements() # 获取Counter中的key值
most_common() # 找前N个高频元素和次数
update() # 更新元素统计
substract() # 统计减少
建议40 深入掌握ConfigParser
ConfigParser的基础知识直接看传送门就好了。
下面再说几个注意点:
a)getboolean()函数,”1”, “yes”, “true”, and “on”, 转换为True,”0”, “no”, “false”, and “off”, 转换为False,其他都是error
b)[default]节,如果读取的配置不在指定节里,Configparser会在[default]节中寻找
c)支持格式化,举个例子
先创建一个配置文件person.conf
[default]
conn_str = my name is %(name) and I'm %(age) years old
[p1]
name = doghead
age = 6
然后读取配置
import ConfigParser
conf = ConfigParser.ConfigParser()
conf.read('person.conf')
print(conf.get['p1','conn_str])
# my name is doghead and I'm 6 years old
建议41 使用argparse处理命令行参数
详细内容,直接点传送门
建议42 使用pandas处理大型csv文件
通常,csv模块可以满足日常需求,如reader(), csv.writer(), csv.DictReader(), csv.DictWriter(),但是对于大型csv文件,使用pandas会更好
pands(Python Data Analysis Library)专门用来做数据分析,支持多种文件格式处理,包括csv,hdfs,html等等,它主要支持两类数据结构:
a)Series:类似数组带索引,与NumPy兼容,可以用obj.values(), obj.index() 来分别获取值和索引,用isnull() 和 notnull() 来检查数据丢失
b)DataFrame:类似于电子表格(二维数组)
pandas处理csv主要使用read.csv()和to_csv()两个函数,前者返回DataFrame
对文件分块处理并返回一个可迭代对象,举个例子
import pandas as pd
reader = pd.read_table('data.csv', chunksize=10,iterable=True) # 每次输出为包含10条数据的块
- 当文件格式类似时,支持多文件合并处理
建议43 一般情况使用ElementTree解析XML
1. 最广为人知的两个解析XML文件的Python模块:a)xml.dom.minidom b)xml.sax,前者占用内存多,后者处理过程复杂。
2. 更好的选择:ElementTree
因为它使用简单,内存消耗低于Dom,支持Xpath查询,便于获取节点
3. 如果XML文件是GB级别的,可使用lxml模块
建议44 理解模块pikle优劣
pickle(cPickle)是最通用的序列化模块,其他的还有json,marshal,shelve等
pickle.dump(obj,file[,protocol]) 序列化数据到一个文件描述符
load(file)反序列化
例子,
序列化:
import cPickle as pickle
my_data = {'name': 'doghead', 'age': '6', 'gender': 'male'}
fp = open('test.dat','wb') # 需要写入的文件
pickle.dump(my_data,fp) # 使用dump进行序列化
fp.close()
反序列化:
fp = open('test.dat','wb')
out = pickle.load(fp)
print(out)
# {'name': 'doghead', 'age': '6', 'gender': 'male'}
建议45
json 使用教程看这里。
dump/dumps 序列化;load/loads 反序列化
优势:使用简单,可读性好,易修改,跨平台,扩展性强
比较pickle,Python标准库中的json的性能略逊于pickle和cpickle。
建议46 使用traceback获取栈信息
- debug时候,可以traceback.print_exc() 打印出错误信息(现场信息),包括错误类型,错误对应的值,具体trace信息等