python生成器

1、普通函数中出现yield,就构成生成器

def func():
    print(1111)
    yield 1
    print(2222)
  yield 2

result = func()
result1 = result.__next__() # 进入函数找到yield,获取yield后面的数据
print(result1)
result2 = result.__next__() #进入函数找到yield,获取yield后面的数据
print(result2)

2、把 [ ]换成( ),那么会成为生成器的表达式

python,有一个列表的生成方式

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

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

(x for x in range(5))

为什么使用生成器

  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))

     

posted @ 2018-08-28 14:08  清风丶若初见  阅读(56)  评论(0)    收藏  举报