1、手动遍历迭代器

  使用next函数,并捕获StopIteration异常。

def manual_iter():
with open('./test.py') as f:
try:
while True:
line = next(f)
print line
except StopIteration:
pass

next函数也可以指定值来标记结尾

def manual_iter():
with open('./test.py') as f:
try:
while True:
line = next(f, None)
if line == None:
break
print line
except StopIteration:
pass

  使用for循环操作迭代器就不用考虑StopIteration异常,底层自动处理这些细节

2、代理迭代

使用iter来返回指定对象的迭代,iter(s)只是简单的通过调用 s.__iter__() 方法来返回对应的迭代器对象

class Node:
def __init__(self, value):
self._value = value
self._children = [] def __repr__(self):
return 'Node({!r})'.format(self._value) def add_child(self, node):
self._children.append(node) def __iter__(self):
return iter(self._children) node1 = Node(1)
node2 = Node(2)
root = Node('root')
root.add_child(node1)
root.add_child(node2)
i = iter(root)
print next(i)
print next(i) for n in root:
print n
 

  需要注意的是,实现了__iter__()可以使用for循环,但是不能直接使用next()进行调用,要想使用next,必须先调用root.iter()

3、实现迭代器协议

Python的迭代协议要求一个 __iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了next 方法,注意python3中是__next__方法。并通过 StopIteration 异常标识迭代的完成。最简单的方式就是代理迭代中使用的方式。还有一种方式就是__iter__()返回对象本身,该对象实现next()方法。

class Fib(object):
def __init__(self):
self.a, self.b = 0, 1 # 初始化两个计数器a,b def __iter__(self):
return self # 实例本身就是迭代对象,故返回自己 def next_(self): # 在python3中,为__next__()
self.a, self.b = self.b, self.a + self.b # 计算下一个值
if self.a > 100000: # 退出循环的条件
raise StopIteration()
return self.a # 返回下一个值

4、反向迭代

  使用内置的reversed可以实现反向迭代,前提是对象大小可以确定,或者实现了__reversed__方法。

a = [1, 2, 3, 4]
for x in reversed(a):
print x

  使用__reversed__方法

class Countdown:
def __init__(self, start):
self.start = start # Forward iterator
def __iter__(self):
n = self.start
while n > 0:
yield n
n -= 1 # Reverse iterator
def __reversed__(self):
n = 1
while n <= self.start:
yield n
n += 1 for rr in reversed(Countdown(30)):
print rr
for rr in Countdown(30):
print rr

5、迭代器切片

  对迭代器进行切片操作,可以使用itertools.islice()方法来实现,函数 islice() 返回一个可以生成指定元素的迭代器,它通过遍历并丢弃直到切片开始索引位置的所有元素。 然后才开始一个个的返回元素,并直到切片结束索引位置。

def count(n):
while True:
yield n
n += 1
c = count(10)
import itertools
for x in itertools.islice(c, 10, 20):
print x

Python学习笔记——迭代器和生成器的更多相关文章

  1. Python学习之迭代器和生成器

    那么首先什么是迭代器和生成器呢? 迭代器即迭代的工具,那么什么又是迭代呢?所谓迭代:迭代是一个重复的过程,每次重读即一次迭代,并且每次迭代的结果都是下一次迭代的初始值.例: l=[1,2,3] cou ...

  2. python学习-38迭代器和生成器

    迭代器和生成器 ---- 迭代器协议和for循环工作机制 1.迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么引起一个Stoplteration异常,以终止迭代(只能往 ...

  3. Python学习--07迭代器、生成器

    迭代 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration). Python里使用for...in来迭代. 常用可迭代对象有 ...

  4. Python学习笔记 - 迭代器Iterator

    我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的genera ...

  5. python学习日记(迭代器、生成器)-乱七八糟

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...

  6. python学习 day13 迭代器,生成器,枚举对象

    一.复习 1.闭包:定义在函数内部的函数(被函数嵌套的函数) 2.装饰器:闭包的一个应用场景 -- 为一个函数添加新功能的工具 3.开放封闭原则:不能修改源代码,不能修改调用方式,但可以对外提供增加新 ...

  7. python 学习分享-迭代器与生成器篇

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式.. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后 ...

  8. Python学习之--迭代器、生成器

    迭代器 迭代器是访问集合元素的一种方式.从对象第一个元素开始访问,直到所有的元素被访问结束.迭代器只能往前,不能往后退.迭代器与普通Python对象的区别是迭代器有一个__next__()方法,每次调 ...

  9. python学习之迭代器与生成器

    1.迭代器省内存 迭代器只允许往后读数据,不允许回读数据 迭代器不能跳着读文件,因为他是一点一点加载文件内容到内存的,读完了可以销毁或丢掉 2.生成一个迭代器 a = iter(["fd&q ...

随机推荐

  1. 我是一个CPU:这个世界慢!死!了!

    最近小编看到一篇十分有意思的文章,多方位.无死角的讲解了CPU关于处理速度的理解,看完之后真是豁然开朗.IOT时代,随着科技的发展CPU芯片的处理能力越来越强,强大的程度已经超乎了我们的想象.今天就把 ...

  2. 洛谷 P4754 True Vegetable 解题报告

    P4754 True Vegetable 题目描述 小A现在有N道题,编号为1,2,⋯,N.每道题的起始毒瘤程度为0或1.在每天,小A可以将编号连续的K道题的毒瘤程度+1.但小B因为本身比较菜,不是很 ...

  3. Redis的Set无序集合命令

    Set是集合,它是string类型的无序集合.set是通过hash table实现的,添加.删除和查找的复杂度都是0(1).对集合我们可以取并集.交集.差集.通过这些操作我们可以实现sns中的好友推荐 ...

  4. 【bzoj2588】Count on a tree

    Portal -->bzoj2588 Solution 不行我一定要来挂这道题qwq很气愤qwq(其实还不是因为自己蠢..) 额首先说一下正解 如果这个问题放在序列上面的话..直接离散化一下然后 ...

  5. MATLAB2010安装方法

    MATLAB2010安装方法 第一步选择无网络安装. 选择yes,然后点击next 激活序列号在crack文件夹中的txt文档中 这一步按照图片上的显示操作就可以 选择经典安装 按提示操作,这一步事激 ...

  6. HDU 2586 倍增法求lca

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  7. 全能型eclipse 下载

    百度网盘地址: 链接: https://pan.baidu.com/s/1RFUkdSZUfuubFATLVdVH3w 提取码:kncg 这个eclipse几乎包含了现在所有的开发语言

  8. xshell输入奇怪,空格间距变大

    https://www.macx.cn/thread-2018939-1-1.html 按一下shift+空格就行了 全角/半角转换的快捷键... dd

  9. OpenCV---Canny边缘提取

    一:Canny算法介绍 Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是: 好的检测- 算法能够尽可能多地标识出图像中的实际边缘. 好的定位- 标识出的边缘要尽可能与实际图像中的实 ...

  10. 动态规划:双重DP

    之前做过的传纸条那道题就是双重动态规划的典型应用,题意就不描述了,直接贴一下以前写过的,经典代码 #include<iostream> using namespace std; ,maxm ...