Python之生成器表达式

生成器表达式Generator expression

语法
    (返回值 for元素 in可迭代对象 if条件)
    返回一个生成器
和列表解析式的区别
    生成器表达式是按需计算(称惰性求值、延迟计算),需要的时候才计算值
    列表解析式是立即返回值
生成器
    可迭代对象(可迭代对象未必是迭代器,但是迭代器一定是可迭代对象)
    迭代器

只有迭代器可以用next,用iter可以将一个可迭代对象转换成迭代器
a = (i for i in range(10))
next(a)
1
--------------------------------------------
next(range(1,3))
'range' object is not an iterator

生成器表达式
举例:

g=("{:04}".format(i)for i in range(1,11))
    next(g)
    for x in g:
        print(x)
    print('~~~~~~~~')
    for x in g:
        print(x)

    0002
    0003
    0004
    0005
    0006
    0007
    0008
    0009	

总结:

    延迟计算
    返回迭代器,可以迭代
    从前到后走完一遍后,不能回头

对比列表:
举例:

g=["{:04}".format(i)for i in range(1,11)]
		for x in g:
			print(x)
		print('~~~~~~~~')
		for x in g:
			print(x)
	
		0001
		0002
		0003
		0004
		0005
		0006
		0007
		0008
		0009
		0010
		~~~~~~~~
		0001
		0002
		0003
		0004
		0005
		0006
		0007
		0008
		0009
		0010

总结:

    立即计算
    返回的不是迭代器,返回可迭代对象列表
    从前到后走完一遍后,可以重新回头迭代

和列表解析式的对比:

计算方式
    生成器表达式延迟计算,列表解析式立即计算
内存占用
    单从返回值本身来说,乘乘其表达式省内存,列表解析式返回新的列表
    生成器没有数据,内存占用极少,但是使用的时候,虽然一个个返回数据,但是合起来占用的内存也差不多
    列表解析式构造新的列表需要占用内存
计算速度
    单看计算时间看,生成器表达式耗时非常短,列表解析式耗时长
    但是生成器本身并没有返回任何值,只返回了一个生成器对象
    列表解析式构造并返回一个新的列表

集合解析式:

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

用法
    {(x,x+1)for x in range(10)}
    {[x]for x in range(10)} #报错,因为[]是列表,{}而这个是集合,里面不能出现不可以哈希的元素

字典解析式:

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

用法

{x:(x+1) for x in range(10)}
{0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}

{x:[x,x+1] for x in range(10)}
{0: [0, 1],
 1: [1, 2],
 2: [2, 3],
 3: [3, 4],
 4: [4, 5],
 5: [5, 6],
 6: [6, 7],
 7: [7, 8],
 8: [8, 9],
 9: [9, 10]}

{(x,):[x,x+1] for x in range(10)}
{(0,): [0, 1],
 (1,): [1, 2],
 (2,): [2, 3],
 (3,): [3, 4],
 (4,): [4, 5],
 (5,): [5, 6],
 (6,): [6, 7],
 (7,): [7, 8],
 (8,): [8, 9],
 (9,): [9, 10]}

{[x]:[x,x+1] for x in range(10)}#

{chr(0x41+x):x**2 for x in range(10)} 
{'A': 0,
 'B': 1,
 'C': 4,
 'D': 9,
 'E': 16,
 'F': 25,
 'G': 36,
 'H': 49,
 'I': 64,
 'J': 81}

{str(x):y for x in range(3) for y in range(4)}#输出多少个元素?
{'0': 3, '1': 3, '2': 3}
字典起到去重作用

用法
    {str(x):y for x in range(3) for y in range(4)}
    等价于
    ret={}
    for x in range(3):
        for y in range(4):
        ret[str(x)]=y

总结:

    python2引入列表解析式
    python2.4引入生成器表达式
    python3引入集合、字典解析式,并迁移到了2.7

猜你喜欢

转载自blog.csdn.net/qq_35976427/article/details/89111176