Effective Python:编写高质量的Python代码的59个有效方法(1-3)

第一章
用Pythonic方式来思考

  • 第一条:确认自己所用的Python版本:
    (1)查看python2系列版本
    python –version
    (2)查看python3系列版本
    python3 –version
    (3) 其他
    运行程序时,可以在内置的sys模块查询相关的值,来确定当前使用的python版本
    import sys
    print (sys.version_info)
    print (sys.version)
    (4)要点
    首先要确保操作系统的命令行中运行python时和你想用的python版本相符;python2系列到2020年不再进行相关维护,推荐使用python3系列。
  • 第二条:遵循PEP8风格指南
    (1)PEP8:《Python Enhancement Proposal #8》(8号Python增强提案),是针对Python代码格式而编订的风格指南。利于阅读,利于理解,利于修改。
    1>PEP8列出很多细节,随python更新持续更新中,有时间有兴趣的小伙伴可以把整个指南详细阅读(http://www.python.org/dev/peps/pep-0008)。
    2>几条绝对应该遵守的规则
    空白(whitespace):使用需谨慎
    (1)使用空格(space)来表示缩进,而不要使用制表符(tab),注意不要混用,否则会报错;
    (2)和语法相关的每一层缩进都用四个空格来表示,选择pycharm/sublime text 编辑器会自动缩进;
    (3)每行的字符数不应超过79,如果每一行过长,在sublime text里面可以设置换行(view-word wrap);
    (4)对于占据多行的长表达式,除了首行之外其余各行都应该在通常的缩进级别上再加4个空格;
    (5)函数与类之间用两个空行隔开;
    (6)同一类中,各方法之间用一个空行隔开;
    (7)使用下标获取列表元素、调用函数或给关键字参数赋值的时候,不要在两旁添加空格;
    (8)为变量赋值时,赋值符号左右两侧各自写上一个空格,且只写一个就好。

命名:PEP8提倡采用不同的命名风格来编写python代码的各个部分,以便根据命名看出他们在python语言中的角色。
(1)函数、变量及属性用小写字母,各单词之间下划线相连,例如,lowercase_underscore;
(2)受保护的实例属性,应该以单个下划线开头,例如,_leading_underscore(讲解教程:https://blog.csdn.net/u012193416/article/details/89392958);
(3)私有的实例属性,应该以两个下划线开头,例如,__double_leading_underscore(讲解教程:https://blog.csdn.net/u012193416/article/details/89392958);
(4)类与异常,应该以每个单词首字母均大写的形式来命名;
(5)模块级别的常量,应该全部采用大写字母来拼写,各个单词之间以下划线相连;
(6)类中的实例方法(instance method),应该把首个参数命名为self,以表示该对象自身;
(7)类方法(class method)的首个参数,应该命名为cls,以表示该类自身。


表达式和语句:“每件事都应该有直白的做法,而且最好只有一种。”
(1)采用内联形式的否定词,而不要把否定词放在整个表达式前面,如if a is not b而不是if not a is b;
(2)不要通过检测长度的方法(如if len(somelist)==0)来判断somelist是否为[ ]或‘ ’等空值,而是 if not somelist这种来判断,它会假定:空值将自动评估为false;
检测非控制时也应该如此;
(3)不要编写单行的if,for,while,except复合语句,而是把这些语句分成多行,以示清晰;
(4)import 语句应该放在文件开头;
(5)引入模块的时候,总是应该使用绝对名称,而不应该根据当前路径使用相对名称。例如,引入bar包中的foo模块时,应该完整的写出from bar import foo,而不是简单的写为import foo;
(6)如果一定要以相对名称来写imoprt,那就采用明确写法:from . import foo.
(7)文件中的import语句应该按照顺序划分成三个部分,分别表示标准库模块,第三方模块和自用模块。在每一部分,各import应该按照模块的字母顺序来排列。


  • 第三条:了解bytes、str、unicode的区别
    首先来看一下,python2和python3字符类型的区别:

    图片.png
    (1)Unicode转成二进制:encode;
    (2)二进制转成Unicode:decode。
    需要说明的是
    编写python程序的时候,一定要把编码和解码操作放在界面最外围来做。程序的核心部分应该用Unicode字符类型(python3中的str和python2中的Unicode),且不要对字符编码做任何假设。
    这种办法既可以令程序接受多种类型的文件编码,又可以保证输出的文本信息只采用一种编码形式(utf-8)。
    由于字符类型有区别,代码经常会出现两种常见的使用情景:
    (1)开发者需要原始八位值,这些八位值表示以UTF-8格式(或者其他编码形式)来编码的字符;
    (2)开发者需要操作没有特定编码形式的Unicode字符。
    所以,需要编写两个辅助函数(helper),以便在这两种情况中转换:
    函数一:
    python3中:

    图片.png

    函数二:
    python2中:

    图片.png

    需要注意的地方
    可能会出现在python3中;
    如果通过内置的open函数获取了文件句柄,那么请注意,该句柄默认会采用UTF-8编码格式来操作文件。而在python2中,文件操作的默认编码格式是二进制形式。如此,会导致程序出现奇怪的错误,例如,现在要向文件中随机写入一些二进制数据。下面这种做法在python2中可以正常操作,但python3中不行。

    图片.png

    发生上述异常的原因在于,python3给open函数添加了名为encoding的新参数,而这个新参数的默认值为‘utf-8’。这样在文件句柄上进行read和write操作时,系统就要要求开发者必须传入包含unicode字符的str实例,而不接受包含二进制数据的bytes实例。
    解决这个问题的办法:
    必须使用二进制写入模式(‘wb’)来开启待操作的文件,如下所示:

    图片.png

好了,本回就先学三条吧,再好好消化下。。。
由于各种不可抗拒的问题存在吧,简书写的是零零碎碎,但是这本书一定会从头到尾好好啃
感谢kevinzjy师兄对我的帮助。

你或许想:《去原作者写文章的地方

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论