参考自:http://www.cnblogs.com/huxi/category/251137.html

迭代器

迭代器是访问集合内元素的一种方式,他不能倒退只能一直迭代下去。可以写到for循环in后面的对象都是可迭代的,比如list,dict,字符串等。

迭代器的一个优点就是它不要求你事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如很大的文件,或是斐波那契数列等等。这个特点被称为延迟计算或惰性求值(Lazy evaluation)。

迭代器提供了一个统一的访问集合的接口。只要是实现了__iter__()方法的对象,就可以使用迭代器进行访问。

iter获取迭代对象,next()方法访问下一个元素,访问越界会有stopIteration。

python中的 for循环会自动调用iter()获得迭代器,next()下一个元素,自动检测StopIteration。

自己实现一个迭代器,如上所述,只需要在类的__iter__方法中返回一个对象,这个对象拥有一个next()方法,这个方法能在恰当的时候抛出StopIteration异常即可。但是需要自己实现迭代器的时候不多,即使需要,使用生成器会更轻松。

上图 圆括号为生成器表达式,返回迭代器,方括号为列表解析,他们俩很相似,一般都说列表解析,但是在生成的数据很大或明确要列表的时候,用生成器表达式更佳。

列表解析(生成器表达式)是很pythonic的一种写法。

列表解析可以替代绝大多数需要用到map和filter的场合,可能正因为此,著名的静态检查工具pylint将map和filter的使用列为了警告。

生成器

生成器是迭代器,同时也并不仅仅是迭代器,不过迭代器之外的用途实在是不多,所以可以说:生成器提供了非常方便的自定义迭代器的途径。

生成器拥有next方法并且行为与迭代器完全相同,这意味着生成器也可以用于Python的for循环中。另外,对于生成器的特殊语法支持使得编写一个生成器比自定义一个常规的迭代器要简单不少,所以生成器也是最常用到的特性之一。

#Fibonacci
def fib_opt(n):
a,b,i=0,1,0
while i<n:
a,b=b,a+b
i+=1
else:
return b

print [fib_opt(i)  for i in range(100)]  在算100的时候,前面99个还是要重新计算。重复计算了很多次。

包含yield语句的函数会被编译成生成器。生成器是惰性求值的。

当函数被调用时,他们返回一个生成器对象,这个对象支持迭代器接口。不像一般的函数会返回生成值后退出,生成器函数在返回生成值后会自动挂起并暂停他们的执行和状态变量将被保存,这些信息在函数恢复时将再度有效。

def fib_iter():
a, b = 0, 1
while True:
yield b
a, b = b, a + b

迭代中每次都会返回迭代值,但是下次调用的时候,他继续之前的计算而不是重新计算。

import time

start = time.clock()
opt_result = [fib_opt(i) for i in range(10000)]
end = time.clock()
print end - start print "------------------------------"
A = fib_iter()
start = time.clock()
iter_result = [A.next() for i in xrange(10000)]
end = time.clock()
print end - start

  

差了3000倍

yield除了next还有send方法。yield可以使用send方法向函数传递参数。

Itertools

import itertools

horses=[1,2,3,4]
races = itertools.permutations(horses) a=itertools.product([1,2],[3,4])
b=itertools.repeat([1,2],4) c=itertools.chain(races, a, b) print [i for i in c]

这个工具 返回的 races,a,b都是迭代器,permutation为所有的两两组合。product为第一个列表和第二个列表中各取一个组合,repeat上面为[1,2]重复四次,chain为连起来。

更多的内容可以去查阅官方文档。

