Python的生成器

什么是生成器:

生成器是指能够动态生成提供数据的对象,生成器对象也是可迭代对象
生成器分为两种:

  1. 生成器函数
  2. 生成器表达式

生成器函数的定义:

含有yield语句的函数是生成器函数,此函数被调用将返回一个生成器对象
yield翻译为产生(或生成)
生成器函数说明:
生成器函数的调用将返回一个生成器对象,生成器对象是一个 可迭代对象,通常用来动态生成数据
生成器函数调用 return 语句会触发一个StopIterator异常

简单的生成器:

# 简单的生成器函数
def my_gen():
     n=1
     print("first")
     # yield区域
     yield n 
     n+=1
     print("second")
     yield n
     n+=1
     print("third")
     yield n
a=my_gen()
 print("next method:")
 # 每次调用a的时候,函数都从之前保存的状态执行
 print(next(a))
 print(next(a))
 print(next(a))
 print("for loop:")
 # 与调用next等价的
 b=my_gen()
 for elem in my_gen():
     print(elem)

循环生成器

在这里插入代码片# 逆序yield出对象的元素
def rev_str(my_str):
    length=len(my_str)
    for i in range(length-1,-1,-1):
        yield my_str[i]
    for char in rev_str("hello"):
   	 print(char)

生成器表达式

Python中,有一个列表生成方法,比如

# 产生1,2,3,4,5的一个列表
[x for x in range(5)]

如果换成[]换成(),那么会成为生成器的表达式

(x for x in range(5))

具体使用方式:

a=(x for x in range(10))
b=[x for x in range(10)]
# 这是错误的,因为生成器不能直接给出长度
# print("length a:",len(a))
# 输出列表的长度
print("length b:",len(b))
b=iter(b)
# 二者输出等价,不过b是在运行时开辟内存,而a是直接开辟内存
print(next(a))
print(next(b))

为什么使用生成器:

  1. 更容易使用,代码量较小
  2. 内存使用更加高效。比如列表是在建立的时候就分配所有的内存空间,而生成器仅仅是需要的时候才使用,更像一个记录
  3. 代表了一个无限的流。如果我们要读取并使用的内容远远超过内存,但是需要对所有的流中的内容进行处理,那么生成器是一个很好的选择,比如可以让生成器返回当前的处理状态,由于它可以保存状态,那么下一次直接处理即可
  4. 流水线生成器。假设我们有一个快餐记录,这个记录的地4行记录了过去五年每小时售出的食品数量,并且我们要把所有的数量加在一起,求解过去5年的售出的总数。假设所有的数据都是字符串,并且不可用的数字被标记成N/A。那么可以使用下面的方式处理
with open('sells.log') as file:
    pizza_col = (line[3] for line in file)
    per_hour = (int(x) for x in pizza_col if x != 'N/A')  # 使用生成器  进行自动迭代
    print("Total pizzas sold = ",sum(per_hour))1


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值