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。#其实我现在还不太懂,挖个坑。

猜你喜欢

转载自www.cnblogs.com/hai125698/p/9206622.html