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

浙公网安备 33010602011771号