码迷,mamicode.com
首页 > 编程语言 > 详细

Python笔记(3)生成器

时间:2016-07-15 06:09:05      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:

迭代器

可以写到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为连起来。

 

Python笔记(3)生成器

标签:

原文地址:http://www.cnblogs.com/zephyr-1/p/5665524.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!