Python学习笔记——迭代器和生成器
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学习笔记——迭代器和生成器的更多相关文章
- Python学习之迭代器和生成器
那么首先什么是迭代器和生成器呢? 迭代器即迭代的工具,那么什么又是迭代呢?所谓迭代:迭代是一个重复的过程,每次重读即一次迭代,并且每次迭代的结果都是下一次迭代的初始值.例: l=[1,2,3] cou ...
- python学习-38迭代器和生成器
迭代器和生成器 ---- 迭代器协议和for循环工作机制 1.迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么引起一个Stoplteration异常,以终止迭代(只能往 ...
- Python学习--07迭代器、生成器
迭代 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration). Python里使用for...in来迭代. 常用可迭代对象有 ...
- Python学习笔记 - 迭代器Iterator
我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的genera ...
- python学习日记(迭代器、生成器)-乱七八糟
迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...
- python学习 day13 迭代器,生成器,枚举对象
一.复习 1.闭包:定义在函数内部的函数(被函数嵌套的函数) 2.装饰器:闭包的一个应用场景 -- 为一个函数添加新功能的工具 3.开放封闭原则:不能修改源代码,不能修改调用方式,但可以对外提供增加新 ...
- python 学习分享-迭代器与生成器篇
迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式.. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后 ...
- Python学习之--迭代器、生成器
迭代器 迭代器是访问集合元素的一种方式.从对象第一个元素开始访问,直到所有的元素被访问结束.迭代器只能往前,不能往后退.迭代器与普通Python对象的区别是迭代器有一个__next__()方法,每次调 ...
- python学习之迭代器与生成器
1.迭代器省内存 迭代器只允许往后读数据,不允许回读数据 迭代器不能跳着读文件,因为他是一点一点加载文件内容到内存的,读完了可以销毁或丢掉 2.生成一个迭代器 a = iter(["fd&q ...
随机推荐
- C#中string[]数组和list<string>泛型的相互转换 【转】
http://www.cnblogs.com/szjdw/archive/2012/03/09/2387885.html 1,从System.String[]转到List<System.Stri ...
- 在华为eNSP中配置简单的DHCP
拓扑图,如图1 图1 在AR1中的配置过程如图2 图2 通过PC1查看是否分配了地址,如图3 图3
- MapReduce(一) mapreduce基础入门
一.mapreduce入门 1.什么是mapreduce 首先让我们来重温一下 hadoop 的四大组件:HDFS:分布式存储系统MapReduce:分布式计算系统YARN: hadoop 的资源调度 ...
- Howto run google-chrome as root
Just want to add a permanent solution to the problem: 1. Open google-chrome located in /usr/bin with ...
- Winform中的Treeview动态绑定数据库
http://bbs.csdn.net/topics/370139193 SQL code ? 1 2 3 4 5 6 CREATE TABLE [dbo].[Company] ( [Id ...
- ubuntu 安装微信开发者工具
https://github.com/cytle/wechat_web_devtools 实测:64位 32位的可以... 参考命令; 2030 sudo apt-get install wine1 ...
- Kubernetes - Deploy Guestbook example on Kubernetes
This scenario explains how to launch a simple, multi-tier web application using Kubernetes and Docke ...
- libiconv的注意项
编译后有用的头文件zlib.h和zconf.h,使用时#include "zlib.h". 其中有三个核心的函数: iconv_ticonv_open(constchar*toco ...
- OpenCV---圆检测
推文:Opencv2.4.9源码分析——HoughCircles 霍夫圆检测 加载一幅图像并对其模糊化以降噪 对模糊化后的图像执行霍夫圆变换 . 在窗体中显示检测到的圆. def detect_cir ...
- [USACO07FEB] Lilypad Pond
https://www.luogu.org/problem/show?pid=1606 题目描述 FJ has installed a beautiful pond for his cows' aes ...