python 生成器和迭代器
一、迭代器
所谓的迭代器就能具有next方法的对象,调用next方法是,迭代器返回其下一个值,若没有值,则返回StopInteration异常,__iter__方法返回一个迭代器
注意:python 3.0中,迭代器实现的方法为__next__,而不是next
>>> class Fib: def __init__(self): self.a=0 self.b=1 def __iter__(self): return self def next(self): self.a,self.b=self.b,self.a+self.b if self.a>100:raise StopIteration return self.a
>>> fib=Fib() >>> fib.next() 1 >>> fib.next() 1 >>> fib.next() 2 >>> fib.next() 3 >>> fib.next() 5 >>> fib.next() 8 >>> fib.next() Traceback (most recent call last): File "<pyshell#177>", line 1, in <module> fib.next() File "<pyshell#169>", line 10, in next if self.a>10:raise StopIteration StopIteration >>>
生成list,
>>> fib=Fib() >>> list(fib) <__main__.Fib instance at 0x00000000034603C8> [1, 1, 2, 3, 5, 8] >>> list(fib) <__main__.Fib instance at 0x00000000034603C8> []
>>> fib=Fib() >>> fib.next() 1 >>> list(fib) <__main__.Fib instance at 0x00000000036075C8> [1, 2, 3, 5, 8]
生成的list和当前迭代点有关,python提供内建函数iter,从可迭代对象获得迭代器
>>> alist='abcde'
>>> blist=[1,2,3,4]
>>> clist=('c','d','e')
>>> dlist={'a':1,'b':2}
>>> ita=iter(a)
>>> itb=iter(blist)
>>> ita=iter(alist)
>>> itc=iter(clist)
>>> itd=iter(dlist)
>>> itb.next()
1
>>> itc.next()
'c'
>>> ita.next()
'a'
>>> itd.next()
'a'
>>> itd.next()
'b'
字典迭代的为key
二、生成器
包含yield的语句的函数称为生成器,除了名字不同以外,和普通的函数也有很大的差异,这就在于它不像普通的函数返回值,而是每次产生一个断点,激活后就重那里开始
生成器由2部分组成,生成器函数和生成器的迭代器,前者是def定义包含yield语句的函数,后者为函数返回的部分
#!/usr/bin/env python #-*- coding:utf-8 -*- def yi(alist): for sublist in alist: for el in sublist: print "before stop-point" try: yield el except StopIteration: print "itering is over" print "after stop-point"
>>> import yie_test >>> a=[[1,2],[3,4]] >>> dir(yie_test) ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'yi'] >>> te=yie_test.yi(a) >>> te.next <method-wrapper 'next' of generator object at 0x7f3db05e8e10> >>> te.next() before stop-point 1 >>> te.next() after stop-point before stop-point 2 >>> te.next() after stop-point before stop-point 3可以看出在每次执行的时候在yield语句处停住,可以通过type命令查看yi()类型为generator
生成器其他方法:
send:外部域访问生成器的方法,需要在内部挂起生成器,yield作为表达式使用而不是语句,换句话说当生成器重新运行的时候,返回外部通过send发送的值
def repeater(value): while True: new=(yield value) if new is not None: value=new
>>> import yie_test >>> r=yie_test.repeater(10) >>> r.next() 10 >>> r.next() 10 >>> r.next() 10 >>> r.send(11) 11 >>> r.next() 11 >>> r.next() 11 >>> r.next() 11
close方法用于停止生成器
throw方法用于在生成器内部引发一个异常。
相关推荐
一、生成器 1.1 什么是生成器 generator:一边生成一边计算后面元素的机制,称为生成器,生成器里面保存的是算法,只有需要用到才会计算后面的值 1.2 通过列表生成式创建生成器 我们可以将列表生成式的中括号改成小...
python 生成器 & 迭代器
主要介绍了python 生成器和迭代器的原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Python中生成器和迭代器的区别(代码在Python3.5下测试): Num01–>迭代器 定义: 对于list、string、tuple、dict等这些容器对象,使用for循环遍历是很方便的。在后台for语句对容器对象调用iter()函数。iter()是python...
Python_生成器和迭代器的区别
Python中生成器和迭代器的区别详解.docx
迭代器概述: 访问集合元素的一种方式。 是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。 迭代器只能往前不会后退。 1. 创建迭代器对象 实例:基于list列表...
本文实例讲述了python 协程中的迭代器,生成器原理及应用。分享给大家供大家参考,具体如下: 1.迭代器理解 迭代器: 迭代器是访问可迭代对象的工具 迭代器是指用iter(obj)函数返回的对象(实例) 迭代器是指用next(it...
第一次写的文章 Python2.5中的迭代器与生成器
在本文里小编给大家分享了关于Python怎么生成一个迭代器的相关操作方法,有需要的朋友们可以学习参考下。
生成器与迭代器的Objective-C实现,实现类似ES6/Python的yield语意,async异步块,支持在Objective-C/Swift项目中以同步风格编写异步代码,避免长回调链和Promise链.
但是在我后来Python的使用以及TensorFlow等学习使用当中,我发现很多地方都用到了迭代器和生成器,或者是直接使用,或者是借鉴了思路。今天就让我们仔细来看看,它们到底是怎么回事。 迭代器 我们先从迭代器开始...
本文主要给大家记录一下列表生成式,生成器和迭代器的知识点,希望对大家学习python能够有所帮助
主要给大家介绍了关于Python中可迭代对象、迭代器和生成器的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和next()方法。其中__iter__()方法返回迭代器对象本身;next()方法返回容器的下一个元素,在结尾时引发StopIteration异常...
本篇将介绍Python3中的迭代器与生成器,描述可迭代与迭代器关系,并实现自定义类的迭代器模式。 迭代的概念 上一次输出的结果为下一次输入的初始值,重复的过程称为迭代,每次重复即一次迭代,并且每次迭代的结果是下...
14. 迭代器和生成器 迭代是Python最强大的功能之一,是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会...
本篇文章主要介绍Python的迭代和迭代器,可迭代对象的相关概念,有需要的小伙伴可以参考下