Python编程学习——生成器

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

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

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值