标签:
可以写到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语句的函数会被编译成生成器。生成器是惰性求值的。
当函数被调用时,他们返回一个生成器对象,这个对象支持迭代器接口。不像一般的函数会生成值后退出,生成器函数在生成值后会自动挂起并暂停他们的执行和状态,他的本地变量将保存状态信息,这些信息在函数恢复时将再度有效。
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方法向函数传递参数。
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为连起来。
标签:
原文地址:http://www.cnblogs.com/zephyr-1/p/5665524.html