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

  • 相关阅读:
    LeetCode120 Triangle
    LeetCode119 Pascal's Triangle II
    LeetCode118 Pascal's Triangle
    LeetCode115 Distinct Subsequences
    LeetCode114 Flatten Binary Tree to Linked List
    LeetCode113 Path Sum II
    LeetCode112 Path Sum
    LeetCode111 Minimum Depth of Binary Tree
    Windows下搭建PHP开发环境-WEB服务器
    如何发布可用于azure的镜像文件
  • 原文地址:https://www.cnblogs.com/bilx/p/11327692.html
Copyright © 2011-2022 走看看