python 生成器 generator

一、生成器定义

通过列表生成表达式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

1 >>> l = [x * x for x in range(10)]
2 >>> l
3 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
4 >>> g = (x * x for x in range(10))
5 >>> g
6 <generator object <genexpr> at 0x1013e0780>

二、表达式生成器

创建l和g的区别仅在于最外层的[]和(),l是一个list,而g是一个generator。可以直接打印出l的每一个元素,打印出g的每一个元素需要使用next()函数。

 1 >>> g = (x * x for x in range(10))
 2 >>> g
 3 <generator object <genexpr> at 0x1013e0780>
 4 >>> next(g)
 5 0
 6 >>> next(g)
 7 1
 8 >>> next(g)
 9 4
10 >>> next(g)
11 9
12 >>> next(g)
13 16
14 >>> next(g)
15 25
16 >>> next(g)
17 36
18 >>> next(g)
19 49
20 >>> next(g)
21 64
22 >>> next(g)
23 81
24 >>> next(g)
25 Traceback (most recent call last):
26   File "<stdin>", line 1, in <module>
27 StopIteration

generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。

 1 >>> g = (x * x for x in range(10))
 2 >>> for n in g:
 3 ...     print(n)
 4 ...
 5 0
 6 1
 7 4
 8 9
 9 16
10 25
11 36
12 49
13 64
14 81

首先generator是可迭代对象,所以可以使用for in循环遍历。该遍历的本质是for in循环内部调用next()函数获取每一个元素,并且捕获StopIteration异常,结束遍历。

三、函数生成器

斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易。

 1 >>> def fib(max):
 2 ...     n, a, b = 0, 0, 1
 3 ...     while n < max:
 4 ...         yield b
 5 ...         a, b = b, a + b
 6 ...         n += 1
 7 ...     raise StopIteration(‘done‘)
 8 ...
 9 >>> fib(6)
10 <generator object fib at 0x1013e0780>
11 >>> for i in fib(6):
12 ...     print(i)
13 ...
14 1
15 1
16 2
17 3
18 5
19 8
20 >>> g = fib(6)
21 >>> while True:
22 ...     try:
23 ...         next(g)
24 ...     except StopIteration as e:
25 ...         print(e.value)
26 ...         break
27 ...
28 1
29 1
30 2
31 3
32 5
33 8
34 done
时间: 2024-11-07 09:32:43

python 生成器 generator的相关文章

【25】Python生成器generator

列表生成式一个小题目:将里列表[0,1,2,3]里面的数值都加1.方法1: a=[0,1,2,3] b=[] for i in range(len(a)): b.append(i+1) a=b print(a) 方法2: a = [1,3,4,6,7,7,8] for index,i in enumerate(a): a[index] +=1 print(a) 方法3: a=[0,1,2,3,4] a=map(lambda x:x+1,a) print(a) for i in a: print(

Python 生成器generator

列表的问题列表生成器可以直接创建一个表,但是,如果一个表中有100万个元素,那么这个表太占空间,而且往往我们仅仅需要访问前面几个元素,后面绝大多数元素占用的空间都白白浪费了. 生成器如果列表元素可以按照某种算法推算出来,那我们可以在循环的过程中不断的推算出后续的元素.而不用一开始就创建整个list.这样,节省了大量的空间.这种一遍循环一遍计算的机制,称为生成器:generator. 创建生成器generator.第一种方法:只要报一个列表生成式的[]改成(),就穿件了一个generator.创建

python生成器 Generator

生成器 Generator 什么是生成器? 生成器是能够动态提供数据的可迭代对象 生成器在程序运行时生成数据,与容器类不同,它通常不会在内存中保存大量的数据,而是现用现生成 生成器有两种: 生成器函数 生成器表达式 生成器函数 含有yield语句的函数是生成器函数,此函数被调用将返回一个生成器对象 注: yield翻译为(产生或生成) yield 语句 语法: yield 表达式 说明: yield 用于 def函数中,目的是将此函数作用生成器函数使用yield 用来生成数据,供迭代器的next

Python高级编程之生成器(Generator)与coroutine(一):Generator

这是一系列的文章,会从基础开始一步步的介绍Python中的Generator以及coroutine(协程)(主要是介绍coroutine),并且详细的讲述了Python中coroutine的各种高级用法,最后会用coroutine实现一个简单的多任务的操作系统. 其实也是看完这篇文章的学习笔记吧!O(∩_∩)O 生成器(Generator) 什么是生成器?在Python中,生成器(Generator)是一个带有yield关键字的函数 1 def gene(): 2 a = 1 3 print "

Python高级编程之生成器(Generator)与coroutine(二):coroutine介绍

原创作品,转载请注明出处:点我 上一篇文章Python高级编程之生成器(Generator)与coroutine(一):Generator中,我们介绍了什么是Generator,以及写了几个使用Generator Function的示例,这一小节,我们会介绍Python的coroutine,以及会有一个小例子,再接下来的文章中会以代码的形式一步步介绍coroutine的高级用法. coroutine(协程) 什么是coroutine?coroutine跟Generator有什么区别?下面先看一段

python学习--生成器Generator

生成器函数:在函数中如果出现了yield关键字,那么这个函数就是生成器函数,yield的作用就是生成一个generator,生成器函数返回一个生成器. 实现一个generator:1.把列表的[ ]换成(),就创建了一个generator. >>> L = [x * x for x in range(10)] >>> L [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> g = (x * x for x in range

Python之生成器(generator)和迭代器(Iterator)

generator 生成器generator:一边循环一边计算的机制. 生成器是一个特殊的程序,可以被用于控制循环的迭代行为.python中的生成器是迭代器的一种,使用yield返回值函数,每次调用yield会暂停,可以使用next()函数和send()函数恢复生成器. 生成器类似于返回值为数组的一个函数,这个函数可以接受参数,可以被调用.但是,不同于一般函数会一次性返回包括了所有数值的数组,生成器一次只能产生一个值,这个消耗的内存数量将大大减小.因此,生成器看起来像是一个函数,但是表现得像迭代

Python高级编程之生成器(Generator)与coroutine(四):一个简单的多任务系统

啊,终于要把这一个系列写完整了,好高兴啊 在前面的三篇文章中介绍了Python的Python的Generator和coroutine(协程)相关的编程技术,接下来这篇文章会用Python的coroutine技术实现一个简单的多任务的操作系统 代码如下,可看注释 1 #-*-coding:utf-8 -*- 2 ''' 3 用Python和coroutine实现一个简单的多任务系统 4 ''' 5 # ##Step 1:Define Tasks###########################

Python 生成器&迭代器

Python 生成器 带有 yield 的函数在 Python 中被称之为 generator(生成器),用斐波那契数列: def fab(max):     n, a, b = 0, 0, 1     while n < max:         yield b         a, b = b, a + b         n = n + 1 执行: 1 2 3 4 5 6 7 8 9 >>> for n in fab(5):     print n 1 1 2 3 5 简单地