【Python】python生成器

生成器

        定义:Python中,一边循环一边计算的机制,称为生成器:generator(生成器是一类特殊的迭代器 https://blog.csdn.net/qq_33432841/article/details/107774634

生成器的由来:

           (1)列表所有数据都在内存中,如果有海量数据的话将会非常耗内存。

             如:仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

           (2)如果列表元素按照某种算法推算出来,那我们就可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而节省大量的空间。

            简单一句话就是:如果又想要得到庞大的数据,又想让它占用空间少,那就用生成器

            生成器在代码中的表现形式(静态方向):

              (1)含有yield语句(无论yield是否可能会被执行)

              (2)无return或者仅有无值return(一旦函数里存在yield语句,有值return会视为语法错误)

            Python的yield关键字的唯一作用,就是把一个普通的函数变成生成器

            当一个函数内出现yield关键字后,就会变异为生成器,其行为与普通函数不同。

           生成器在代码中的表现形式(态方向):

              (1)当生成器函数被调用的时候,生成器函数不执行内部的任何代码,直接立即返回一个迭代器。

              (2)当所返回的迭代器第一次调用next的时候,生成器函数从头开始执行,如果遇到了执行yield x,next立即返回yield值x。

              (3)当所返回的迭代器继续调用next的时候,生成器函数从上次yield语句的下一句开始执行,直到遇到下一次执行yield

              (4)任何时候遇到函数结尾,或者return语句,抛出StopIteration异常

         创建生成器的方法: 

          第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:

>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>

#L是一个list,而g是一个generator。

         第二种方法: 如果一个函数中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。调用函数就是创建了一个生成器(generator)对象。

           生成器的工作原理:

               (1)生成器(generator)能够迭代的关键是它有一个next()方法,工作原理就是通过重复调用next()方法,直到捕获一个异常。

               (2)带有 yield 的函数不再是一个普通函数,而是一个生成器generator。可用next()调用生成器对象来取值。next 两种方式 t.__next__()  |  next(t)。可用for 循环获取返回值(每执行一次,取生成器里面一个值)(基本上不会用next()来获取下一个返回值,而是直接使用for循环来迭代)。

              (3)yield相当于 return 返回一个值,并且记住这个返回的位置,下次迭代时,代码从yield的下一条语句开始执行。

              (4).send() 和next()一样,都能让生成器继续往下走一步(下次遇到yield停),但send()能传一个值,这个值作为yield表达式整体的结果

          ——换句话说,就是send可以强行修改上一个yield表达式值。比如函数中有一个yield赋值,a = yield 15,第一次迭代到这里会返回15,a还没有赋值。第二次迭代时,使用.send(8),那么,就是强行修改yield 15表达式的值为8,本来是15的,那么a=8

话不多说,例子来帮助:

def yield_test(n):
    for i in range(n):
        yield call(i)
        print("i=",i)
    print("Done.")

def call(i):
    return i*2

for i in yield_test(5):
    print(i,",")

运行 结果为:(理解的关键在于:下次迭代时,代码从yield的下一条语句开始执行。)

0 ,
i= 0
2 ,
i= 1
4 ,
i= 2
6 ,
i= 3
8 ,
i= 4
Done.

总结:

          使用了yield关键字的函数不再是函数,而是生成器。(使用了yield的函数就是生成器)

          yield关键字有两点作用:

              保存当前运行状态(断点),然后暂停执行,即将生成器(函数)挂起
              将yield关键字后面表达式的值作为返回值返回,此时可以理解为起到了return的作用
              可以使用next()函数让生成器从断点处继续执行,即唤醒生成器(函数)
         Python3中的生成器可以使用return返回最终运行的返回值,而Python2中的生成器不允许使用return返回一个返回值(即可以使用return从生成器中退出,但return后不能有任何表达式)。

                                      不后悔过去,不幻想未来,把握好现在,就是对自己最好的交代!!!!!!!!!!!!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的迭代器生成器是一种基于惰性计算的概念,它们可以有效地处理大量的数据或者无限序列。下面我将分别介绍迭代器生成器迭代器(Iterator)是一个实现了迭代协议(Iterator Protocol)的对象。通过调用内置函数 `iter()` 可以将可迭代对象转换为迭代器迭代器对象可以使用内置函数 `next()` 来逐个访问数据元素,直到没有更多的元素可供访问引发 `StopIteration` 异常。例如,可以使用迭代器来遍历列表、元组、集合等容器类型的数据。 生成器(Generator)则是一种特殊迭代器。它不需要显式地实现迭代协议,而是通过函数中的 `yield` 关键字来实现惰性计算。生成器函数在每次调用返回一个值,并在下一次调用从上一次离开的位置继续执行。这样可以节省大量的内存空间,并且提高程序的效率。生成器函数定义使用 `def` 关键字,并包含至少一个 `yield` 关键字。 下面是一个简单的示例代码,演示了如何使用迭代器生成器: ```python # 使用迭代器遍历列表 my_list = [1, 2, 3, 4, 5] my_iter = iter(my_list) while True: try: item = next(my_iter) print(item) except StopIteration: break # 使用生成器生成斐波那契数列 def fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a + b fib = fibonacci() for i in range(10): print(next(fib)) ``` 希望以上解释能够帮助你理解迭代器生成器的概念。如果有任何进一步的问题,请随提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值