记录博客 ZH-BLOG

Python 内置序列类型、列表推导和生成器

时间:2018-07-28 23:08:51分类:python

Python 内置序列类型

list、 tuple 和 collections.deque 这些序列能存放不同类型的数据。里面存放的对象为对象引用。

str、 bytes、 bytearray、 memoryview 和 array.array, 这类序列只能容纳一种类型。且存放的都是值。

另外

list、 bytearray、 array.array、 collections.deque 和 memoryview 是可变类型。

tuple、 str 和 bytes 是不可变类型。

列表推导和生成器表达式

# 列表推导
colors=['black','white']
sizes=['S','M','L']
tshirts=[(color,size) for color in colors for size in sizes]
print(tshirts)
for tshirt in tshirts:
    print(tshirt)

for color in colors:
    for size in sizes:
        print(color,size)

# 生成器表达式
tshirts=tuple('%s %s'%(color,size) for color in colors for size in sizes)
print(tshirts)

import array
symbols = '$¢£¥€¤'
arr=array.array('I',(ord(symbol) for symbol in symbols))
print(arr)

列表推导、 生成器表达式, 以及同它们很相似的集合(set) 推导和字典(dict) 推导, 在 Python 3 中都有了自己的局部作用域, 就像函数似的。 表达式内部的变量和赋值只在局部起作用, 表达式的上下文里的同名变量还可以被正常引用, 局部变量并不会影响到它们。如:

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

ord() 与 chr() 是 python 内置方法,实现 Unicode code 与字符间的互换。

>>> ord('a')
97
>>> chr(65)
'A'

列表推导与 filter 和 map 的比较

>>> symbols = '$¢£¥€¤'
>>> beyond_ascii = [ord(s) for s in symbols if ord(s) > 127]
>>> beyond_ascii
[162, 163, 165, 8364, 164]
>>> beyond_ascii = list(filter(lambda c: c > 127, map(ord, symbols)))
>>> beyond_ascii
[162, 163, 165, 8364, 164]

map(function, iterable):iterable 中的每一项均会应用到 function 方法中,然后返回一个 iterator。

filter(function, iterable):iterable 中的每一项均会应用到 function 方法中,根据 function 方法中返回 True 的值构建一个 iterator。如果 function = None,将删除 为 False 的值。

>>> filter(None, range(2))

>>> list(filter(None, range(2)))
[1]

推荐使用列表推导!