一、迭代

迭代就是逐个并且单向访问容器 (这里的容器暂时指数据类型,比如list和dict) 中的元素的行为。举个例子:将一个长度为五的数组逐个从头到尾(即单向)打印的方式称之为迭代。如下图。

>>> list = [1,2,3,4,5]
>>> for i in list:
... print i
...
1
2
3
4
5

二、迭代器

1、迭代器概念

迭代器简单的说就是可以对数据(这里指可以迭代的数据)进行迭代行为的对象。

可以通过以下两个方面描述迭代器[4]:

1)、iter 返回的是迭代器对象本身。用在for 和 in 上面。

2)、每次调用next() 方法返回迭代器的下一个元素,当没有元素可以返回就会抛出异常;

迭代器可以理解为可以逐个并单向访问容器中元素的游标。

而迭代器对象只能迭代一次,也就是返回最后的值后,再继续访问,只会返回异常。

下面举个例子(2):

>>> list = [1,2,3,4,5]
>>> iterator = iter(list)
>>> iterator.next()
1
>>> iterator.next()
2
>>> iterator.next()
3
>>> iterator.next()
4
>>> iterator.next()
5
>>> iterator.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration

2、迭代器的实现[4]:

接下通过定义一个迭代器来实现迭代功能, 这个是官方文档的例子[4]:

先定义(个人觉得这个例子不合适,有个更好的找不到,自己也暂时想不出)

class Counter(object):
def __init__(self, low, high):
self.current = low
self.high = high def iter(self):
'Returns itself as an iterator object'
return self def next(self):
'Returns the next value till current is lower than high'
if self.current > self.high:
raise StopIteration
else:
self.current += 1
return self.current - 1

再实现

test1 = Counter(1,3).iter()
print "test1"
print next(test1)
print next(test1)
print next(test1) test2 = Counter(1,3)
print "test2"
print next(test2)
print next(test2)
print next(test2)
print next(test2)

这是输出

#test1 的输出
test1
1
2
3
#test2 的输出
test2
1
2
3
StopIteration

注意test2的next调用超过里面的元素就会抛出异常

三、生成器

生成器也是迭代器,但比迭代器多了一个关键字yeild. 这个yield功能替代了迭代器的iter 和 next 功能。

我在参考的时候看到一个概况的很好的说法。

“yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象(转自[2], 作者:廖雪峰)”

举个例子(3),先定义一个生成器

def counter_generator(low, high):
while low <= high:
yield low
low += 1

实现

i= counter_generator(1, 3)
print(i.next())
print(i.next())
print(i.next())
print(i.next())

输出

1
2
3
StopIteration

再举个例子(4),先定义一个生成器

>>>  def fab(max):
... n, a, b = 0, 0, 1
... while n < max:
... yield b
... a, b = b, a + b
... n = n + 1
>>> f = fab(5)
>>> print f.next() #这里返回的值可以当做 'b' 的值
1
>>> print f.next()
1
>>> print f.next()
2
>>> print f.next()
3
>>> print f.next()
5
>>> print f.next()
StopIteration

参考:

[1] Python中iteration(迭代)、iterator(迭代器)、generator(生成器)等相关概念的理解[2]:
http://blog.csdn.net/dawningblue/article/details/72629362

[2] Python yield 使用浅析
https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/

[3] Iterator - Python Wiki
https://wiki.python.org/moin/Iterator

[4] python官方文档定义

https://pymbook.readthedocs.io/en/latest/igd.html

最新文章

  1. VS2010中dumpbin工具的使用
  2. 化繁为简,最简易的SqlDataSource配合Cache使用~
  3. SpringMVC笔记
  4. 2014 -&gt; 2015
  5. docker管理shipyard中文版v3.0.2更新
  6. [moka同学笔记]yii2.0小物件的简单使用(第二种方法)
  7. FJNU 1151 Fat Brother And Geometry(胖哥与几何)
  8. Swift 算法实战之路:基本语法与技巧
  9. javascript 关于一周前一个月前的处理方法
  10. Hadoop基本知识,(以及MR编程原理)
  11. c++编辑器配置
  12. LeetCode(485. 最大连续1的个数)
  13. 使用PerfView监测.NET程序性能(四):折叠,过滤和时间范围选择
  14. MS SQL Server 定时任务实现自动备份
  15. PS_Form个性化选择Block自动查询和查询条件排序实现(案例)
  16. requests-html的js执行功能简单使用
  17. ubuntu 忘记root密码
  18. jQuery源代码学习_工具函数_type
  19. Java企业微信开发_00_源码及资源汇总贴
  20. POJ1006Biorhythms——中国剩余定理

热门文章

  1. 第三十二节,使用谷歌Object Detection API进行目标检测、训练新的模型(使用VOC 2012数据集)
  2. 安卓手机root
  3. linux 下配置svn
  4. windows怎样查看被程序占用的端口
  5. Luogu P2770 航空路线问题
  6. IAR STM32 ------ CSTACK HEAP 设置一次可用栈的大小,HardFault_Hander
  7. bind,apply,call,caller,callee还傻傻分不清楚?
  8. 基本类型(2):oracle中有4个大对象(lobs)类型可用,分别是blob,clob,bfile,nclob。
  9. Matlab2017A破解版安装详细图文教程(附破解补丁) 64位
  10. windows server 禁用智能卡服务的步骤