zoukankan      html  css  js  c++  java
  • 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__()

  • 相关阅读:
    跨域在前端工程化中的实际解决方案。
    细说Vue作用域插槽,匹配应用场景。
    js数据结构之栈和队列的详细实现方法
    js数据结构之hash散列的详细实现方法
    js数据结构之集合的详细实现方法
    js数据结构之二叉树的详细实现方法
    【好记性不如烂笔头】之小程序要点记录
    回想继承、原型与原型链有感
    js数据结构之链表(单链表、双向链表、循环链表)
    js数据结构之列表的详细实现方法
  • 原文地址:https://www.cnblogs.com/bilx/p/11327692.html
Copyright © 2011-2022 走看看