高效的python学习笔记

第一章:用Pythonic方式来编写代码

第三条:了解bytes,str与unicode的区别

Python3有两种表示字符序列的类型:bytes和str.前者的实例包含原始的8位值;后者的实例包含Unicode字符.
Python2也有两种表示字符序列的类型,分别叫做str和unicode.与Python3不同的是,str的实例包含原始的8位值;而unicode的实例,则包含Unicode字符.
把unicode字符表示为二进制数据(即原始8位值)有很多办法.
要点:
①在Python3中,bytes是一种包含8位值的序列,str'是一种包含Unicode字符的序列.不能以>或+等操作符来混同操作bytes和str实例.
②在Python2中,str是一种包含8位值的序列,unicode是一种包含Unicode字符的序列.如果str只含有7位ASCII字符,那么可以通过相关操作符来同时使用str和unicode。
③从文件中读取/写入二进制文件时,总应该以'rb'或'wb'等二进制模式来开启文件。

第四条:用辅助函数来取代复杂的表达式

 

第五条:用列表推导式来取代map和filter

 

第六条:不要使用含有两个以上表达式的列表推导式

 

第七条:用生成器表达式来改写数据量较大的列表推导式

 

第八条:尽量用enumerate代替range

 

第九条:用zip函数同时遍历两个迭代器

 

第十条:不要在for和while循环后面写else块

 

第十一条:合理利用try/except/else/finally结构中的每个代码块

 

第二章:函数

第十四条:尽量用异常来表示特殊情况,而不要返回None

要点:
①用None这个返回值来表示特殊意义的函数,很容易使调用者犯错,因为None和0及空字符串之类的值,在条件表达式里都会评估为False;
②函数在遇到特殊情况时,应该抛出异常,而不要返回None

第十五条:了解如何在闭包里使用外围作用域中的变量

要点:
①对于定义在某作用域内的闭包来说,它可以引用这些作用域中的变量;
②使用默认方式对闭包内的变量赋值,不会影响外围作用域中的同名变量;
③在Python3中,程序可以在闭包内用nonlocal语句来装饰某个名称,使该闭包能够修改外围作用域中的同名变量;
④在Python2中,程序可以使用可变值(例如,包含单个元素的列表)来实现与nonlocal语句相仿的机制;
⑤除了那种比较简单的函数,尽量不要用nonlocal语句
def sort_priority(values,group):
    pass
Python支持闭包(closure):闭包是一种定义在某个作用域中的函数,这种函数引用了那个作用域中的变量;
Python的函数是一级对象(first-class object):也就是说,我们可以直接引用函数、把函数赋值给变量、把函数当参数传给其他函数,并通过表达式及if语句对其进行比较和判断;
Python使用特殊的规则来比较两个元组。它首先比较各元组中下标为0的对应元素,如果相等,再比较下标为1的对应元素,如果还是相等,那就继续比较下标为2的对应元素,以此类推。

 

第十六条:考虑用生成器来改写直接返回列表的函数

要点:
①使用生成器比把收集到的结果放入列表里返回给调用者更加清晰;
②由生成器函数所返回的那个迭代器,可以把生成器函数体中,传给yield表达式的那些值,逐次产生出来;
③无论输入结果有多大,生成器都能产生一系列输出,因为这些输输入量和输出量,都不会影响它在执行时所消耗的内存。

 

第十七条:在参数上面迭代时,要多加小心

要点:
①函数在输入的参数上面多次迭代时要小心:如果参数是迭代器,那么可能会导致奇怪的行为并错失某些值;
②Python的迭代器协议,描述了容器和迭代器应该如何与iter和next内置函数、for循环及相关表达式相互配合;
③把__iter__方法实现为生成器,即可定义自己的容器类型;
④想判断某个值是迭代器还是容器,可以拿该值作为参数,两次调用iter函数,若结果相同,则是迭代器,调用内置的next函数,即可令该迭代器前进一步。

 

 

 

 

 

第十四条:考虑用生成器来改写直接返回列表的函数

 

 

 

posted @ 2019-11-26 21:11  小鲨鱼~  阅读(212)  评论(0编辑  收藏  举报