`
rockkyle
  • 浏览: 10359 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

python 生成器和迭代器

阅读更多

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方法用于在生成器内部引发一个异常。

分享到:
评论

相关推荐

    python生成器和迭代器区别

    一、生成器 1.1 什么是生成器 generator:一边生成一边计算后面元素的机制,称为生成器,生成器里面保存的是算法,只有需要用到才会计算后面的值 1.2 通过列表生成式创建生成器 我们可以将列表生成式的中括号改成小...

    python 生成器 & 迭代器.pdf

    python 生成器 & 迭代器

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

    主要介绍了python 生成器和迭代器的原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Python中生成器和迭代器的区别详解

    Python中生成器和迭代器的区别(代码在Python3.5下测试): Num01–&gt;迭代器 定义: 对于list、string、tuple、dict等这些容器对象,使用for循环遍历是很方便的。在后台for语句对容器对象调用iter()函数。iter()是python...

    Python_生成器和迭代器的区别.pdf

    Python_生成器和迭代器的区别

    Python中生成器和迭代器的区别详解.docx

    Python中生成器和迭代器的区别详解.docx

    Python语言基础:迭代器和生成器.pptx

    迭代器概述: 访问集合元素的一种方式。 是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。 迭代器只能往前不会后退。 1. 创建迭代器对象 实例:基于list列表...

    python 协程中的迭代器,生成器原理及应用实例详解

    本文实例讲述了python 协程中的迭代器,生成器原理及应用。分享给大家供大家参考,具体如下: 1.迭代器理解 迭代器: 迭代器是访问可迭代对象的工具 迭代器是指用iter(obj)函数返回的对象(实例) 迭代器是指用next(it...

    Python2.5中的迭代器与生成器(自己写的)

    第一次写的文章 Python2.5中的迭代器与生成器

    Python生成一个迭代器的实操方法

    在本文里小编给大家分享了关于Python怎么生成一个迭代器的相关操作方法,有需要的朋友们可以学习参考下。

    swift-生成器与迭代器的Objective-C实现

    生成器与迭代器的Objective-C实现,实现类似ES6/Python的yield语意,async异步块,支持在Objective-C/Swift项目中以同步风格编写异步代码,避免长回调链和Promise链.

    五分钟带你搞懂python 迭代器与生成器

    但是在我后来Python的使用以及TensorFlow等学习使用当中,我发现很多地方都用到了迭代器和生成器,或者是直接使用,或者是借鉴了思路。今天就让我们仔细来看看,它们到底是怎么回事。 迭代器 我们先从迭代器开始...

    python生成器与迭代器详解

    本文主要给大家记录一下列表生成式,生成器和迭代器的知识点,希望对大家学习python能够有所帮助

    一篇文章弄懂Python中的可迭代对象、迭代器和生成器

    主要给大家介绍了关于Python中可迭代对象、迭代器和生成器的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    深入讲解Python中的迭代器和生成器

    迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和next()方法。其中__iter__()方法返回迭代器对象本身;next()方法返回容器的下一个元素,在结尾时引发StopIteration异常...

    详解Python3中的迭代器和生成器及其区别

    本篇将介绍Python3中的迭代器与生成器,描述可迭代与迭代器关系,并实现自定义类的迭代器模式。 迭代的概念 上一次输出的结果为下一次输入的初始值,重复的过程称为迭代,每次重复即一次迭代,并且每次迭代的结果是下...

    快速学习-Python迭代器和生成器

    14. 迭代器和生成器 迭代是Python最强大的功能之一,是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会...

    Python迭代和迭代器详解

    本篇文章主要介绍Python的迭代和迭代器,可迭代对象的相关概念,有需要的小伙伴可以参考下

Global site tag (gtag.js) - Google Analytics