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

python生成器

时间:2018-05-09 01:13:57      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:方法   style   数列   none   range   程序   状态   nbsp   创建生成器   

一、创建生成器

 在python中,这种一边循环一边计算的机制,叫生成器。生成器是可迭代对象。
生成器特点:
  1.节约内存。
  2.迭代到下一次的调用时,所使用的都是第一次保留下的,而不是新创建的。

第一种方式:

a = [x for x in range(10)]

把中括号换成括号

a = (x for x in range(10))

第二种方式:

拿著名的斐波拉契数列举例

def fib(times):
    n=0
    a,b=0,1
    while n<times:
        print(b)
        a,b=b,a+b
        n+=1

fib(10)

函数想变成生成器,则把想要打印出来的数据换成 yield 

def fib(times):
    n=0
    a,b=0,1
    while n<times:
        yield b
        a,b=b,a+b
        n+=1

f=fib(10)
next(f)

如果python解释器运行到 yield 这个行代码会暂停,等你使用 next 函数调用时,则返回 b 的值,然后再次运行到 yield 行代码继续等待。 

二、next函数、__next__()方法和send的使用

  next函数和__next__()方法 使用效果相同,都是在执行完上一个值的基础上,再次执行下一个值,拿斐波拉契数列为例 next函数的使用方式:next(fib);__next__()方法的使用:fib.__next__()

  send有所不同,请看下一段代码:

def gen():
    i = 0
    while i < 5:
        temp = yield i
        print(temp)
        i+=1

  使用next()函数和__next__()方法,使用生成器时则会出现以下现象:

>>> next(g)
0
>>> next(g)
None
1

  如果使用send

>>> g.send("haha")
haha
3

  运行代码时会发现第一次使用next函数调用时,没用出现 None 的现象,那是因为程序从上往下执行第一次执行到 yield 时,i = 0 程序暂停,并没有执行下面的 print(temp) 语句。而send语句的作用是把参数 “haha” 赋值给 temp 并下一句打印出 temp 的值。

  (注意:使用send时,send后必须有参数,如果没有则会报出异常)

  send 参数可以使用 None ,则效果和 next 、__next__() 一样。

>>> g.send(None)
None
4

三、总结

  生成器是这样的一个函数它记住上一次返回时在函数体中的位置。对生成函数的第二次(或第n次)调用跳转至该函数中间,而上次调用的所用局部变量都保持不变。

  生成器不仅“记住了”它的数据状态;生成器还“记住了”它在流控制构造(在命令编程中,这种构造不只是数据值)中的位置。

  

 

python生成器

标签:方法   style   数列   none   range   程序   状态   nbsp   创建生成器   

原文地址:https://www.cnblogs.com/-Neo/p/9011844.html

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