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

# -*- coding: utf-8 -*-

# python:2.x

__author__ = ‘Administrator‘

#迭代器与生成器

#---------------------------------------

#迭代器基于2个方法

"""

next:返回容器下一个项目

__iter__:返回迭代器本身

"""

#通过内建函数和序列来创建

i=iter(‘abc‘)

print i.next()#a

print i.next()#b

print i.next()#c

#print i.next()异常StopIteration

#当序列遍历完之后,出现StopIteration异常,与循环进行兼容,可以通过 使用next方法类来得到结果

class Miter(object):

def __init__(self,a):

self.a=a

def next(self):

if self.a==0:

raise  StopIteration

self.a-=1

return self.a

def __iter__(self):

return self

for el in Miter(4):

print el

#注意:迭代器是底层特性和概念,一般情况下,程序代码中可以没有它们

#------------------------------

#生成器

#特点是:简单,高效,基于yield指令,可以暂停一个函数并返回中间结果,必须是可以恢复

def fib():

a,b=0,1

while True:

yield b

a,b=b,a+b

f=fib()

print f.next()#1

print f.next()#1

print f.next()#2

print [f.next() for i  in range(10)]#返回特殊的迭代器,也就是generator对象,请看:http://www.cnblogs.com/itech/archive/2011/01/19/1939119.html

#重点:当需要一个将返回一个序列或者在循环中执行的函数时,就考虑生成器

import tokenize

#官方文档:https://docs.python.org/2/library/tokenize.html

reader=open(‘a1.py‘,‘r‘).next

tokens=tokenize.generate_tokens(reader)

print tokens.next()#(53, ‘# -*- coding: cp936 -*-‘, (1, 0), (1, 23), ‘# -*- coding: cp936 -*-\n‘)

#注意:因为没有高级编程上面那个文件,所以只能使用自己的文件

print tokens.next()#(54, ‘\n‘, (1, 23), (1, 24), ‘# -*- coding: cp936 -*-\n‘)

print tokens.next()#(1, ‘def‘, (2, 0), (2, 3), ‘def a(a1):\n‘)

print tokens.next()#(1, ‘a‘, (2, 4), (2, 5), ‘def a(a1):\n‘)

"""

open()函数进行遍历了文件中每一行,generate_tokens()则在一个管道中对其进行遍历,完成一些额外的工作

"""

#例子:说明函数用来在序列上面定义一个转换,然后被链接起来应用 ,每次调用将处理一个元素,并返回它的结果

def power(values):

for values2 in values:

print values2

yield  values2

def addr(values):

for value in values:

print value

if value%2==0:

yield  value+3

else:

yield  value+2

el=[1,4,7,9,12,19]

res=addr(power(el))

print res.next()#1,1,3

#注意

"""

保持代码简单,而不是数据{

拥有许多简单的处理序列值的可迭代函数,要比一个复杂的,每次计算一个值的函数更好一些}

"""

#python引入的与生成器最后一个特性是提供了与next()方法调用的代码交互功能,yield变成一个表达式,而一个值 可以通过名为send新方法来传递

def psy():

print ‘pleass tell me your problems‘

while True:

anwer=(yield)

if anwer.endswith(‘?‘):

print ("don‘t ask your self")

elif ‘good‘ in anwer:

print ‘good gon‘

elif ‘bad‘ in anwer:

print ‘bad‘

Pay=psy()

Pay.next()#pleass tell me your problems

Pay.send(‘i fell bad‘)#bad

Pay.send(‘why i shou ?‘)#don‘t ask your self

#原理

"""

send的工作机制与next一样,但需要yield将变成能够返回传说的值,同时还有throw和close函数

throw允许客户端代码传入要招聘的任何类型的异常

close的工作方式是相同的,但是将会招聘一个特定的异常<GeneartorExit>,在这样的情况下,生成器函数必须再次GeneartorExit

或者StopIteration异常

"""

#典型生成器模板

def My_GeneartorExit():

try:

yield ‘something‘

except ValueError:

yield ‘dealing with the exception‘

finally:

print ‘ok clean‘

my=My_GeneartorExit()

print my.next()#ok clean和something

print my.throw(ValueError(‘mean mean mean‘))#dealing with the exception

my.close()#ok clean

#print my.next()StopIteration

#说明

"""

finally在之前版本是不允许使用的,它将捕获任何未被捕获的close和throw调用,是完成清理工作的推荐方式,

GeneartorExit异常在生成器中是无法被捕获的,因为它被编译器用来确定调用close时是否正常退出,如果有代码与这个异常关联,那么解释程序将抛出一个系统错误

并退出

"""

python高级编程之迭代器与生成器,布布扣,bubuko.com

时间: 2024-10-03 22:54:36

python高级编程之迭代器与生成器的相关文章

Python 函数式编程之迭代器、生成器及其应用

python 标准库中提供了 itertools, functools, operator三个库支持函数式编程,对高阶函数的支持,python 提供 decorator 语法糖. 迭代器 (iterator)和生成器(generator)概念是 python 函数式编程的基础,利用迭代器和生成器可以实现函数式编程中经常用到的 map(), filter(), reduce() 等过程以及 itertools, functools 中提供的绝大部分功能. 1.迭代器和生成器基础(next, ite

Python高级特性:迭代器和生成器 -转

在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了. 迭代器 迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和next()方法.其中__iter__()方法返回迭代器对象本身:next()方法返回容器的下一个元素,在结尾时引发StopIteration异常. __iter__()和next()

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

迭代器和生成器是python学者们经常谈到的话题,我也不能免俗,因为实在值得总结一下.     迭代器 迭代器是对可迭代对象进行操作,通过next方法一次吐出一个元素的工具.我们用到的for..in..内部使用的就是迭代器功能. 如果要自定义一个迭代器类的话,需要满足下面的条件: 需要在类中定义__iter__方法返回self自身,表示这是一个迭代器: 需要定义next方法来返回迭代的值,其中应该包含StopIteration异常的判断 下面试着写一个自定义迭代器类的例子(模仿自Python高级

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高级编程之生成器表达式和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高级编程之装饰器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敏捷开发方法为线索,阐述如何将已被验证的面向对象原则应用到设计中.这些内容为开发人员和项目管理人员提供了整个软件工程中的许多高级概念以及专家级的建议,其中有些内容的意义

Python高级编程和异步IO并发编程

Python高级编程和异步IO并发编程网盘地址:https://pan.baidu.com/s/1eB-BsUacBRhKxh7qXwndMQ 密码: tgba备用地址(腾讯微云):https://share.weiyun.com/5Z3x9V0 密码:7cdnb2 针对Python高级编程和异步IO并发编程,把每个Python高级知识点从起因到原理讲透的课程全网难寻 第1章 课程简介第2章 python中一切皆对象第3章 魔法函数第4章 深入类和对象第5章 自定义序列类第6章 深入python