Python开发者用Pythonic这个形容词来描述具备特定风格的代码。这种风格是你们在使用Python语言进行编程并相互协做的过程当中逐渐造成的习惯。那么,如何以改风格完成常见的Python编程工做呢?本节将会回答这个问题。前端
第一条:确认本身所用的Python版本python
第二条:遵循PEP8风格指南程序员
第三条:了解bytes、str与unicode的区别编程
第四条:用辅助函数来取代复杂的表达式后端
第五条:了解切割序列的方法api
第六条:在单次切片操做内,不要同时指定start、end和strideide
第七条:用列表推导来取代map和filter函数
第八条:不要使用含有两个以上表达式的列表推导ui
第九条:用生成器表达式来改写数据量较大的列表推导编码
第十条:尽可能用enumerate取代range
第十一条:用zip函数同时遍历两个迭代器
第十二条:不要在for和while循环后面写else块
第十三条:合理利用try/exceot/else/finally结构中的每一个代码块
C:\Users\fei\Desktop>python --version Python 3.6.5 import sys sys.version Out[14]: '3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)]'
要点1:有两个版本的Python处于活跃状态,它们是:Python2和Python3
要点2:有不少中流行的Python运行时环境,例如: Cpython, Jython,IronPython以及PyPy等
要点3:在操做系统的命令行中运行Python时,请确保该Python的版本与你想使用的Python版本相符。
要点4:因为Python社区把开发重点放在Python3上,因此在开发后序项目时,应该优先考虑采用Python3
《Python Enhancement Proposal #8》(8号Python加强提案)又叫PEP8,它是针对Python代码格式而编订的风格指南。尽管能够在保证语法正确的前提下随意编写Python代码,可是采用一致的风格书写代码能够令代码更加易懂、更加易读。
完整版PEP8指南
下面列出几条绝对应该遵照的规则
空白: Python中的空白( whitespace)会影响代码的含义。 Python程序员使用空白 的时候尤为在乎,由于它们还会影响代码的清晰程度。
使用 space(空格)来表示缩进,而不要用tab(制表符)。
和语法相关的每一层缩进都用4个空格来表示。
每行的字符数不该超过79。
对于占据多行的长表达式来讲,除了首行以外的其他各行都应该在一般的缩进 级别之上再加4个空格。
文件中的函数与类之间应该用两个空行隔开。
在同一个类中,各方法之间应该用一个空行隔开。
在使用下标来获取列表元素、调用函数或给关键字参数赋值的时候,不要在两 旁添加空格。
为变量赋值的时候,赋值符号的左侧和右侧应该各自写上一个空格,并且只写 个就好。
命名:PEP8提倡采用不一样的命名风格来编写 Python代码中的各个部分,以便在阅 读代码时能够根据这些名称看出它们在 Python语言中的角色。
函数、变量及属性应该用小写字母来拼写,各单词之间如下划线相连,例如lowercase_underscore。
受保护的实例属性,应该以单个下划线开头,例如, leading underscore
私有的实例属性,应该以两个下划线开头,例如, double leading underscore
类与异常,应该以每一个单词首字母均大写的形式来命名,例如, Capitalized Word 口模块级别的常量,应该所有采用大写字母来拼写,各单词之间如下划线相连, 例如, ALL CAPS。
类中的实例方法( instance method)。应该把首个参数命名为sef,以表示该对象自身
类方法( lass method)的首个参数,应该命名为cbs,以表示该类自身。
表达式和语句:( The Zen of Python)( Python之禅)中说:“每件事都应该有直白的作 法,并且最好只有一种。”PEP8在制定表达式和语句的风格时,就试着体现了这种思想。
采用内联形式的否认词,而不要把否认词放在整个表达式的前面,例如,应该 写 if a is not b而不是 if not a is b。
不要经过检测长度的办法(如 if len(somelist)=0)来判断 somalis是否为目 或”等空值,而是应该采用 if not somelist这种写法来判断,它会假定:空值将 自动评估为 False
检测 somalis是否为]或hi等非空值时,也应如此, if somelist语句默认会把 非空的值判断为Tme。
不要编写单行的i语句、for循环、 while循环及cxp复合语句,面是应该把 这些语句分红多行来书写,以示清晰。
import语句应该老是放在文件开头。
引入模块的时候,老是应该使用绝对名称,而不该该根据当前模块的路径来 使用相对名称。例如,引入bar包中的foo模块时,应该完整地写出 from bar import foo,面不该该简写为 import foo。
若是必定要以相对名称来编写ipon语句,那就采用明确的写法: from import food 口文件中的那些mpon语句应该按顺序划分红三个部分,分别表示标准库模块 第三方模块以及自用模块:在每一部分之中,各如m语句应该按模块的字母 顺序来排列。
要点1:当编写Python代码时,老是应该遵循PEP8风格指南。
要点2:与广大Python开发者采用同一套代码风格,可使项目更利于多人协做。
要点3: 采用一致的风格来编写代码,能够令后续的修改工做变得更为容易。
Python3有两种表示字符序列的类型:bytes和str。前者的实例包含原始的8位值;后者的实例包含Unicide字符。
Python2也有两种表示字符序列的类型,分别叫作str和unicode。与Python3不一样的是,str的实例包含原始的8位值;而unicode的实例,则包含Unicode字符。
注:unicode --> 二进制 encode方法
二进制 --> unicode decode方法
要点:
要点1:在Python3中,bytes是一种包含8位值的序列,str是一种包含unicoe字符的序列。开发者不能以>或+等操做符来混同操做bytes和str实例
要点2:在Python2中,str是一种包含8位值的序列,unicode是一种包含Unicode字符的序列。若是str只包含有7位ASCII字符,那么能够经过相关额操做符同时使用str与unicode。
要点3:在对输入的数据进行操做以前,使用辅助函数来保证字符序列的类型与开发者的指望相符(有的时候,开发者想操做以UTF-8格式来编码的8位值,有的时候,则想操做Unicode字符)。
要点4:从文件中读取二进制数据,或向其中写入二进制数据时,总应该以‘rb'或‘wb’等二进制模式来开启文件。
要点1:开发者很容易过分运用Python的语法特性,从而写出那种特别复杂而且难以理解的单行表达式
要点2:请把复杂的表达式移入辅助函数之中,若是要反复使用相同的逻辑,那就更应该这样作
要点3:使用if/else表达式,要比用or或and这样的Boolean操做符写成的表达式更加清晰。
要点1:不要写多余的代码:当start索引为0,或end索引为序列长度时,应该将其省略。
要点2:切片操做不会计较start与end索引是否越界,这使得咱们很容易就能从序列的前端或后端开始,对其进行范围固定的切片操做(如a[:20]或a[-20:])。
要点3:对list赋值的时候,若是使用切片操做,就会把原列表处在相关范围内的值替换成新值,即便他们的长度不一样也依然能够替换。
要点5:若是对赋值左侧的列表使用切片,而又没有指定起止索引,那么系统会把右侧的新值复制一份,并好用这份拷贝替换左侧列表的所有内容,而不会从新分配新的列表。
a = [1,2,3,4,5] b = a id(a) Out[4]: 588602575880 id(b) Out[5]: 588602575880 c = a[:] id(c) Out[7]: 588602487112 a Out[8]: [1, 2, 3, 4, 5] id(a) Out[9]: 588602575880 a[2:4] = [10,11] id(a) Out[11]: 588602575880 a Out[12]: [1, 2, 10, 11, 5] a[2:4] = [2,2,2,2,2] a Out[14]: [1, 2, 2, 2, 2, 2, 2, 5] id(a) Out[15]: 588602575880
要点1:既有start和end,又有stride的切割操做,可能会使人费解。
要点2:尽可能使用stride为整数,切不带start或end索引的切割操做。尽可能避免用负数作sride.
要点3:再同一个切片操做内,不要同时使用start、end和stride。若是确实须要执行这种操做,那就考虑将其拆解为两条赋值语句,其中一角作范围切割,另外一条作步进切割,或考虑使用内置函数itertools模块中的islice。
要点1: 列表推导比内置的map和filter函数清晰, 由于它无需额外编写lanbda表达式
要点2: 列表推导能够跳过输入列表中的某些元素,若是改用map来作,那就必须辅以filter方能实现
要点3:字典和集合也支持列表推导
要点1: 列表推导支持多级循环,每一级循环也支持多项条件
要点2: 超过两个表达式的列表推导式很难理解的,应该尽可能避免
要点1: 当输入数据量较大时,列表推导可能会由于占用太多内存而出问题
要点2: 由生成器表达式所返回的迭代器,能够逐次产生输出值,从而避免了内存用量问题。
要点3: 把某个生成器表达式所返回的迭代器,放在另外一个生成器表达式的for子表达式中,便可将两者组合起来
要点4: 串在一块儿的生成器表达式执行速度很快。
要点1:enumerate函数提供了一种精简的写法,能够在遍历迭代器时获知每一个元素的索引
要点2: 尽可能用enumerate来改写那种将range与下标访问相结合的序列遍历代码
要点3: 能够给enumerate提供第二个参数,已制定开始技术是所用的值(默认为0)
要点1: 内置的zip函数能够平行的遍历多个迭代器
要点2: Python3中的zip至关于生成器,会在遍历过程当中逐次产生元组,而Python2中的zip则是直接把元组彻底生成好,并一次性返回整份列表。
要点3: 若是提供的迭代器长度不等,那么zip就会自动提早终止
要点4:itertools内置模块中的zip_longest函数能够平行地遍历多个迭代器,而不用在意它们的长度是否相等
要点1: Python有种也属于语法,可在for及while循环的内部语句块以后紧跟一个else块
要点2: 只有当整个循环主体都没遇到break语句时,循环后面的else块才会执行
要点3: 不要在循环后面使用else块,由于这种写法既不直观,又容易引发误解
要点1: 不管try块是否发生异常,均可利用try/finally复合语句中的finally块来执行清理工做
要点2: else块能够用来缩减try块中的代码量,并把没有发生异常时所要执行的语句与try/except代码块隔开
要点3: 顺利运行try块后,若想使某些操做能在finally块的清理代码以前执行,则可将这些操做写到else块中。