python生成器

Posted -neo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python生成器相关的知识,希望对你有一定的参考价值。

一、创建生成器

 在python中,这种一边循环一边计算的机制,叫生成器。生成器是可迭代对象。
生成器特点:
  1.节约内存。
  2.迭代到下一次的调用时,所使用的都是第一次保留下的,而不是新创建的。

第一种方式:

a = [x for x in range(10)]

把中括号换成括号

a = (x for x in range(10))

第二种方式:

拿著名的斐波拉契数列举例

def fib(times):
    n=0
    a,b=0,1
    while n<times:
        print(b)
        a,b=b,a+b
        n+=1

fib(10)

函数想变成生成器,则把想要打印出来的数据换成 yield 

def fib(times):
    n=0
    a,b=0,1
    while n<times:
        yield b
        a,b=b,a+b
        n+=1

f=fib(10)
next(f)

如果python解释器运行到 yield 这个行代码会暂停,等你使用 next 函数调用时,则返回 b 的值,然后再次运行到 yield 行代码继续等待。 

二、next函数、__next__()方法和send的使用

  next函数和__next__()方法 使用效果相同,都是在执行完上一个值的基础上,再次执行下一个值,拿斐波拉契数列为例 next函数的使用方式:next(fib);__next__()方法的使用:fib.__next__()

  send有所不同,请看下一段代码:

def gen():
    i = 0
    while i < 5:
        temp = yield i
        print(temp)
        i+=1

  使用next()函数和__next__()方法,使用生成器时则会出现以下现象:

>>> next(g)
0
>>> next(g)
None
1

  如果使用send

>>> g.send("haha")
haha
3

  运行代码时会发现第一次使用next函数调用时,没用出现 None 的现象,那是因为程序从上往下执行第一次执行到 yield 时,i = 0 程序暂停,并没有执行下面的 print(temp) 语句。而send语句的作用是把参数 “haha” 赋值给 temp 并下一句打印出 temp 的值。

  (注意:使用send时,send后必须有参数,如果没有则会报出异常)

  send 参数可以使用 None ,则效果和 next 、__next__() 一样。

>>> g.send(None)
None
4

三、总结

  生成器是这样的一个函数它记住上一次返回时在函数体中的位置。对生成函数的第二次(或第n次)调用跳转至该函数中间,而上次调用的所用局部变量都保持不变。

  生成器不仅“记住了”它的数据状态;生成器还“记住了”它在流控制构造(在命令编程中,这种构造不只是数据值)中的位置。

  

 

以上是关于python生成器的主要内容,如果未能解决你的问题,请参考以下文章

postman 自动生成 curl 代码片段

Apollo Codegen 没有找到生成代码的操作或片段

前端开发工具vscode如何快速生成代码片段

前端开发工具vscode如何快速生成代码片段

vscode代码片段生成vue模板

常用python日期日志获取内容循环的代码片段