《Python数据科学指南》——1.9 生成一个迭代器和生成器

本节书摘来自异步社区《Python数据科学指南》一书中的第1章,第1.9节,作者[印度] Gopi Subramanian ,方延风 刘丹 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.9 生成一个迭代器和生成器

上一节,我们了解了什么是迭代器,这一节我们来讨论如何生成一个迭代器。

1.9.1 准备工作

生成器提供了清晰的语法,能够依次访问一个序列,并不需要使用__iter__和next()这两个函数。我们也不用写一个类了。请注意,生成器和可迭代这两者才能制造一个迭代器。

1.9.2 操作方法

如果你理解了前面小节里的推导,我们下面的示例你也能明白,在这个示例中,我们有一个生成器推导。回忆一下,我们曾经用下面的方式来进行一个元组推导,并得到了一个生成器对象。

SimpleCounter  = (x**2 for x in range(1,10))

tot = 0
for val in SimpleCounter:
     tot+=val

print tot

1.9.3 工作原理

很明显,上面的代码片段将算出给定范围的数的平方和,本例中的范围是从1到9(Python的range函数是右侧结束),使用生成器,我们创建了一个名为SimpleCounter的迭代器,我们用它在for循环中循序访问那些潜在的数据。请注意我们现在没有使用iter()函数,代码十分清晰,我们成功地用一种优雅的方式重建了我们的旧SimpleCounter类。

1.9.4 更多内容

让我们看看如何使用yield语句来创建一个生成器。

def my_gen(low,high):
     for x in range(low,high):
          yield x**2

tot = 0     

for val in my_gen(1,10):
     tot+=val
print tot

在上面的代码中,my_gen()函数就是一个生成器,我们使用yield语句来返回一个序列输出。

在前面的小节中,我们提到过生成器和可迭代两者才能制造一个迭代器,下面我们通过使用iter函数调用生成器来验证一下。

gen = (x**2 for x in range(1,10))

for val in iter(gen):
     print val

在我们进入下一节“使用可迭代对象”之前,强调一下使用生成器的注意事项,当我们完成对序列的访问时,就该立刻结束,不要再试图获取更多的数据。

使用生成器对象时,我们只能访问序列一次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值