python——生成器函数

  • 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__()

猜你喜欢

转载自www.cnblogs.com/bilx/p/11327692.html