2018-06-20-Python全栈开发day19-生成器函数详解
Posted hai125698
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018-06-20-Python全栈开发day19-生成器函数详解相关的知识,希望对你有一定的参考价值。
1.生成器函数
生成器函数,和普通函数的区别就是,
1.在生成器函数中使用yield代替return,而且yield可以被调用多次
2.当函数运行到yield时,会保留yield当前状态,等待下一次next
用法示例:
def test(): yield 1 yield 2 yield 3 a=test() b=a.__next__() c=a.__next__() d=a.__next__() # print(b) print(c) print(d)
test函数中,有三个yield,每使用一次next方法,函数进行到一个yield之后,分别用bcd来接收返回值,
2.生成器函数的好处
和生成器一样,好处就是可以随时来进行运算,
和普通函数进行对比:
def shengchengqi(): for i in range(10000): yield ‘这是第%s个鸡蛋‘ %i a= shengchengqi() b=a.__next__() print(b)
生成器函数,当你进行next函数时,才进行运算,每次运算时拿一个数据进内存,这样可以很省内存空间
如果是普通函数的话
def putonghanshu(): s1=[] for i in range(10000): print(‘这是第%s个鸡蛋‘ %i) a=putonghanshu()
只要函数运行,就将10000个数据全部放入内存,很容易占空间。
ps:疑问:这样的话,那生成器函数是不是很复杂,每运行一次都要写一段代码。
引入for循环
3.将生成器函数引入for循环
编写一个生成器函数
如果生成器函数运行的话,会从yield里得到一个返回值,我们可以用abc来接收。
然后,可以对生成器函数使用next方法,可以使函数内的光标移到下一个yield之后,仅此而已,还是需要自己去找值接收。
def shengchengqi(): for i in range(10000): yield ‘这是第%s个鸡蛋‘ %i a= shengchengqi() for b in a: print(b)
这时是自动运行,
分析:a=func().,开始运行函数,此时i=0,光标在yield之后。
for循环的概念,对一个对象,加上iter,然后一个一个的使用next方法,直到需要异常,然后返回,在for循环中,b直接接收了next之后的值。
4.并发运行
需求分析:两个函数,一个函数运行时调用另一个函数,然后保存状态如此往复。
def chibaozi(name): print(‘我开始吃包子了‘) while 1: baozi=yield print(‘这是我吃的包子 %s‘ %baozi) def zuo(): s1=chibaozi(‘yehaibin‘) s1.__next__() for i in range(10): s1.send(‘lvelvelve‘) zuo()
运行zuo的时候, 每循环一次,chibaozi就会做一次动作,然后保存状态,这就是yield。#其实我现在还不太懂,挖个坑。
以上是关于2018-06-20-Python全栈开发day19-生成器函数详解的主要内容,如果未能解决你的问题,请参考以下文章