python列表推导式与生成器表达式

引言

列表推导式只能用于构建列表,生成器表达式则可以用来创建任何类型的序列。

列表推导式

列表推导式格式

列表推导式是构建列表的一种快捷方式,具体格式如下:

l = [func(x) for x in it]
  • 其中it是一个可迭代对象
  • x是循环中用于迭代的变量
  • func是对迭代的每一个值做的操作,当然也可以什么都不做

比如如下例子,可构建出列表['A', 'B', 'C']。

l = [x for x in "ABC"]

列表推导式作用域

python3中,列表推导式是有自己的局部作用域的,这避免了python2中的变量泄露问题。

多变量列表推导式

上边例子中只有一个变量x,其实可以有多个的。
如下例子,可以将colors和sizes两个列表中的元素两两配对,最终生成一个元素是二维元组的列表。

colors = ['black', 'white']
sizes = ['S', 'M']
 
tshirts = [(color, size) for color in colors
                        for size in sizes]

结果为:

[('black', 'S'), ('black', 'M'), ('white', 'S'), ('white', 'M')]

生成器表达式

生成器表达式格式与列表推导式唯一的区别就是把中括号换成了小括号。

生成器表达式遵守迭代器协议,可以逐个产生元素。

  • 如下例子,生成器表达式是(ord(symbol) for symbol in symbols),但是由于生成器表达式是tuple()函数中的唯一参数,因此可以把小括号去掉,没必要写两层小括号。
symbols = "acbdf"
t = tuple(ord(symbol) for symbol in symbols)
print(t)
  • 如下例子,如果要打印出所有的组合,用生成器表达式时会逐个产生元素并打印,而如果用列表推导式则会先生成一个完整的列表,然后再打印。显然生成器表达式更能节省内存。
colors = ['black', 'white']
sizes = ['S', 'M', 'L']
 
for tshirt in ('%s %s' % (c, s) for c in colors
                                for s in sizes):
    print(tshirt)
posted @ 2022-03-10 14:22  肖肖凯  阅读(248)  评论(0)    收藏  举报