41 生成器推导式

生成器推导式也称为生成器表达式(generator expression),用法与列表推导式非常相似,在形式上生成器推导式使用圆括号作为定界符,而不是列表推导式所使用的方括号。与列表推导式最大的不同是,生成器推导式的结果是一个生成器对象。生成器对象类似于迭代器对象,具有惰性求值的特点,只在需要时生成新元素,比列表推导式具有更高的效率,空间占用非常少,尤其适合大数据处理的场合。

使用生成器对象的元素时,可以将其转化为列表或元组,也可以使用生成器对象的__ next__() 方法或内置函数 next() 进行遍历,或者直接使用 for 循环来遍历其中的元素。但是不管用哪种形式,只能从前往后正向访问其中的元素,没有任何方法可以再次访问已访问过的元素,也不支持使用下标访问其中的元素。 当所有元素访问结束以后,如果需要重新访问其中的元素,必须重新创建该生成器对象。 enumerate、filter、map、zip 等对象也具有相同的特点。

包含 yield 语句的函数也可以用来创建生成器对象。

g = ((i + 2) ** 2 for i in range(10))  # 创建生成器对象
print(g)
print(tuple(g))  # 将生成器对象转换为元组
print(list(g))  # 生成器对象已经遍历结束,没有元素了

g = ((i + 2) ** 2 for i in range(10))  # 创建生成器对象
print(g.__next__())  # 使用生成器对象的__next__()方法获取元素
print(g.__next__())
print(next(g))  # 使用函数 next() 获取生成器对象中的元素

g = ((i + 2) ** 2 for i in range(10))  # 创建生成器对象
for i in g:  # 使用循环直接遍历生成器对象中的元素
    print(i, end=' ')
print('')

x = filter(None, range(10))  # filter对象也具有类似的特点
# print(x, list(x))
print(1 in x)
print(5 in x)
print(2 in x)  # 不可再次访问已访问过的元素
print(9 in x)

x = map(str, range(10))  # map对象也具有类似的特点
# print(x, list(x))
print('0' in x)
print('0' in x)  # 不可再次访问已访问过的元素
print('1' in x)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我还记得那天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值