python中迭代器和生成器
来源:互联网 发布:4g转有线网络 编辑:程序博客网 时间:2024/05/16 12:00
1
2
3
4
l=[
1
,
2
,
3
,
4
]
for
n
in
l:
print n
在看上面这段代码的时候,我们没有显式的控制列表的偏移量,就可以自动的遍历了整个列表对象。那么for 语句是怎么来遍历列表l的呢?要回答这个问题,我们必须首先来看一下迭代器相关的知识。
1.迭代器
迭代器对象要求支持迭代器协议,所谓支持迭代器协议就是对象包含__iter__()和next()方法。其中__iter__()方法返回迭代器对象自己;next()方法返回下一个前进到下一个结果,在结尾时引发StopIteration异常。
列表不是迭代器对象,但是列表通过__iter__()可以得到一个迭代器对象来遍历整个列表的内容,像列表这样的序列对象都属于这种情况;与序列不同,文件对象本身就是一种迭代器对象。
1
2
3
4
5
6
7
8
l=[
1
,
2
,
3
,
4
]
f=open(
'test.c'
,
'r'
)
iter(l) == l
Out[
131
]: False
iter (f)== f
Out[
132
]: True
一个迭代器的例子(来源:python tutorial)
1
2
3
4
5
6
7
8
9
10
11
12
class
Reverse:
"""Iterator for looping over a sequence backwards."""
def
__init__(
self
, data):
self
.data
=
data
self
.index
=
len
(data)
def
__iter__(
self
):
return
self
def
next
(
self
):
if
self
.index
=
=
0
:
raise
StopIteration
self
.index
=
self
.index
-
1
return
self
.data[
self
.index]
2.生成器
生成器使python可以很容易的支持迭代协议。生成器通过生成器函数产生,生成器函数可以通过常规的def语句来定义,但是不用return返回,而是用yeild一次返回一个结果,在每个结果之间挂起和继续它们的状态,来自动实现迭代协议。
一个生成器的例子(来源:python tutorial)
1
2
3
def
reverse(data):
for
index
in
range
(
len
(data)
-
1
,
-
1
,
-
1
):
yield
data[index]
3.for语句如何工作
在我们最前面的遍历列表的for语句中,for使用了列表支持迭代器的性质,可以每次通过调用迭代器的next()方法,来遍历到列表中的值,直到遇到StopIteration的异常。
4.注意的问题:
- 像列表这种序列类型的对象,我们可以通过iter()来产生多个迭代器,在迭代的过程中各个迭代器相互对立;但是迭代器对象没法通过iter()方法来产生多个不同的迭代器,它们都指向了自身,所以没法独立使用。
参考: python tutorial, stackoverflow
0 0
- python中迭代器和生成器
- python迭代器和生成器
- Python 迭代器和生成器
- Python 迭代器和生成器
- Python迭代器和生成器
- Python迭代器和生成器
- python迭代器和生成器
- Python迭代器和生成器
- python迭代器和生成器
- python 迭代器和生成器
- python 迭代器和生成器
- Python--迭代器和生成器
- python迭代器和生成器
- Python 迭代器和生成器
- python迭代器和生成器
- python--迭代器和生成器
- Python迭代器和生成器
- python迭代器和生成器
- rem em px 区别
- 【 Algorithm】顺序打印矩阵——美团四面
- iOS微信开放平台
- perl滑动匹配
- struts2防止页面重复提交的解决方案
- python中迭代器和生成器
- Ubuntu 14.04 Nydus VPN配置
- 一个字符串中包含另一个字符串所有字符的最短子串
- SVN服务器搭建和使用(一)
- 金融相关术语和产品
- 【转】提高Unity中管理多个相机的效率www.maiziedu.com
- LeetCode: Binary Tree Level Order Traversal
- 奇迹Mu分析 - 魔盒刷钱实现
- C语言字符串使用注意事项