流畅的Python第二章

发布时间:2022-06-27 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了流畅的Python第二章脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
# 流畅的Python第二章
 
1. Python标准库用C实现了丰富的序列类型,列举如下。容器序列list、tuple和collections.deque这些序列能存放不同类型的数据。扁平序列str、bytes、bytearray、memoryview和array.array,这类序列只能容纳一种类型。容器序列存放的是它们所包含的任意类型的对象的引用,而**扁平序列里存放的是值而不是引用**。换句话说,扁平序列其实是一段连续的内存空间。由此可见扁平序列其实更加紧凑,但是它里面只能存放诸如字符、字节和数值这种基础类型。序列类型还能按照能否被修改来分类。可变序列list、bytearray、array.array、collections.deque和memoryview。不可变序列tuple、str和bytes。
 
![image-20210629005345597](https://img.liuxiaocs.top/20210629005350490.png)
 
2. 列表推导是构建列表(list)的快捷方式,而生成器表达式则可以用来创建其他任何类型的序列。很多Python程序员都把列表推导(list comprehension)简称为listcomps,生成器表达式(generator expression)则称为genexps。
 
3. 通常的原则是,只用列表推导来创建新的列表,并且尽量保持简短。如果列表推导的代码超过了两行,你可能就要考虑是不是得用for循环重写了。
 
4. Python会忽略代码里[]、{}和( )中的换行,因此如果你的代码里有多行的列表、列表推导、生成器表达式、字典这一类的,可以省略不太好看的续行符。
 
5. 列表推导、生成器表达式,以及同它们很相似的集合(set)推导和字典(dict)推导,在Python 3中都有了自己的局部作用域,就像函数似的。表达式内部的变量和赋值只在局部起作用,表达式的上下文里的同名变量还可以被正常引用,局部变量并不会影响到它们。
 
   ```PYTHON
   In [11]: x = 'ABC'
 
   In [12]: dummy = [ord(x) for x in x]
 
   In [13]: x
   Out[13]: 'ABC'
 
   In [14]: dummy
   Out[14]: [65, 66, 67]
   ```
 
6. 列表推导可以帮助我们把一个序列或是其他可迭代类型中的元素过滤或是加工,然后再新建一个列表。Python内置的filter和map函数组合起来也能达到这一效果,但是可读性上打了不小的折扣。
 
7. 虽然也可以用列表推导来初始化元组、数组或其他序列类型,但是生成器表达式是更好的选择。这是因为生成器表达式背后遵守了迭代器协议,可以逐个地产出元素,而不是先建立一个完整的列表,然后再把这个列表传递到某个构造函数里。前面那种方式显然能够节省内存。生成器表达式的语法跟列表推导差不多,只不过把方括号换成圆括号而已。
 
8. 如果生成器表达式是一个函数调用过程中的唯一参数,那么不需要额外再用括号把它围起来。
 
9. 生成器表达式会在每次for循环运行时才生成一个组合。
 
10. 除了用作不可变的列表,元组还可以用于没有字段名的记录。
 
11. 元组其实是对数据的记录:元组中的每个元素都存放了记录中一个字段的数据,外加这个字段的位置。正是这个位置信息给数据赋予了意义。如果只把元组理解为不可变的列表,那其他信息——它所含有的元素的总数和它们的位置——似乎就变得可有可无。但是如果把元组当作一些字段的集合,那么数量和位置信息就变得非常重要了。
 
12. 元组拆包可以应用到任何可迭代对象上,唯一的硬性要求是,被可迭代对象中的元素数量必须要跟接受这些元素的元组的空档数一致。除非我们用*来表示忽略多余的元素,在“用*来处理多余的元素”一节里,我会讲到它的具体用法。Python爱好者们很喜欢用元组拆包这个说法,但是可迭代元素拆包这个表达也慢慢流行了起来,比如“PEP 3132—Extended Iterable Unpacking”的标题就是这么用的。最好辨认的元组拆包形式就是平行赋值,也就是说把一个可迭代对象里的元素,一并赋值到由对应的变量组成的元组中。
 
13. 另外一个很优雅的写法当属不使用中间变量交换两个变量的值 `b, a = a, b`
 
14. 在元组拆包中使用*也可以帮助我们把注意力集中在元组的部分元素上。用*来处理剩下的元素在Python中,函数用*args来获取不确定数量的参数算是一种经典写法了。
 
15. Python 3里,这个概念被扩展到了平行赋值,在平行赋值中,*前缀只能用在一个变量名前面,但是这个变量可以出现在赋值表达式的任意位置,另外元组拆包还有个强大的功能,那就是可以应用在嵌套结构中。
 
16. 元组已经设计得很好用了,但作为记录来用的话,还是少了一个功能:我们时常会需要给记录中的字段命名。namedtuple函数的出现帮我们解决了这个问题。
 
17. collections.namedtuple是一个工厂函数,它可以用来构建一个带字段名的元组和一个有名字的类——这个带名字的类对调试程序有很大帮助。用namedtuple构建的类的实例所消耗的内存跟元组是一样的,因为字段名都被存在对应的类里面。这个实例跟普通的对象实例比起来也要小一些,因为Python不会用__dict__来存放这些实例的属性。
 
18. 除了跟增减元素相关的方法之外,元组支持列表的其他所有方法。
 
19. 在切片和区间操作里不包含区间范围的最后一个元素是Python的风格,这个习惯符合Python、C和其他语言里以0作为起始下标的传统。这样做带来的好处如下。当只有最后一个位置信息时,我们也可以快速看出切片和区间里有几个元素:range(3)和my_list[:3]都返回3个元素。当起止位置信息都可见时,我们可以快速计算出切片和区间的长度,用后一个数减去第一个下标(stop-start)即可。这样做也让我们可以利用任意一个下标来把序列分割成不重叠的两部分,只要写成my_list[:x]和my_list[x:]就可以了,如下所示。
 
20. `a:b:c` 这种用法只能作为索引或者下标用在[]中来返回一个切片对象:slice(a, b, c)。在10.4.1节中会讲到,对seq[start:stop:step]进行求值的时候,Python会调用seq.__getitem__(slice(start, stop,step))。就算你还不会自定义序列类型,了解一下切片对象也是有好处的。例如你可以给切片命名,就像电子表格软件里给单元格区域取名字一样。

脚本宝典总结

以上是脚本宝典为你收集整理的流畅的Python第二章全部内容,希望文章能够帮你解决流畅的Python第二章所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: