异想天开

What's the true meaning of light, Could you tell me why

Python迭代器和生成器

日期:2015-07-14 16:32:02
  
最后更新日期:2016-08-06 21:50:33
1.迭代器 很多容器对象都可以使用for遍历,而for遍历可以看成为下面两个步骤的合成:
1.对容器调用iter(),返回容器的迭代器
2.对迭代器调用next()方法,当没有元素时,next方法会抛出StopIteration异常
写一个带有迭代器功能的类如下,例子来源于参考1:
[code lang="cpp"]
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]

>>> rev = Reverse('spam')
>>> iter(rev)
<__main__.Reverse object at 0x00A1DB50>
>>> for char in rev:
... print char
...
m
a
p
s
[/code]
2.生成器Generators 生成器可以看成是利用yield语义来自动构造next方法,yield调用即等价返回类next()方法返回的内容,同时yield会保存此刻的调用状态。
[code lang="cpp"]
def reverse(data):
for index in range(len(data)-1, -1, -1):
yield data[index]

>>> for char in reverse('golf'):
... print char
...
f
l
o
g
[/code]
python的OS模块的walk返回的就是一个生成器,利用该生成器可以遍历文件目录:
[code lang="cpp"]
def testwalk():
tree = os.walk("/home/foo/test")
for dirpath,dirs,files in tree:
print dirpath,": "
for file in files:
print os.path.join(dirpath,file)
[/code]
注:
生成器的好处在于迭代次数变多时,可以不必保存一个大数组,占用内存空间。
参考:
https://docs.python.org/2.6/tutorial/classes.html#generators