python高级编程-Part1 生成器和迭代器

迭代器和生成器是python学者们经常谈到的话题,我也不能免俗,因为实在值得总结一下。


    迭代器

迭代器是对可迭代对象进行操作,通过next方法一次吐出一个元素的工具。我们用到的for..in..内部使用的就是迭代器功能。

如果要自定义一个迭代器类的话,需要满足下面的条件:

  • 需要在类中定义__iter__方法返回self自身,表示这是一个迭代器;
  • 需要定义next方法来返回迭代的值,其中应该包含StopIteration异常的判断

下面试着写一个自定义迭代器类的例子(模仿自Python高级编程一书):

class CustomIter(object):
    def __init__(self, step):
        self.step = step
            
    def __iter__(self):
        return self
    
    def next(self):
        if self.step == 0:
            return StopIteration
        
        self.step -=1
        return self.step
    
i = CustomIter(2)  #此处如果换为for i in CustomIter(2),则不需要后续的next手工调用,
                   #也不会出现StopIteration的异常,因为for循环内部实现了next调用
print i.next()
print i.next()
print i.next()

运行结果如下:
1
0
<type ‘exceptions.StopIteration‘>

迭代器实际是一种底层的特性和概念,但是为生成器提供了一种支持。

生成器

有记忆性的函数暂停和恢复执行的表现,使用yield替代return语句,表示每次返回一个值并暂停执行。当再次被外部next调用时,利用函数上下文自动从暂停的位置继续运行,直到再次遇到yield语句。

让我们从代码中理解上面没太听明白的话:

#!/usr/bin/env python
#encoding:utf-8

def testGenerator():  
    for x in ("first", "second", "third"):
        print "this is " + x
        yield x #每次返回x之后,会停止
        print "do other things"

b = testGenerator()
print b.next()
print u"\n------再次执行next():------\n"
#再次运行next
print b.next()

运行结果如下:
this is first
first

------再次执行next():------

do other things
this is second
second

生成器的其他形式:

yield表达式,即在函数体中存在var = (yield),表示可以得到客户端调用send(生成器对象的方法)发送进来的数据

后面再说吧,头疼

时间: 2024-10-14 22:07:20

python高级编程-Part1 生成器和迭代器的相关文章

python高级编程之生成器表达式和itertools模块

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #生成器表达式和itertools模块 #yield 中可以使用圆括号代替中括号 iter0=(x**2 for x  in range(10)if x%2==0) for iter1 in iter0: print iter1 #结果 """ 0 4 16 36 64 """ #这样的表达式被称为生成器或者gene

Python高级编程之生成器(Generator)与coroutine(二):coroutine介绍

原创作品,转载请注明出处:点我 上一篇文章Python高级编程之生成器(Generator)与coroutine(一):Generator中,我们介绍了什么是Generator,以及写了几个使用Generator Function的示例,这一小节,我们会介绍Python的coroutine,以及会有一个小例子,再接下来的文章中会以代码的形式一步步介绍coroutine的高级用法. coroutine(协程) 什么是coroutine?coroutine跟Generator有什么区别?下面先看一段

Python高级编程之生成器(Generator)与coroutine(一):Generator

这是一系列的文章,会从基础开始一步步的介绍Python中的Generator以及coroutine(协程)(主要是介绍coroutine),并且详细的讲述了Python中coroutine的各种高级用法,最后会用coroutine实现一个简单的多任务的操作系统. 其实也是看完这篇文章的学习笔记吧!O(∩_∩)O 生成器(Generator) 什么是生成器?在Python中,生成器(Generator)是一个带有yield关键字的函数 1 def gene(): 2 a = 1 3 print "

Python高级编程之生成器(Generator)与coroutine(四):一个简单的多任务系统

啊,终于要把这一个系列写完整了,好高兴啊 在前面的三篇文章中介绍了Python的Python的Generator和coroutine(协程)相关的编程技术,接下来这篇文章会用Python的coroutine技术实现一个简单的多任务的操作系统 代码如下,可看注释 1 #-*-coding:utf-8 -*- 2 ''' 3 用Python和coroutine实现一个简单的多任务系统 4 ''' 5 # ##Step 1:Define Tasks###########################

python高级编程-Part2 高效的迭代器模块itertools

这篇文章将对python内置的迭代器模块做个简单的介绍. 我们已经了解到,可迭代对象和迭代器的关系.这里不妨总结一次,以期待听到不一样的声音, 纯属探讨.可迭代对象是指具有迭代特质的一种类型,而迭代是迭代器提供的一种功能,即每次返回一个元素并且依次返回元素的能力.比如列表或元组就是一个可迭代对象.而可迭代对象经过内置iter方法处理后就会得到迭代器对象: In [8]: iList = iter([1,2,3]) In [9]: type(iList) Out[9]: listiterator

Python高级编程之生成器(Generator)与coroutine(二):coroutine与pipeline(管道)和Dataflow(数据流_

原创作品,转载请注明出处:点我 在前两篇文章中,我们介绍了什么是Generator和coroutine,在这一篇文章中,我们会介绍coroutine在模拟pipeline(管道 )和控制Dataflow(数据流)方面的运用. coroutine可以用来模拟pipeline行为.通过把多个coroutine串联在一起来实现pipe,在这个管道中,数据是通过send()函数在各个coroutine之间传递的: 但是这些在pipe中传递的数据哪里来的呢?这就需要一个数据源,或者说producer.这个

python高级编程之迭代器与生成器

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #迭代器与生成器 #--------------------------------------- #迭代器基于2个方法 """ next:返回容器下一个项目 __iter__:返回迭代器本身 """ #通过内建函数和序列来创建 i=iter('abc') print i.next()#a print i.next(

python高级编程之装饰器04

from __future__ import with_statement # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #with和contextlib #对于要确保即使发生一个错误时也能运行一些清理代码而言,try...finally语句很有用,对以下场景,如: """ 关闭一个文件, 释放一个锁 创建一个临时代码补丁 在特殊环境中运行受保护代码 ----------- with语句覆盖

Python高级编程pdf

下载地址:网盘下载 内容简介  · · · · · · <Python高级编程>通过大量的实例,介绍了Python语言的最佳实践和敏捷开发方法,并涉及整个软件生命周期的高级主题,诸如持续集成.版本控制系统.包的发行和分发.开发模式.文档编写等.<Python高级编程>首先介绍如何设置最优的开发环境,然后以Python敏捷开发方法为线索,阐述如何将已被验证的面向对象原则应用到设计中.这些内容为开发人员和项目管理人员提供了整个软件工程中的许多高级概念以及专家级的建议,其中有些内容的意义