夕颜的python笔记003

#coding:utf-8#今天写个迭代器

class MyIterator(object):    def __init__(self):        self._res = [1,2,3]        self._n = 0    def next(self):        if self._n>=len(self._res):            raise StopIteration()        print ‘mynext‘        temp =  self._res[self._n]        self._n+=1        return temp    def __iter__(self):        print ‘myiter‘        return self

test = MyIterator()q = MyIterator()for i in test:这里执行的时候,首先会进入test的iter,然后进入test的next,因为用next来获取元素。    for j in q:
        print i,j
然后进入q的iter和next,执行3次,然后输出了1,1,1,2,1,3.然后问题来了。当test的next再次执行的时候i变成1,再次调用q的next的时候,发现q的_n还是3,不会进行第二次循环。那么,要如何在q内知道test的循环次数呢?

这时候让iter返回一个新的迭代器对象也许是可以的,这样每次都是一个新的迭代器对象于是就有了下面的
class NewIterator(object):    def __init__(self, n):        self._index = 0;        self._n = n    def next(self):        if self._index<=self._n:            temp = self._index            self._index += 1            return temp        else:            raise StopIteration()    def __iter__(self):        return self

class DDIteratror(object):    def __init__(self, n):        self._n = n    def __iter__(self):        return NewIterator(self._n)

test1 = DDIteratror(5)for i in test1:    for j in test1:        print i,j

通过iter()方法获得了list的迭代器对象,然后就可以通过next()方法来访问list中的元素了。当容器中没有可访问的元素后,next()方法将会抛出一个StopIteration异常终止迭代器。

由此来看for语句的时候,for语句是会自动的通过__iter__()方法来获得迭代器对象,并且通过next()方法来获取下一个元素。如最后这一部分,会首先调用test1的iter,返回了一个NewIterator对象,然后调用这个NewIterator对象的next来返回值。然后得到0,然后进入j的循环

又获得一个NewIterator对象,然后调用next返回0.然后接着调用next返回1,直至5,raise StopIteration,然后回到上一级别,调用next获得下一个值,然后又进入内层for语句,调用iter返回一个NewIterator对象

时间: 2024-10-18 01:07:04

夕颜的python笔记003的相关文章

Python笔记_01列表 和元祖

Python笔记 第一章 列表和元祖 1.通用序列操作 所有序列都可以进行某些特定操作,包括:索引(indexing).分片(slicing).加(adding).乘(multiplying)以及检查某元素是否属于列表成员. 迭代:依次对序列中的每个元素重复执行某些操作. 序列的索引:通过元素在列表中的位置可以定位到该元素,这就是列表的索引,使用类似于list[0]对元素进行索引,索引0指向第一个元素.也可使用负数对元素进行索引,使用负数对元素索引时,列表中的最后一个元素由-1表示,例如list

Python练习题 003:完全平方数

[Python练习题 003]一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? ------------------------------------------------- 所谓的“完全平方数”,就是开完根号仍然是整数. 数学渣是这么思考的:假设这个数 i 在10000以内.第一步:x = sqrt(i+100).如果 x == floor(x),则证明 x 是个整数.第二步道理也相同,但要记得把 x**2 把根号还原回来,再加上 168,然后再来

ObjectARX2010 学习笔记003:增加实体到数据库

AcDbObjectId PostToModelSpace(AcDbEntity *pEnt) { //定义块表 AcDbBlockTable *pBlk; acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlk,AcDb::kForRead); //定义块表记录 AcDbBlockTableRecord *pBlkTblRcd; pBlk->getAt(ACDB_MODEL_SPACE,pBlkTblR

玩蛇(Python)笔记之基础Part3

玩蛇(Python)笔记之基础Part1 一.集合 1.set 无序,不重复序列 {}创建,直接写元素 2.set功能 __init__()构造方法,,使用强制转换就会调用此方法 1 set1 = {'year', 'jiujiujiu'} 2 print(type(set1)) 3 # 创建集合 4 s = set() # 创建空集合 5 li = [11, 22, 11, 22] 6 s = set(li) set 3.集合的基本操作 1 # 操作集合 2 s1 = set() 3 s1.a

Python笔记(四)

在<Python笔记(三)>中,我记录关于Python中序列问题的知识.个人觉得确实比Java中的集合框架简单.之前也说了,Python是一种高级面向对象的语言,它的每一个变量都称为对象.今天我接触了面向对象的编程.下面是这篇博客的目录: 1.类与对象 2.输入输出 3.异常 类与对象: 我们都知道面向对象的语言具备四个特性:抽象,继承,封装,多态.Java,C++是这样,Python也不例外.在Python中,我们定义一个类,使用关键字class.形式如下:class classname:.

python笔记 - day7-1 之面向对象编程

python笔记 - day7-1 之面向对象编程 什么时候用面向对象: 多个函数的参数相同: 当某一些函数具有相同参数时,可以使用面向对象的方式,将参数值一次性的封装到对象,以后去对象中取值即可: sele是什么? self是一个python自动会给传值得参数: 哪个对象执行方法,self就是哪个对象: 构造方法: 类中有一个特殊的方法,__init__,类()自动执行: 面向对象,三大特性: 封装,继承,多态:  

Python笔记之不可不练

如果您已经有了一定的Python编程基础,那么本文就是为您的编程能力锦上添花,如果您刚刚开始对Python有一点点兴趣,不怕,Python的重点基础知识已经总结在博文<Python笔记之不可不知>中,尽管本文是自己学习Python过程中的总结,在大神看来,或许略欠火候,希望批评指正,万分感谢! 本文是作者学习成绩的见证,请尊重劳动成果!版权归作者和博客园共有,欢迎转载,但请保留本文出处http://www.cnblogs.com/itred/p/4687287.html ,  作者:itRed

python笔记之列表和元组

pyhton的列表和元组,说白了其实就是一种数据结构,只是在python当中更加方便的去操作而已.. 1.序列 其实字符串就是采取序列的方式的: string = "hello" print string[0] 结果为:h 对比其他编程语言,python还有一个负值索引的概念: 序列的分片: first = [0,1,2,3,4,5,6,7,9] print first[1:6:2] 针对first[1:6:2]这条语句: 1代表的起始索引,不写,默认为0 6代表结束索引,不写默认为所

整理python笔记

1.python笔记:while.if.for.编码 2.  模拟登陆 3.  python笔记:字符.列表.字典.元祖.数据类型