流畅的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. 如果你希望调用者使用函数时一定不能使用关键字参数传参,那么只需要把这些参数放在/前即可;如果你希望调用者使用函数时一定要使用某些参数,且必须为关键字参数传参,那么只需要把这些参数放在*后面即可。
函数声明时,位置参数与默认参数不可穿插。
更明确的说,位置参数必须在默认参数前面。
位置参数通过<变量名=值>的方法赋值,可能会与位置对应赋值规范冲突
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?