自学Python之路-Python基础+模块+面向对象
自学Python之路-Python网络编程
自学Python之路-Python并发编程+数据库+前端
自学Python之路-djangohtml
定义:生成器(generator)是一个包含yield关键字的函数,当它被调用的时候,在函数体中的代码不会被执行,而是会返回一个迭代器。
(一个函数调用时返回一个迭代器,那这个函数就叫作生成器(generator);
若是函数中包含yield语法,那这个函数就会变成生成器;)前端
python提供了两种基本的生成器方式:python
为何叫生成器函数?由于他随着时间的推移生成了一个数值队列。通常的函数在执行完毕以后会返回一个值而后退出,可是生成器函数会自动挂起,而后从新拾起继续执行,他会利用yield关键字关起函数,给调用者返回一个值,同时保留了当前的足够多的状态,可使函数继续执行。
生成器和迭代协议是密切相关的,可迭代的对象都有一个__next()__成员方法,这个方法要么返回迭代的下一项,要么引发异常结束迭代。
为了支持迭代协议,拥有yield语句的函数被编译为生成器,这类函数被调用时返回一个生成器对象,返回的对象支持迭代接口,即成员方法__next()__继续从中断处执行执行。数据库
def func(): #func是函数称为生成器,当执行此函数func()时会获得一个迭代器。 yield 1 yield 2 yield 3 yield 4 temp = func() print(temp.__next__()) print(temp.__next__()) print(temp.__next__()) print(temp.__next__())
def creat_counter(n): print('create counter') while True: yield n print('increment n') n += 1 cnt = creat_counter(2) print(cnt) print(next(cnt)) print(next(cnt)) print(next(cnt))
分析以上的列子:django
def cube(n): for i in range(n): yield i ** 3 for i in cube(5): print(i)
从理解函数的角度出发咱们能够将yield类比为return,可是功能确实彻底不一样,在for循环中,会自动遵循迭代规则,每次调用next()函数,因此上面的结果不难理解。编程
举例1:数组
举例2:网络
举例3: 取不到值会报错并发
举例4: 使用for循环取值函数
举例5.1 : 打印出10个哇哈哈
举例5.2 :若是如今有10个哇哈哈, 我如今只想用5个
迭代器依旧延续向下走:
举例6:
def generator(): print('123') content = yield 1 print('=========',content) print(456) yield 2 g = generator() ret = g.__next__() print("******",ret) ret = g.send("hello") print("**********",ret)
send 获取下一个值的效果和next基本一致,只是在获取下一个值得时候,给上一个yield的位置传递一个数据
使用send的注意事项:
举例7.1:
获取移动平均值:
10 20 30 10
15 20 17.5
def average(): sum = 0 count = 0 avg = 0 while True: num = yield avg sum += num count += 1 avg = sum/count avg_g = average() avg_g.__next__() avg1 = avg_g.send(10) avg1 = avg_g.send(20) avg1 = avg_g.send(30) print(avg1)
举例7.2: 预激生成器的装饰器完成获取移动平均值
def init(func): #装饰器 def inner(*args,**kwargs): g = func(*args,**kwargs) #g = average() g.__next__() return g return inner @init def average(): sum = 0 count = 0 avg = 0 while True: num = yield avg sum += num # 10 count += 1 # 1 avg = sum/count avg_g = average() #===> inner ret = avg_g.send(10) print(ret) ret = avg_g.send(20) print(ret)
以上程序执行步骤:
举例8 :
在python3里面的新功能 yield from
.