Python(五)生成器、迭代器

一、生成器
求平方

//传统方法 浪费时间
square_table = []
for i in range(10000):
    square_table.append(i*i)
for i in range(10):
    print (square_table[i])

生成器(到使用的时候才做真正的计算,节省时间和空间)

square_generator = (x*x for x in range(50000))//range(50000)为生成器
for i in range10):
    print(next(square_generator))

示例:斐波那契数列

def fib(limit):
    n,a,b = 0,0,1
    while n<limit:
        #print(b)
        yield b
        a,b = b,a+b
        n += 1
    return 'done'
import traceback
f = fib(5)

try:
    print(next(f))
except StopITeration:
    traceback.print_exc()

for i in fib(5):
print(i)

二、yeild关键字
一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。

yield 的好处是显而易见的,把一个函数改写为一个 generator 就获得了迭代能力,比起用类的实例保存状态来计算下一个 next() 的值,不仅代码简洁,而且执行流程异常清晰。
详情请见:https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/

如何判断一个函数是否是一个特殊的 generator 函数?可以利用 isgeneratorfunction 判断:

from inspect import isgeneratorfunction 
isgeneratorfunction(fab) 
//True

三、迭代器(惰性计算,生成器是迭代器的一种)
迭代器持有一个内部状态的字段,用于记录下次迭代返回值,它实现了nextiter方法,迭代器不会一次性把所有元素加载到内存,而是需要的时候才生成返回结果。
那么什么迭代器呢?它是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,任何实现了iternext()(python2中实现next())方法的对象都是迭代器,iter返回迭代器自身,next返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常,至于它们到底是如何实现的这并不重要。

from collections import Iterable
from collections import Iterator
//判断列表和字典是否是可迭代的,结果返回True
print(isinstance([1,2,3],Iterable))//True
print(isinstance({},Iterabel))//True
print(isinstance(123,Iterabel))//False
print(isinstance(‘abc',Iterabel))//True
print(isinstance([1,2,3],Iterator))//数组是可迭代的,但不是可迭代器

g = (x*x for x in range(10))
print(type(g))
print(isinstance(g,Iterable))//True,是可迭代的,便可以用for循环来打印
for i in g:
    print(i)
//判断斐波那契函数是否是迭代器
def fib(limit):
    n,a,b = 0,0,1
    while n<limit:
        #print(b)
        yield b
        a,b = b,a+b
        n += 1
    return 'done'
f = fib(6)
print(type(f))
print(isinstance(f,iterable))//True
print(isinstance(f,iterator))//True
for i in f:
    print(i)

推荐一篇解释十分详细的文章:http://python.jobbole.com/87805/

猜你喜欢

转载自blog.csdn.net/Missayaaa/article/details/80042549