Python 迭代器和生成器

℡╲_俬逩灬. 提交于 2019-12-03 03:31:03

初学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()

可以生成迭代器对象fib,使用fib.next()可以依次访问fib中的值,当然也可以使用for i in fib:进行访问。
当然,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




易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!