• 1.生成器
  • 生成器的本质就是迭代器
  • 生成器的特点和迭代器一样,取值方式和迭代器一样(__next__(),)。
  • send():的作用是给上一个yield传值
  • 生成器一般由生成器函数或者生成器表达式来创建
  • 其实就是手写的迭代器
  • 生成器函数
  • 和普通函数写法没有区别,里面有yield的函数就是生成器函数。
  • 生成器函数在执行的时候,默认不会执行函数体,而是返回生成器,
  • 通过生成器的__next__()分段执行这个函数
  • send():的作用是给上一个yield传值,不能在开头使用,因为没有上一个yield,最后一个yield也不可以用send,因为会报错停止生成器。

yield  

yield:相当于return,可以返回数据。但是yield不会彻底中断函数。分段执行

函数中如果有yield,这个函数就是生成器函数。

生成器函数名() 获取的是生成器。这个时候不执行函数。

def func():   print('执行到第一yield,下面是返回值')

  yield 1   # return和yield都可以返回数据

  print('执行第一个yield不会打印这个条,再次使用gen.__next__()调用才会打印,下面是返回值')

  yield 2

gen = func() # 拿到生成器,不会执行函数

gen.__next__() # 执行函数,执行到下一个yield

gen.__next__() # 再次执行函数,执行到上一个yield之后的下一个yield

-------------------------------------------------------------------------

执行到第一yield,下面是返回值

1

执行第一个yield不会打印这个条,再次使用gen.__next__()调用才会打印,下面是返回值

2

=========================================================

def order():
  lst = []
  for i in range(10000):
    lst.append('衣服'+str(i))
  return lst
l1 = order() # 直接调拥lst内全部元素,大量消耗内存
def order():   for i in range(10000):     yield '衣服'+str(i)
g = order()   # 获取生成器
mingwei = g.__next__()
print(mingwei)
zhaoyining = g.__next__()
print(zhaoyining

-----------------------------------------------------

衣服0

衣服1

========================================================

send()和__next__()是一样的。可以执行到下一个yield,但是可以给上一个yield传值
def func():
  print('我是第一段')
  a = yield 123  #send赋值a为煎饼果子
  print(a)  #此时a没有值,因为按顺序执行到=右边yield 123 就已经停止,=赋值操作没有执行
  print('可心是第二段')
  b = yield 456
  print('一宁是第三段')
  c = yield 789
  print('刘伟是最后一段')
  d = yield 79  #生成器收尾必须是yield,且不能send传值不然会报错StopIteration;
g = func()  #获取生成器
print(g.__next__())  #这里没有上一个yield所以不能直接使用send
print(g.send('煎饼果子'))  # send给上一个执行完的yield位置赋值,所以将a赋值为煎饼果子
print(g.send('锅包肉'))   #从第二个yield后开始执行(把锅包肉赋值给b开始,=左侧第二个yield没有执      
              行)

-------------------------------------------------------------

我是第一段


123
None   #None是第二个print(g.__next__())调用打印a的值,说明第一次调用时=的赋值没有执行
     执行到yield直接停止,第二次调用时从第一次调用yield的下一行开始执行
============================================================
def func():
  yield 1
  yield 11
for i in func():  # for的内部一定有__next__()
  print(i)
print(list(func()))  #内部一定有__next__()