标签:方法 style 数列 none range 程序 状态 nbsp 创建生成器
一、创建生成器
第一种方式:
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次)调用跳转至该函数中间,而上次调用的所用局部变量都保持不变。
生成器不仅“记住了”它的数据状态;生成器还“记住了”它在流控制构造(在命令编程中,这种构造不只是数据值)中的位置。
标签:方法 style 数列 none range 程序 状态 nbsp 创建生成器
原文地址:https://www.cnblogs.com/-Neo/p/9011844.html