PYTHON基础

9.解析式与生成器

2020-12-15  本文已影响0人  Stone_説

目录
1.列表解析
2.生成器表达式
3.集合解析式
4.字典解析式

1. 列表解析介绍

1.1 列表解析介绍

语法:

[返回值 for 元素 in 可迭代对象 if 条件]
使用中括号[],内部是for循环,if条件语句可选
返回一个新列表
>>> even = []
>>> for x in range(10):
...     if x % 2 == 0:
...             even.append(x)
>>> print(even)
[0, 2, 4, 6, 8]
列表解析方法:
>>> even2 = [x for x in range(10) if x % 2 == 0]
>>> print(even2)
[0, 2, 4, 6, 8]
1.2 列表解析进阶

[expr for item in iterable if cond1 if cond2]
等价于

ret = []
for item in iterable:
  if cond1:
    if cond2:
      ret.append(expr)

例1:20以内,既能被2整除又能被3整除的数

>>> [i for i in range(20) if i%2 == 0 and i%3 == 0]
[0, 6, 12, 18]
>>> [i for i in range(20) if i%2 == 0 if i%3 == 0]
[0, 6, 12, 18]

[expr for i in iterable1 for j in iterable2]
等价于

ret = []
for i in iterable1:
  for j in iterable2:
    ret.append(expr)

例2:

>>> [(x,y) for x in 'abcde' for y in range(2)]
[('a', 0), ('a', 1), ('b', 0), ('b', 1), ('c', 0), ('c', 1), ('d', 0), ('d', 1), ('e', 0), ('e', 1)]
>>> [[x,y] for x in 'abcde' for y in range(2)]
[['a', 0], ['a', 1], ['b', 0], ['b', 1], ['c', 0], ['c', 1], ['d', 0], ['d', 1], ['e', 0], ['e', 1]]
>>> [{x,y} for x in 'abcde' for y in range(2)]
[{0, 'a'}, {'a', 1}, {0, 'b'}, {1, 'b'}, {0, 'c'}, {1, 'c'}, {'d', 0}, {'d', 1}, {0, 'e'}, {'e', 1}]

2.生成器表达式

2.1 介绍

语法介绍:

(返回值 for 元素 in 可迭代对象 if 条件)
列表解析式的中括号换成小括号即可,返回一个生成器
列表解析的区别:
    生成器表达式是按需计算(或称惰性求值,延迟计算),需要的时候才计算值列,表解析式是立即返回值
    可迭代对象和迭代器均属于生成器

例1:

>>> g = ["{:04}".format(i) for i in range(1,5)]
>>> g
['0001', '0002', '0003', '0004']
>>> for x in g :
...     print(x)
0001
0002
0003
0004
>>> for x in g:
...     print(x)
0001
0002
0003
0004
使用生成器:
>>> g = ("{:04}".format(i) for i in range(1,5))
>>> g
<generator object <genexpr> at 0x7f1054aa3c80>
>>> next(g)
'0001'
>>> for x in g:
...     print(x)
0002
0003
0004
>>> for x in g:
...     print(x)

总结

生成器:                                                   列表
1.延迟计算                                                立即计算
2.返回迭代器,可以迭代                                     返回的不是迭代器,返回可迭代对象列表
3.从前到后走完一遍,数据只能使用一次                        数据可反复,多次使用

3.集合解析式

3.1 语法介绍

{返回值 for 元素 in 可迭代对象 if 条件}
列表解析式的中括号换成大括号{}就行了
立即返回一个集合

3.2 举例
>>> {(x,x+1) for x in range(3)}
{(0, 1), (1, 2), (2, 3)}
>>> {x for x in range(3)}
{0, 1, 2}
>>> {[x] for x in range(3)}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <setcomp>
TypeError: unhashable type: 'list'

4.字典解析式

4.1 语法介绍

{返回值 for 元素 in 可迭代对象 if 条件}
列表解析式的中括号换成大括号{}就行了
使用key:value形式
立即返回一个字典

4.2 举例
>>> {x:x+1 for x in range(3)}
{0: 1, 1: 2, 2: 3}
>>> {x:[x,x+1] for x in range(3)}
{0: [0, 1], 1: [1, 2], 2: [2, 3]}
>>> {(x,):[x,x+1] for x in range(3)}
{(0,): [0, 1], (1,): [1, 2], (2,): [2, 3]}
>>> {chr(0x41+x):x**2 for x in range(3)}
{'A': 0, 'B': 1, 'C': 4}
>>> {str(x):y for x in range(3) for y in range(4)}
{'0': 3, '1': 3, '2': 3}
>>> {[x]:[x,x+1] for x in range(3)}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <dictcomp>
TypeError: unhashable type: 'list'
上一篇下一篇

猜你喜欢

热点阅读