简介:生成器表达式是列表解析的一个扩展,生成器是特定的函数,允许你返回一个值,然后“暂停”代码执行,稍后恢复。它的语法与列表解析基本相同,不过函数的返回类型不是列表,而是生成器。
生成器表达式与列表解析:
两者的基本语法非常类似,举个例子:
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 += 1
count = 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'> None
6
<type 'int'> 9
9
<type 'NoneType'> None
10