10天读完《编写高质量代码 改善Python编程的91个建议》——Day5

计划

Hello,这是一个读书摘要的计划,10天读完《编写高质量代码 改善Python编程的91个建议》,我会每天摘录大概9个书中提到的建议,分享在这里,也作为自己的打卡任务。关于这本书,他并不是python入门的教学书籍,而是一本用来改善编程习惯和风格的书,可以帮助我们写出漂亮的,也就是符合pythonic的python代码。书中的知识难度不会很大,每天看几条,然后落实到实际编程中加以巩固,就能融会贯通,久而久之也就能养成好的编程习惯。如果你没有时间看原书,那么直接看我的摘要就好啦,遇到感兴趣的再去详细了解也会方便很多,当然这里摘要的内容是我觉得有用的部分啦。注意,一定要会运用!

书摘

建议38 使用copy模块深拷贝对象

  1. 浅拷贝(shallow copy):拷贝父对象,不会拷贝对象的内部的子对象。

  2. 深拷贝(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

  1. ConfigParser的基础知识直接看传送门就好了。

  2. 下面再说几个注意点:

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文件

  1. 通常,csv模块可以满足日常需求,如reader(), csv.writer(), csv.DictReader(), csv.DictWriter(),但是对于大型csv文件,使用pandas会更好

  2. pands(Python Data Analysis Library)专门用来做数据分析,支持多种文件格式处理,包括csv,hdfs,html等等,它主要支持两类数据结构:

a)Series:类似数组带索引,与NumPy兼容,可以用obj.values(), obj.index() 来分别获取值和索引,用isnull() 和 notnull() 来检查数据丢失

b)DataFrame:类似于电子表格(二维数组)

  1. pandas处理csv主要使用read.csv()和to_csv()两个函数,前者返回DataFrame

  2. 对文件分块处理并返回一个可迭代对象,举个例子

import pandas as pd
reader = pd.read_table('data.csv', chunksize=10,iterable=True)    # 每次输出为包含10条数据的块
  1. 当文件格式类似时,支持多文件合并处理

建议43 一般情况使用ElementTree解析XML

1. 最广为人知的两个解析XML文件的Python模块:a)xml.dom.minidom b)xml.sax,前者占用内存多,后者处理过程复杂。

2. 更好的选择:ElementTree

因为它使用简单,内存消耗低于Dom,支持Xpath查询,便于获取节点

3. 如果XML文件是GB级别的,可使用lxml模块

建议44 理解模块pikle优劣

  1. pickle(cPickle)是最通用的序列化模块,其他的还有json,marshal,shelve等

  2. pickle.dump(obj,file[,protocol]) 序列化数据到一个文件描述符

  3. load(file)反序列化

  4. 例子,

序列化:

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

  1. json 使用教程看这里

  2. dump/dumps 序列化;load/loads 反序列化

  3. 优势:使用简单,可读性好,易修改,跨平台,扩展性强

  4. 比较pickle,Python标准库中的json的性能略逊于pickle和cpickle。

建议46 使用traceback获取栈信息

  1. debug时候,可以traceback.print_exc() 打印出错误信息(现场信息),包括错误类型,错误对应的值,具体trace信息等
上一篇:python全栈day5


下一篇:Day5 - D - Conscription POJ - 3723