Python笔记(3)生成器

迭代器

可以写到for循环in后面的对象都是可迭代的,比如list,dict,字符串等。

#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

包含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为连起来。

时间: 2024-12-18 17:19:57

Python笔记(3)生成器的相关文章

Python笔记_01列表 和元祖

Python笔记 第一章 列表和元祖 1.通用序列操作 所有序列都可以进行某些特定操作,包括:索引(indexing).分片(slicing).加(adding).乘(multiplying)以及检查某元素是否属于列表成员. 迭代:依次对序列中的每个元素重复执行某些操作. 序列的索引:通过元素在列表中的位置可以定位到该元素,这就是列表的索引,使用类似于list[0]对元素进行索引,索引0指向第一个元素.也可使用负数对元素进行索引,使用负数对元素索引时,列表中的最后一个元素由-1表示,例如list

Python学习-39.Python中的生成器

先回顾列表解释 1 lista = range(10) 2 listb = [elem * elem for elem in lista] 那么listb就将会是0至9的二次方. 现在有这么一个需求,需要存储前10个斐波那契数到硬盘. 那么先写产生斐波那契数的函数: 1 def fib(max): 2 n,a,b = 0,0,1 3 while n < max: 4 print(b) 5 a,b = b,a + b 6 n+=1 这样就会打印出前max个斐波那契数了.接着我们再修改一下.(因为我

python中的生成器

python中的生成器其实就是一个特殊的迭代器,相比于每次迭代获取数据获得(通过next()函数)时生成元素,迭代的位置,数值返回等都需要我们设计.我们可以采用更加简洁的语法即生成器(generator). 通过列表生成式,我们可以直接创建一个列表.但是,如果我们说我们可能会通过算法根据前面的999999个数推出100w个数,但是我们此时只需要使用到前几个数,那么通过列表保存100w个数来备用就会用到巨大的空间.而我们却不一定会用到第100w个数,白白浪费了庞大的空间.因此我们就需要用到了生成器

python——迭代器、生成器、装饰器

迭代器 迭代器规则 迭代:重复做一些事很多次,就像在循环中那样. 不仅可以对字典和序列进行迭代,还可以对其他对象进行迭代:只要该对象实现了__iter__方法. __iter__方法会返回一个迭代器(iterator),所谓的迭代器就是具有next方法(这个方法在调用时不需要任何参数)的对象.在调用next方法时,迭代器会返回他的下一个值.如果next方法被调用,但迭代器没有值可以返回,就会引发一个StopIteration异常. 注意:迭代器规则在3.0中有一些变化.在新的规则中,迭代器对象应

玩蛇(Python)笔记之基础Part3

玩蛇(Python)笔记之基础Part1 一.集合 1.set 无序,不重复序列 {}创建,直接写元素 2.set功能 __init__()构造方法,,使用强制转换就会调用此方法 1 set1 = {'year', 'jiujiujiu'} 2 print(type(set1)) 3 # 创建集合 4 s = set() # 创建空集合 5 li = [11, 22, 11, 22] 6 s = set(li) set 3.集合的基本操作 1 # 操作集合 2 s1 = set() 3 s1.a

Python笔记(四)

在<Python笔记(三)>中,我记录关于Python中序列问题的知识.个人觉得确实比Java中的集合框架简单.之前也说了,Python是一种高级面向对象的语言,它的每一个变量都称为对象.今天我接触了面向对象的编程.下面是这篇博客的目录: 1.类与对象 2.输入输出 3.异常 类与对象: 我们都知道面向对象的语言具备四个特性:抽象,继承,封装,多态.Java,C++是这样,Python也不例外.在Python中,我们定义一个类,使用关键字class.形式如下:class classname:.

python笔记 - day7-1 之面向对象编程

python笔记 - day7-1 之面向对象编程 什么时候用面向对象: 多个函数的参数相同: 当某一些函数具有相同参数时,可以使用面向对象的方式,将参数值一次性的封装到对象,以后去对象中取值即可: sele是什么? self是一个python自动会给传值得参数: 哪个对象执行方法,self就是哪个对象: 构造方法: 类中有一个特殊的方法,__init__,类()自动执行: 面向对象,三大特性: 封装,继承,多态:  

Python笔记之不可不练

如果您已经有了一定的Python编程基础,那么本文就是为您的编程能力锦上添花,如果您刚刚开始对Python有一点点兴趣,不怕,Python的重点基础知识已经总结在博文<Python笔记之不可不知>中,尽管本文是自己学习Python过程中的总结,在大神看来,或许略欠火候,希望批评指正,万分感谢! 本文是作者学习成绩的见证,请尊重劳动成果!版权归作者和博客园共有,欢迎转载,但请保留本文出处http://www.cnblogs.com/itred/p/4687287.html ,  作者:itRed

python笔记之列表和元组

pyhton的列表和元组,说白了其实就是一种数据结构,只是在python当中更加方便的去操作而已.. 1.序列 其实字符串就是采取序列的方式的: string = "hello" print string[0] 结果为:h 对比其他编程语言,python还有一个负值索引的概念: 序列的分片: first = [0,1,2,3,4,5,6,7,9] print first[1:6:2] 针对first[1:6:2]这条语句: 1代表的起始索引,不写,默认为0 6代表结束索引,不写默认为所

整理python笔记

1.python笔记:while.if.for.编码 2.  模拟登陆 3.  python笔记:字符.列表.字典.元祖.数据类型