Python笔记(3)迭代器与生成器的更多相关文章

  1. python is、==区别;with;gil;python中tuple和list的区别;Python 中的迭代器、生成器、装饰器

    1. is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同 == 比较的是两个对象的内容是否相等 2. with语句时用于对try except finally 的优 ...

  2. python设计模式之迭代器与生成器详解(五)

    前言 迭代器是设计模式中的一种行为模式,它提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示.python提倡使用生成器,生成器也是迭代器的一种. 系列文章 python设计模 ...

  3. Python 闭包、迭代器、生成器、装饰器

    Python 闭包.迭代器.生成器.装饰器 一.闭包 闭包:闭包就是内层函数对外层函数局部变量的引用. def func(): a = "哈哈" def func2(): prin ...

  4. Python 从零学起(纯基础) 笔记 之 迭代器、生成器和修饰器

    Python的迭代器. 生成器和修饰器 1. 迭代器是访问集合元素的一种方式,从第一个到最后,只许前进不许后退. 优点:不要求事先准备好整个迭代过程中的所有元素,仅仅在迭代到某个元素时才计算该元素,而 ...

  5. python学习笔记四 迭代器,生成器,装饰器(基础篇)

    迭代器 __iter__方法返回一个迭代器,它是具有__next__方法的对象.在调用__next__方法时,迭代器会返回它的下一个值,若__next__方法调用迭代器 没有值返回,就会引发一个Sto ...

  6. 终于理解Python中的迭代器和生成器了!

    迭代器和生成器 目录 迭代器和生成器 可迭代对象和迭代器 基础概念 判断 for循环本质 不想用for循环迭代了,如何使用迭代器? 列表推导式 生成器Generator 概念 如何实现和使用? 生成器 ...

  7. Python中的迭代器和生成器

    本文以实例详解了python的迭代器与生成器,具体如下所示: 1. 迭代器概述: 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后 ...

  8. Python基础之迭代器和生成器

    阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...

  9. Python学习之迭代器和生成器

    那么首先什么是迭代器和生成器呢? 迭代器即迭代的工具,那么什么又是迭代呢?所谓迭代:迭代是一个重复的过程,每次重读即一次迭代,并且每次迭代的结果都是下一次迭代的初始值.例: l=[1,2,3] cou ...

  10. Python系列之 迭代器和生成器

    很多Python的程序员都会混淆 迭代器 和 生成器 的概念和作用,分不清到底两个有什么区别.今天我们来好好说一说这两个概念. 迭代器(Iterator) Iterator Pattern Itera ...

随机推荐

  1. 升级Xcode8、iOS10问题记录

    1.webView的代理方法: 升级前: - (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)e ...

  2. React Native环境配置和简单使用

    # 前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会 ...

  3. KVC&&&KVO

    KVC 什么是KVC --->What KVC指的就是NSKeyValueCoding非正式协议. KVC是一种间接地访问对象的属性的机制. 这种间接表现在通过字符串来标识属性,而不是通过调用存 ...

  4. Android 面试题汇总

    面试题基础储备 1.Activity相关 a.Activity的特点 1.可见  2.可交互 他之所以可交互,是因为他同时实现了Window.Callback和KeyEvent.Callback, 可 ...

  5. 初学RunLoop

    RunLoop 运行循环,跑圈 可以看出每条线程都有一个与之对应的RunLoop对象 主线程的RunLoop已经自动创建好了,子线程的RunLoop需要主动创建. 基本作用:保持程序的持续运行 处理A ...

  6. Xamarin For Visual Studio 3.0.54.0 完整离线破解版(C# 开发Android、IOS工具 吾乐吧软件站分享)

    Xamarin For Visual Studio就是原本的Xamarin For Android 以及 Xamarin For iOS,最新版的已经把两个独立的插件合并为一个exe安装包了.为了区分 ...

  7. ref

    ref:  当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中. 例如: class RefExample { //使用ref返回的函数 static void Method(ref ...

  8. socket-详细分析No buffer space available

    关键词:socket,tcp三次握手,tcp四次握手,2MSL最大报文生存时间,LVS,负载均衡 新年上班第一天,突然遇到一个socket连接No buffer space available的问题, ...

  9. 从零自学Hadoop(02):环境准备

    阅读目录 起因 虚拟机 Linux 系统安装 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceL ...

  10. 深入理解Thread.sleep的含义

    转载一篇对sleep说的非常好的一篇文章,原文http://www.cnblogs.com/ILove/archive/2008/04/07/1140419.html 我们可能经常会用到 Thread ...