初学python 迭代器和生成器是两个比较陌生的概念,下面根据《python基础教程》中相关内容进行总结:
简单来说,迭代器是一个对象,实现__iter__方法的对象,且对象中具有next方法(一个实现了__iter__方法的对象是可迭代的,一个实现了next方法的对象是迭代器);生成器是一个函数,具有yield的函数都可称为生成器。
迭代器
使用斐波那契数列为例:
使用迭代器如下
</pre><pre name="code" class="python">class fibs(object):
"""docstring for fibs"""
def __init__(self):
self.a=0
self.b=1
def next():
self.a, self.b=self.b, self.a+self.b
return self.a
def __iter(self):
return self使用
fib=fibs()
当然,fibs可以使用list实现,迭代器的优势在于,不用像list一样一次性开辟大量内存空间获取所有值,迭代器只需计算一个值获取一个值,不用担心list长度问题。
内建函数iter()可以从可迭代的对象中获取迭代器:
如it=iter([1,2,3])
使用list可以从迭代器获取序列:
list(it)
生成器
生成器是一个含有yield语句的函数,他的行为与普通函数有很大区别。不同于return直接返回值,yield每次产生一个值,然后将函数冻结等待被激活,函数被激活后从停止的那点继续执行。
使用一个展开嵌套列表的函数作为例子进行说明:
要将一个嵌套列表展开 nested=[[[1,2],3],[4,5]]
因为列表的嵌套层数未知,因此使用递归是一个较好的方法。
def flatten(nested):
try:
for sublist in nested:
for eliment in flatten(sublist):
yield eliment
except TypeError:
yield nested>>>list(flatten(nested))
[1,2,3,4,5]
使用生成器解决把皇后问题:
def juede(state, nextX):
nextY=len(state)
for i in range(nextY):
if abs(state[i]-nextX) in (0,nextY-i):
return True
return False
def queen(num=8,state=()):
for pos in range(num):
if not juede(state,pos):
if len(state)==num-1:
yield (pos,)
else:
for result in queen(num,state+(pos,)):
yield (pos,)+result
print 'total num:',len(list(queen(8)))
for result in queen(8):
print result来源:CSDN
作者:白浪淘沙
链接:https://blog.csdn.net/hbbaiyu/article/details/38460519