转自  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语句相关推荐

  1. python学习笔记分享(二十四)python学习笔记分期补充(二)复数,randint与sample,进制转换表,转义字符,二维数组,键,end,pass,迭代器和生成器

    一:复数 Python支持复数,复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型. complex(x) 将x转换到一个复数,实数部 ...

  2. Python基础教程-第9章-魔法方法、特性和迭代器

    在Python中,有些名称很特别,开头和结尾都是两个下划线.你在本书前面已经见过一些, 如__future__. 在这样的名称中,很大一部分都是魔法(特殊)方法的名称.如果你的对象实现了这些方法,它们 ...

  3. Python高级特性:迭代器和生成器

    在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了 ...

  4. [C#基础知识系列]专题十二:迭代器

    引言: 在C# 1.0中我们经常使用foreach来遍历一个集合中的元素,然而一个类型要能够使用foreach关键字来对其进行遍历必须实现IEnumerable或IEnumerable<T> ...

  5. python函数名的运用,闭包,迭代器

    一.函数名的运用 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量. 1.函数名的内存地址 1 def func(): 2 print("呵呵") 3 prin ...

  6. 第九章 魔法方法、特性和迭代器

    第九章 魔法方法.特性和迭代器 构造函数 构造函数(constructor),它其实就是初始化方法,只是命名为__init__. 构造函数不同于普通方法的地方在于,将在对象创建后自动调用它们. 在Py ...

  7. STL — 迭代器设计思维(二)

    迭代器设计思维(二) 上一篇博客主要介绍了STL迭代器中的5种类型的迭代器,以及迭代器当中的5种相应型别,最后提到了traits编程技法. 这些都是尤为重要的,我们阅 读源码最重要的就是理解加应用.  ...

  8. python学习之路day05(迭代器和生成器)

    1.迭代器 # ### 迭代器 """能被next调用,并不断返回下一个值的对象""" """ 特征:迭代器会 ...

  9. python 生成器 原理_python 生成器和迭代器的原理解析

    一.生成器简介 在python中,生成器是根据某种算法边循环边计算的一种机制.主要就是用于操作大量数据的时候,一般我们会将操作的数据读入内存中处理,可以计算机的内存是比较宝贵的资源,我认为的当要处理的 ...

最新文章

  1. 简易git操作 -- 让你的格子绿起来
  2. 趣话题:底层码农的心酸,那么我们 如何避免成为底层码农呢?
  3. dos窗口ping命令测试实战
  4. Manacher 例题讲解
  5. 中国最让人脸红的节目:爆火14年的湿身诱惑,为何还没被叫停?
  6. 苹果再遭炮轰;ofo 收购哈罗?华为推可折叠 5G 手机 | 极客头条
  7. pytorch_GPU安装
  8. mysql数据库的三级模式_数据库的三级模式和两级映射
  9. HTML5——用a标签在当前网页跳转和打开新页面再跳转
  10. JDBC连接池技术与Druid
  11. pythonexcel怎么生成_Python自动生成Excel,python,excel
  12. Youtube CC字幕是什么,Caption和Subtitle的解释
  13. 基于MFC的U盘检测与文件拷贝程序
  14. 信息安全行业从业指南2.0
  15. 爬虫进阶:使用fiddler抓取手机app数据
  16. Android 11何时进入手机,以及如何安装?
  17. python sendkeys用法_Python Selenium 文件上传之SendKeys
  18. 童年依恋风格影响成年后的两性关系
  19. 宝塔linux面板什么原理,宝塔Linux面板是什么
  20. python公司网站毕业设计开题报告

热门文章

  1. 如何在vc的拆分窗口中使用CFormView派生类
  2. BCH协议升级倒计时——超过68%的BCH全节点已支持升级
  3. 斯洛文尼亚接受BCH支付的商家达343家,日本和北昆士兰州对BCH接受度增长迅速
  4. 暴涨!BTC忠实粉丝转向BCH为BCH网络添砖加瓦
  5. pycharm以及flask的安装
  6. SCCM2012R2之二安装SQL Server
  7. Android Studio ndk-Jni开发详细
  8. 关于Eclipse平台的使用和开发第一个SWT程序
  9. javafx官方文档学习之二Scene体系学习一
  10. leetcode18