Python编程学习——生成器

来源:互联网 发布:ib网络是什么意思啊 编辑:程序博客网 时间:2024/06/06 13:08

简介:生成器表达式是列表解析的一个扩展,生成器是特定的函数,允许你返回一个值,然后“暂停”代码执行,稍后恢复。它的语法与列表解析基本相同,不过函数的返回类型不是列表,而是生成器。

生成器表达式与列表解析:
两者的基本语法非常类似,举个例子:

a = [i for i in xrange(5)]      # 列表解析b = (i for i in xrange(5))      # 生成器表达式

列表解析返回的是一个列表,生成器表达式返回的是一个生成器,我们用generator.next()方法来访问它的内容。在实际使用中,可以把生成器看成一个一次性的链表。
生成器表达式在大文件处理中有重要的意义,此时列表解析虽然方便,但是却会耗费巨大的内存,在这种情况下,使用生成器就是最好的选择。
举个例子——寻找文件的最长行:

# 列表解析f = open("Your path", "r")lines = [len(x.strip()) for x in f]res = max(lines)f.close()# 生成器表达式f = open("Your path", "r")res = max(len(x.strip()) for x in f)f.close()

生成器与yield关键字:
生成器的语法当然不止表达式一种,否则的话太局限了,如果我们需要编写复杂的生成器,就需要用到yield关键字。
yield关键字的意义有点像return关键字,同样需要在函数中使用,区别在于yield返回的东西被放在一个生成器里,下面是一个简单的生成器例子:

def gen():    yield 1    yield "2222"    yield 3.14

使用这个生成器:

>>> type(gen())<generator object gen at 0x7f11128c3    e10>>>> testGen = gen()>>> testGen.next()1>>> testGen.next()'2222'>>> testGen.next()Traceback (most recent call last):  File "<stdin>", line 1, in <module>StopIteration

加强特性:
生成器可以是永远运行的,举个例子:

def counter(start = 0):    count = start    while True:        val = yield count        print type(val), val        if val is not None:            count = val        else :             count += 1count = counter(5)print count.next()print count.next()print count.send(9)print count.next()count.close()

这个生成器使用start为初始值,每次调用next方法进行累加计数。send方法,允许用户重置count值;close方法,结束生成器。
输出:

5<type 'NoneType'> None6<type 'int'> 99<type 'NoneType'> None10
0 0
原创粉丝点击