python-生成器
生成器(generator)其实是一类特殊的迭代器。前面博客我们每次迭代获取数据(通过next()方法)时按照特定的规律进行生成。但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记录,进而才能根据当前状态生成下一个数据。为了达到记录当前状态,并配合next()函数进行迭代使用,python就搞了个生成器。所以说生成器(generator)其实是一类特殊的迭代器
生成器就是自己定义的迭代器
生成器原理
#生成器函数 #只要有yield的函数就是生成器函数 def generator(): print(1) yield "a" #next函数的返回值 ,有yield不要写return #return返回之后函数就结束了 #yield返回之后函数不会结束,等待next的操作 print(2) yield "b" ret=generator() #返回迭代器,此时不会执行函数内的代码 print(ret) print(ret.__next__()) #返回第一个yield的返回值a print(ret.__next__()) #返回第二个yield的返回值b print(ret.__next__()) #发出异常信息StopIteration,表示已经在尾部没有值了
生成器使用实例一
#生成10个娃哈哈 def wahaha(): for i in range(10): yield f"娃哈哈{i}" ret=wahaha() for i in ret: print(i)
视频教程
生成器进阶send函数
def generator(): print(123) content=yield 1 #content接受后面send函数中的参数 print(456,content) yield 2 g=generator() ret=g.__next__() print(ret) ret=g.send("我是李明") """ send函数的作用跟next一样,但是可以传递参数 注意事项: 获取第一个值时必须用next函数 最后一个yield不能接受外部的值 """ print(ret)
视频教程
生成器进阶yield from
def generator(): a="abcdef" b="123456" yield from a #yield from的功能:把容器a中的元素每次返回一个;只能一个变量 yield from b g=generator() for i in g: print(i)
生成器表达式
不带筛选条件
g=("鸡蛋%s"%i for i in range(10)) #生成器表达式 print(g) for i in g: print(i)
带筛选条件
g=("鸡蛋%s"%i for i in range(10) if i%2==0) #生成器表达式 print(g) for i in g: print(i)
生成器面试题-有点难
def demo(): #生成器函数 for i in range(4): yield i g=demo() #g是生成器 g1=(i for i in g) #g1是生成器 print(g1) #打印出g1生成器的地址 g2=(i for i in g1) #g2是生成器 print(g2) #打印出g2生成器的地址 print(list(g1)) #[0, 1, 2, 3] print(list(g2)) #[] """ 难点就在此处: 在执行list(g1)时,g1生成器已经结束了, 在执行list(g2)时,g2是从g1中取值,所以取不到值 """