流畅的python读书笔记

1.虽然也可以用列表推导来初始化元组、 数组或其他序列类型, 但是生成器表达式是更好的选择。 这是因为生成器表达式背后遵守了迭代器协议, 可以逐个地产出元素, 而不是先建立一个完整的列表, 然后再把这个列表传递到某个构造函数里。 前面那种方式显然能够节省内存。生成器表达式的语法跟列表推导差不多, 只不过把方括号换成圆括号而已。
2.Python标准库用C实现了丰富的序列类型。

容器序列:list、tuple和collections.deque这些序列能存放不同类型的数据。

扁平序列:str、bytes、bytearray、memoryview和array.array,这类序列只能容纳一种类型数据。

容器序列存放的是它们所包含的任意类型的对象的引用,而扁平序列里存放的是值而不是引用。换句话说,扁平序列其实是一段连续的内存空间。

序列类型还能按照能否被修改来分类。

可变序列:list、bytearray、array.array、collections.deque和memoryview。

不可变序列:tuple、str和bytes。

python可变对象中改变其值其内存地址不改变;不可变对象不能改变值,只能通过新建一个不可变对象;相同值的不可变对象内存地址都相同,相同值的可变对象内存地址不一定相同

 3.python中除了dict外在collections模块中,还有defaultdict可以给不存在的键设默认值,OrderedDict使得键能够保持顺序,ChainMap可以容纳数个不同的映射对象,然后在进行键查找操作的时候,这些对象会被当做一个整体被逐个查找,直到键被找到为止。Counter给键准备一个整数计数器,每次更新一个键的时候都会增加这个计数器,UserDict让用户可以继承写子类。

 4.由于字典使用了散列表,而散列表又必须是稀疏的,这导致它在空间上的效率低下。举例而言,如果你需要存放数量巨大的记录,那么放在由元祖或是具名元祖构成的列表中会是比较好的选择。用元组取代字典就能节省空间的原因有两个:其一是避免了散列表所耗费的空间,其二是无需把记录中字段的名字在每个元素里都存一遍。

5."字符"的最佳定义是Unicode字符。str对象中获取的元素是Unicode字符。Unicode标准把字符的标识和具体的字节表述进行了如下明确区分。a.字符的标识,即码位,是0~1114111的数字,在Unicode标准中以4~6个十六进制数字表示,而且加前缀“U+”。例如,字母A的码位是U+20AC。b.字符的具体表述取决于所用的编码。编码是在码位和字节序列之间转换时使用的算法。例如,在UTF-8编码中,A(U+0041)的码位编码成单个字节\x41。把码位转换成字节序列的过程时编码;把字节序列转换成码位的过程是解码。多数非UTF编解码器只能处理Unicode字符的一小部分子集。把文本转换成字节序列时,如果目标编码中没有定义某个字符,那就会抛出UnicodeEncodeError异常。不是每一个字节都包含有效地ASCII字符,也不是每一个字符序列都是有效地UTF-8或UTF-16。因此,把二进制序列转换成文本时,如果假设是这两个编码中的一个,遇到无法转换的字节序列时会抛出UnicodeDecodeError。

6. 如果你希望调用者使用函数时一定不能使用关键字参数传参,那么只需要把这些参数放在/前即可;如果你希望调用者使用函数时一定要使用某些参数,且必须为关键字参数传参,那么只需要把这些参数放在*后面即可。

函数声明时,位置参数与默认参数不可穿插。
更明确的说,位置参数必须在默认参数前面。

位置参数通过<变量名=值>的方法赋值,可能会与位置对应赋值规范冲突

posted @ 2020-10-30 11:05  ~宁静致远~  阅读(222)  评论(0编辑  收藏  举报