Python3.x基础学习-生成器用法
Posted Johnsonbug
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3.x基础学习-生成器用法相关的知识,希望对你有一定的参考价值。
生成器
生成器的本质就是迭代器
生成器包括两种:生成器函数和生成器表达式
一个包含yield关键字的函数就是一个生成器函数。并且yield不能和return共用,并且yield只能用在函数内
(1)生成器函数执行之后会得到一个生成器作为返回值,并不会执行函数体。
(2)执行了__next__()方法之后才会执行函数体,并且获得返回值
(3) next()内置方法,内部调用生成器函数的__next__()方法。
(4)yield和return相同的是可以返回值,但是不同的是yield不会结束函数
def func(): print(‘---func---‘) yield 1 g = func() # print(g) print(g.__next__()) print(next(g)) # StopIteration # ---func--- # 1
def func(): print(‘---func---‘) yield 1 print(‘---func2---‘) yield 2 g= func() print(g.__next__()) # print(g.__next__()) # print(g.__next__()) #StopIteration print(next(g)) # ---func--- # 1 # ---func2--- # 2
def fib(n): index = 0 a,b =0,1 print(‘---1---‘) while index<n: print(‘---2---‘) a,b = b,a+b yield a index+=1 print(‘----3---‘) g = fib(5) print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) # ---1--- # ---2--- # 1 # ----3--- # ---2--- # 1 # ----3--- # ---2--- # 2 # ----3--- # ---2--- # 3 # ----3--- # ---2--- # 5
import time def ksf(): for i in range(100000): yield ‘ {}桶方便面‘.format(i) time.sleep(0.01) g = ksf() for i in range(100000): print(next(g)) # 0桶方便面 # 1桶方便面 # 2桶方便面
#...
# 100000桶方便面
send()
send 获取下一个值的效果和next()基本一直,只是在获取下一个值的时候,给上一个yeild的位置传递一个数据
使用send的注意事项
(1)第一次使用生成器的时候是用next获取下一个值,不能第一次使用send,或者使用g.send(None)唤醒
(2)最后一个yield不能接手外部的值
def generator(): print(‘a‘) count = yield 1 print(‘--->‘,count) print(‘b‘) yield 2 print(‘c‘) g = generator() print(next(g)) print(g.send(None)) # a # 1 # ---> None # b # 2
# 求移动平均值
#10 10
#20 15
#30 20
def func(): sum = 0 count = 0 avg = 0 while True: print(‘---1----‘) get_num =yield avg print(‘---2----‘) sum +=get_num count+=1 print(‘---3----‘) avg = sum/count g = func() next(g) print(g.send(10)) print(g.send(20)) print(g.send(30)) # ---1---- # ---2---- # ---3---- # ---1---- # 10.0 # ---2---- # ---3---- # ---1---- # 15.0 # ---2---- # ---3---- # ---1---- # 20.0
# yield from循环遍历容器类型 返回一个新的迭代器 def func(): for i in ‘hello‘: yield i for j in range(3): yield j f = func() print(next(f)) print(next(f)) print(next(f)) print(next(f)) print(next(f)) print(next(f)) print(next(f)) # h # e # l # l # o # 0 # 1
# 同样
def func():
yield from ‘hello‘
yield from range(3)
f = func()
for i in f:
print(i)
# #生成器表达式 # # 格式:将列表解析式[]改成()即可 lst=[i for i in range(10)] print(lst) iter1 = iter(lst) print(next(iter1)) g = (i for i in range(10)) print(g) print(next(g),‘----0----‘) print(next(g),‘----1----‘) for i in g: print(i) # 0 ----0---- # 1 ----1---- # 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9
以上是关于Python3.x基础学习-生成器用法的主要内容,如果未能解决你的问题,请参考以下文章