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

计划

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

书摘

建议11 理解枚举实现的缺陷

  1. 使用类属性
x1, x2, x3 = range(3)
  1. 借助函数(用不太到)
def enum(*posarg, **keysarg):
    return type("Enum", (object,), dict(zip(posarg, xrange(len(posarg))), **keysarg))

Season = enum("Spring", "Summer", "Autumn", Winter=1)
Season.Spring
  1. 使用collections.nametuple(值得学习)
Season = nametuple("Seasons", 'Spring Summer Autumn Winter')._make(range(4))
Season.Spring

建议12 不推荐使用type来进行类型检查

原因:基于内建类型扩展的用户自定义类型,type不能准确返回结果

解决:使用isinstance()函数

例子:

isinstance(2, float)    # False
isinstance("a", (str,unicode))    # True

# 也支持多类型判断
isinstance((2,3), (str,list,tuple))    # True

建议13 尽量转换为浮点型再做除法

原因:两个int相除会发生截断,如3 / 2 = 1

解决:加入浮点型,如 3.0 / 2.0

建议14 警惕eval的安全漏洞

原因:这里涉及到安全漏洞的内容,如果你学过mysql,类似于用户输入一些特定的内容会对系统造成不好的影响

例子:

eval(_import_("os").system("dir"))    # 你的目录就被看光光了
eval(_import_("os").system("del * /Q"))    # 你的文件就被删光光了

建议15 使用enunciate()获取序列化迭代的索引和值

例子:

for i, value in enumerate(data_list):
    print(i, value)
  1. 注意,他是lazy的,可以进行next操作,如e = enumerate(data_list); e.next()

  2. 迭代过程中,要获取字典的key和value,可以使用iteritems()

建议16 分清 == 和 is 的适用场景

  1. == 和 is 是不一样的,is表示的是对象标识符,==表示的是相等

  2. 对于较小的字符串,为了提高系统性能python会保留其值的一个副本,当创建新的字符串的时候直接指向该副本即可,例如 a = “Hi”; b = "Hi" 时,使用==为true,使用也是true

  3. 对于长字符串,python会创建多个对象来存,例如 a = "I am eating the apple"; b = "I am eating the apple" 时,使用==为true,使用is为false(所以记住通常字符串比较是否相同就用==和!=)

建议17 考虑兼容性,尽可能使用Unicode

  1. 如读取的文件是utf-8编码的,直接读取中文会乱码,需要先解码为utf8,在编码为gbk
test_file = open('test.txt','r')
print(test_file.readline())
print(test_file.readline().decode("utf8").encode("gbk"))
  1. python 默认编码是ASCII编码,中文不是ASCII的字符,会报错,解决办法可以在头部加上声明,如 #coding=utf-8
s  = "python 中文测试“
print(s)

三种声明方式:

# 第一种
# coding = <encoding name>

# 第二种
# !/usr/bin/python
# -*- coding: <encoding name> -*-

# 第三种
# !/usr/bin/python
# vim: set fileencoding=<encoding name> :
  1. 使用”+“来连接字符时,两边编码不一致会出错,例如下面展示的,遇到中文会报错
# coding=utf-8
s = "中文测试” + u"Chinese"
print(s)

解决:稍作修改即可

s = "中文测试”.decode("gbk") + u"Chinese"
# 或者
s = "中文测试” + u"Chinese".encode("utf-8")

建议18 构建合理的包层次来管理module

  1. 使用_init_.py文件

这个文件的作用是使包和目录区分,其次可以在该文件中申明模块级别的import语句从而使其变成包级别的可见

例子:想要导入A包下B中的类test

# 如果没有_init_.py文件
from A.B import test

# 如果_init_.py中有from B import test
from A import test

建议19 有节制地使用from … import …语句

  1. 优先使用import a形式或者a.B

  2. 避免使用from a import *

猜你喜欢

转载自www.cnblogs.com/mrdoghead/p/12185423.html
今日推荐