Fluentpython 数据结构-列表推导

Fluentpython 数据结构

2.1 内置序列类型概览

Python 标准库用 C 实现了丰富的序列类型,列举如下。

容器序列
  list、tuple 和 collections.deque 这些序列能存放不同类型的数据。
扁平序列
  str、bytes、bytearray、memoryview 和 array.array,这类序列只能容纳一种类型。

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

可变序列
  list、bytearray、array.array、collections.deque 和memoryview。
不可变序列
  tuple、str 和 bytes。

列表推导和生成器表达式

列表推导是构建列表(list)的快捷方式,而生成器表达式则可以用来创建其他任何类型的序列。
很多 Python 程序员都把列表推导(list comprehension)简称为listcomps,生成式表达器(generator expression)则称为 genexps

列表推到示例:

>>> symbols = '$¢£¥€¤'
>>> codes = [ord(symbol) for symbol in symbols]
>>> codes
[36, 162, 163, 165, 8364, 164]

如果不用列表推导的实现方法:

>>> symbols = '$¢£¥€¤'
>>> codes = []
>>> for symbol in symbols:   # 使用for循环
... codes.append(ord(symbol))
...
>>> codes
[36, 162, 163, 165, 8364, 164]

列表推导也可能被滥用,通常的原则是,只用列表推导来创建新的列表,并且尽量保持简短。如果列表推导的代码超过了两行,你可能就要考虑是不是得用 for 循环重写了。

Python 2.x 中,在列表推导中 for 关键词之后的赋值操作可能会影响列表推导上下文中的同名变量, python3中是不会出现的。 如下:

PYTHON3                                 PYTHON2
>>> x = 'ABC'                           >>> x = 'ABC'
>>> dummy = [ord(x) for x in x]         >>> dummy = [ord(x) for x in x]
>>> x                                   >>> x 
'ABC'                                   'C'
>>> dummy                               >>> dummy
[65, 66, 67]                            [65, 66, 67]
>>>                                     >>>

ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)
的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或Unicode 数值,
如果所给的 Unicode 字符超出了你的 Python 定义范围,则会引发一个 TypeError 的异常。

>>> ord("e")
101
>>> chr(101)
'e'

你可能感兴趣的:(Fluentpython 数据结构-列表推导)