generator

generator是一个能够返回迭代器对象(iterable)的函数.

from inspect import isgeneratorfunction
isgeneratorfunction(xxx)#判断函数xxx是否是生成器
isgenerator(xxx)#判断xxx是否是生成器
isinstance('abc',Iterable)#判断是否是可迭代对象
isinstance(xxx, types.GeneratorType) #判断xxx是否是generator

创建一个Python generator就像创建一个函数一样简单,只不过不使用return 声明,而是使用yield声明.

如果一个函数至少包含一个yield声明(当然它也可以包含其他yield或return),那么它就是一个generator.

yield和return都会让函数返回一些东西,区别在于,return声明彻底结束一个函数,而yield声明是暂停函数,保存它的所有状态,并且后续被调用后会继续执行.
generator函数被调用的时候,会返回一个iterator对象,但是函数并不会立即开始执行
一旦一个generator执行到yield语句,generator函数暂停,程序控制流被转移到调用方

def my_gen():
    n = 1
    print('This is printed first')
    # Generator function contains yield statements
    yield n

    n += 1
    print('This is printed second')
    yield n

    n += 1
    print('This is printed at last')
    yield n

a = my_gen()#创建一个generator对象
a.next()#运行到下一个yield,并停止
a.next()#运行到下一个yield,并停止

#用一个for循环接受一个迭代对象(),且使用next()函数迭代它,当遇到StopIteration异常时自动停止。
for item in my_gen():
    print(item)
my_list = [1, 3, 6, 10]
[x**2 for x in my_list]  #这是一list [1,9,36,100]
(x**2 for x in my_list)  #这是一generator
for item in (x**2 for x in my_list):
    print(item)

可迭代对象(iterable)
何可以使用在for...in...语句中的对象都可以叫做可迭代对象(实现了__iter__)。
可迭代对象的一个缺点是,其值都需要存储在内存中, 当它由大量元素时,这会是个灾难

迭代器(iterator)
迭代器(实现了__next__)
当一个可迭代对象作为参数传递给内建函数iter()时,它会返回一个迭代器对象,或者调用内建方法__iter__()
迭代器的一个用处就是它通过next()不断返回下一个数,内存占用始终为一个数的量

生成器(Generators)
生成器也是一个迭代器,但是你只可以迭代他们一次,不能重复迭代,因为它并没有把所有值存储在内存中,而是实时地生成值

#迭代器版本的斐波那契
class Fab(object): 
 
    def __init__(self, max): 
        self.max = max 
        self.n, self.a, self.b = 0, 0, 1 
 
    def __iter__(self): 
        return self 
 
    def next(self): 
        if self.n < self.max: 
            r = self.b 
            self.a, self.b = self.b, self.a + self.b 
            self.n = self.n + 1 
            return r 
        raise StopIteration()
#使用yield生成器版本
 def fab(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        yield b 
        # print b 
        a, b = b, a + b 
        n = n + 1 

Itertools模块包含一些特殊的函数用来操作可迭代对象。

from itertools import combinations
teams = ["Packers", "49ers", "Ravens", "Patriots"]
for game in combinations(teams, 2):
    print game

range #返回List
xrange #返回一个iterable

posted @ 2018-01-30 11:46  blog_hfg  阅读(128)  评论(0)    收藏  举报