Python 11 生成器

生成器 和 生成器表达式

迭代器
iter() 获取迭代器
next() 下一个

生成器
本质就是迭代器
两种方式写生成器
1. 生成器函数
2. 生成器表达式

一,生成器
什么是生成器. 生成器实质就是迭代器.
在python中有三种方式来获取生成器:

  1. 通过生成器函数
  2. 通过各种推导式来实现生成器
  3. 通过数据的转换也可以获取生成器

首先, 我们先看个很简单的函数:

def func():
    print("aaa")
    return bbb
ret = func()
print(ret)

结果是 aaa
       bbb

将函数中的return换成yield就是生成器

def func():
    print("aaa")
    yield bbb
ret = func()
print(ret)

结果:
<generator object func at 0x10567ff68>
这里的ret = fun() 就不再是函数的执行了
. 而是获取这个生成器

例子二 生产器打印输出

def func():
    print("aaa")
    yield bbb
    print("ccc")
    yield ddd
    print("eee")
    yield fff
ret = func()
print(ret.__next__())
print(ret.__next__())
print(ret.__next__())

生成器的本质是迭代器. 所以. 我们可以直接执行__next__()来执行
有什么区别呢? yield是分段来执行一个
函数

那么我们可以看到, yield和return的效果是一样的.有什么区别呢?
yield是分段来执行一个函数.
return呢? 直接停止执行函数. 返回值

sen 的用法

def eat():
  print("我吃什么啊")
  a = yield "馒头"
  print("a=",a)
  b = yield "烧饼"
  print("b=",b)
  c = yield "韭菜"
  print("c=",c)
  yield "GAME OVER"
gen = eat() # 获取生成器
ret1 = gen.__next__()
print(ret1)
ret2 = gen.send("胡辣汤")
print(ret2)
ret3 = gen.send("狗粮")
print(ret3)
ret4 = gen.send("猫粮")
print(ret4)

send和__next__()区别:

  1. send和next()都是让生成器向下走一次
  2. send可以给上一个yield的位置传递值, 不能给最后一个yield发送值. 在第一次执行生
    成器代码的时候不能使用send()
posted @ 2018-11-05 20:58  恩佐MIG-U1  阅读(175)  评论(0编辑  收藏  举报