python的迭代器for_python特性(二):迭代器与for语句
转自 http://blog.csdn.net/hedan2013/article/details/55000399
网上许多文章说Python的for语句中,in关键字后面的对象是一个集合。例如
for i in [1,2,3]
print i
上面代码中in关键字后面的对象[1,2,3]是一个list,也是一个集合。
但in关键字后面的对象其实不必是一个集合。后面接一个序列对象也是合法的。 例如
myrange = MyRange(0, 10)
for i in myrange:
print i
上面代码中的myrange对象是一个序列对象,但不是集合。参见上一篇博文。
事实上,for语句中in关键字后面的对象也不必是序列对象,它只需要是一个可迭代对象(Iterable)即可。
一个可迭代的对象需要满足下面两个条件之一:
它实现了__iter__方法。该方法会返回一个迭代器对象。
或者它是一个序列对象。
注意:如果一个类型实现了__iter__方法,那么在该方法中显式地给出了与该类型相关的迭代器如何构造。可是,对于序列类型来说,它有一个很天然的迭代器。因此,无需通过实现__iter__方法来显式定义。下一篇博文将介绍如何通过序列对象构造天然的迭代器。这里先介绍迭代器对象的严格定义。
一个迭代器,本质上也是一个序列。它需要实现下面两个方法。
next方法(老版本的Python叫__next__方法)。当第1次调用next方法时,会返回序列的第1个元素;当第2次调用next方法时,会返回序列的第2个元素;当序列中的元素耗尽,抛出StopIteration异常。
__iter__方法。前面说过__iter__方法通常返回迭代器对象。因此,对于一个迭代器来说,它的__iter__方法只需返回其本身即可。
通过上面的定义,我们知道,一个迭代器对象,也必是可迭代的。
下面的代码定义了一个迭代器。
class MyIterator:
def __init__(self, start, end):
self.start = start
self.end = end
def next(self):
if self.start >= self.end:
raise StopIteration
self.start = self.start + 1
return self.start - 1
def __iter__(self):
return self
测试代码
myiter = MyIterator(0, 2)
print myiter.next()
print myiter.next()
print myiter.next()
输出结果如下
0
1
Traceback (most recent call last):
File "test.py", line 27, in
print myiter.next()
File "test.py", line 16, in next
raise StopIteration
StopIteration
下面的代码测试在for语句中使用迭代器
myiter = MyIterator(0, 10)
for i in myiter:
print i
输出结果
0
1
2
3
4
5
6
7
8
9
在下一篇博文中,将继续介绍for语句的工作原理。
python的迭代器for_python特性(二):迭代器与for语句相关推荐
- python学习笔记分享(二十四)python学习笔记分期补充(二)复数,randint与sample,进制转换表,转义字符,二维数组,键,end,pass,迭代器和生成器
一:复数 Python支持复数,复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型. complex(x) 将x转换到一个复数,实数部 ...
- Python基础教程-第9章-魔法方法、特性和迭代器
在Python中,有些名称很特别,开头和结尾都是两个下划线.你在本书前面已经见过一些, 如__future__. 在这样的名称中,很大一部分都是魔法(特殊)方法的名称.如果你的对象实现了这些方法,它们 ...
- Python高级特性:迭代器和生成器
在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了 ...
- [C#基础知识系列]专题十二:迭代器
引言: 在C# 1.0中我们经常使用foreach来遍历一个集合中的元素,然而一个类型要能够使用foreach关键字来对其进行遍历必须实现IEnumerable或IEnumerable<T> ...
- python函数名的运用,闭包,迭代器
一.函数名的运用 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量. 1.函数名的内存地址 1 def func(): 2 print("呵呵") 3 prin ...
- 第九章 魔法方法、特性和迭代器
第九章 魔法方法.特性和迭代器 构造函数 构造函数(constructor),它其实就是初始化方法,只是命名为__init__. 构造函数不同于普通方法的地方在于,将在对象创建后自动调用它们. 在Py ...
- STL — 迭代器设计思维(二)
迭代器设计思维(二) 上一篇博客主要介绍了STL迭代器中的5种类型的迭代器,以及迭代器当中的5种相应型别,最后提到了traits编程技法. 这些都是尤为重要的,我们阅 读源码最重要的就是理解加应用. ...
- python学习之路day05(迭代器和生成器)
1.迭代器 # ### 迭代器 """能被next调用,并不断返回下一个值的对象""" """ 特征:迭代器会 ...
- python 生成器 原理_python 生成器和迭代器的原理解析
一.生成器简介 在python中,生成器是根据某种算法边循环边计算的一种机制.主要就是用于操作大量数据的时候,一般我们会将操作的数据读入内存中处理,可以计算机的内存是比较宝贵的资源,我认为的当要处理的 ...
最新文章
- 简易git操作 -- 让你的格子绿起来
- 趣话题:底层码农的心酸,那么我们 如何避免成为底层码农呢?
- dos窗口ping命令测试实战
- Manacher 例题讲解
- 中国最让人脸红的节目:爆火14年的湿身诱惑,为何还没被叫停?
- 苹果再遭炮轰;ofo 收购哈罗?华为推可折叠 5G 手机 | 极客头条
- pytorch_GPU安装
- mysql数据库的三级模式_数据库的三级模式和两级映射
- HTML5——用a标签在当前网页跳转和打开新页面再跳转
- JDBC连接池技术与Druid
- pythonexcel怎么生成_Python自动生成Excel,python,excel
- Youtube CC字幕是什么,Caption和Subtitle的解释
- 基于MFC的U盘检测与文件拷贝程序
- 信息安全行业从业指南2.0
- 爬虫进阶:使用fiddler抓取手机app数据
- Android 11何时进入手机,以及如何安装?
- python sendkeys用法_Python Selenium 文件上传之SendKeys
- 童年依恋风格影响成年后的两性关系
- 宝塔linux面板什么原理,宝塔Linux面板是什么
- python公司网站毕业设计开题报告