码迷,mamicode.com
首页 > 编程语言 > 详细

2018-06-20-Python全栈开发day19-生成器函数详解

时间:2018-06-21 01:32:47      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:就会   name   for   数据   cheng   概念   code   分析   next   

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-生成器函数详解

标签:就会   name   for   数据   cheng   概念   code   分析   next   

原文地址:https://www.cnblogs.com/hai125698/p/9206622.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!