Python 列表推导及优先级队列的实现
这一篇是《流畅的 python》读书笔记。主要介绍列表、列表推导有关的话题,最后演示如何用列表实现一个优先级队列。 Python 内置序列类型 Python 标准库用 C 实现了丰富的序列类型: 容器序列: list、tuple 和 collections.deque 这些序列能存放不同类型的数据。 扁平序列: str、bytes、bytearray、memoryview 和 array.array,这类序列只能容纳一种类型。 容器序列存放的是它们所包含的任意类型的对象的引用,而扁平序列里存放的是值而不是引用(也可以说扁平序列其实存放的是一段连续的内存空间)。 如果按序列是否可被修改来分类,序列分为可变序列 和 不可变序列: 可变序列 list、bytearray、array.array、collections.deque 和 memoryview。 不可变序列 tuple、str和 bytes。 下图显示了可变序列(MutableSequence)和不可变序列(sequence)的差异: 从这个图可以看出,可变序列从不可变序列那里继承了一些方法。 列表推导和生成器表达式 列表(list)是 Python 中最基础的序列类型。list 是一个可变序列,并且能同时存放不同类型的元素。 列表的基础用法这里就不再介绍了,这里主要介绍一下列表推导。 列表推导和可读性 列表推导是构建列表的快捷方式,并且有更好的可读性。 先看下面两段代码: #1. 把一个字符串变成 unicode 码位的列表 >>> symbols = '$&@#%^&*' >>> codes = [] >>> for symbol in symbols: codes.append(ord(symbol)) >>> codes [36, 38, 64, 35, 37, 94, 38, 42] #2. 把一个字符串变成 unicode 码位的列表 使用列表推导 >>> symbols = '$&@#%^&*' >>> codes = [ord(s) for s in symbols] >>> codes [36, 38, 64, 35, 37, 94, 38, 42] 对比发现,如果理解列表推导的话,第二段代码比第一段更简洁可读性也更好。 当然,列表推导也不应该被滥用,通常的原则是只用列表推导来创建新的列表,并且尽量保持简短。 如果列表推导超过两行,就应该考虑要不要使用 for 循环重写了。 ...