生成器表达式Generator expression

语法:

    (返回值 for 元素 in 可迭代对象 if 条件)

    列表解析式的中括号换成小括号就行了

    返回一个生成器

和列表解析式的区别:

    生成器表达式是按需计算(或称惰性求值、延迟计算),需要的时候才计算值

    列表解析式是立即返回值

生成器:

    可迭代对象

    迭代器


举例说明:

g = ("{:04}".format(i) for i in range(1, 11))
print(type(g))# 

print(next(g))

for x in g:
    print(x)

print("#"*50)

for x in g:
    print(x)
    
    
总结: 可以延迟计算;返回迭代器,可以迭代;从前到后走完一遍后,不能回头;

练习题:

it = ("{}".format(i+1) for i in range(2))
first = next(it)
second = next(it)
print(first)
print(second)
val = int(first) + int(second) #想一下这里不用int()函数会怎么样?
print(val)

和列表解析式的对比:

    计算方式:

      生成器表达式延迟计算,列表解析式立即计算;

    内存占用:

      单从返回值本身来说,生成器表达式省内存,列表解析式返回新的列表;

       生成器没有数据,内存占用极少,但是使用的时候,虽然一个个返回数据,但是合起来占用的内存也差不多;

      列表解析式构造新的列表需要占用内存;

    计算速度:

      单看计算时间看,生成器表达式耗时非常短,列表解析式耗时长;

      但是生成器本身并没有返回任何值,只是返回了一个生成器对象;

      列表解析式构造并返回了一个新的列表;



集合解析式:

语法:

    {返回值 for 元素 in 可迭代对象 if 条件}

    列表解析式的中括号换成花括号{}就行了

    立即返回一个集合

用法:

{(x, x + 1) for x in range(10)}


字典解析式:

语法:

    {返回值 for 元素 in 可迭代对象 if 条件}

    列表解析式的中括号换成花括号{}就行了

    使用key:value形式

    立即返回一个字典

用法:

print({x: (x, x+1) for x in range(10)})
print({x: [x, x+1] for x in range(10)})
print({(x): [x, x+1] for x in range(10)})
# print({[x]: [x, x+1] for x in range(10)})#####???????????
print({chr(0x41+x): x**2 for x in range(10)})
print({str(x): y for x in range(3) for y in range(4)})
print({str(x): y for x in range(3) for y in range(4)})
#会输出多少个元素???