关于生成器和迭代器

首先,我们要讨论的三个对象:可迭代对象(iterables)、迭代器(iterator),生成器(generator)。

可迭代对象是每次可以返回一个元素的对象,如list,典型的可迭代对象。

事实上我们用到的很多内置函数,都会返回一个迭代器,如enumerate,zip。迭代器是一种表示数据流的对象,列表只是可迭代对象,不是迭代器,因为他不是数据流。迭代器用iter()函数得到:

  list1=[1,2,3,4]
  list2=iter(list1)
  print(next(list2))
  print(next(list2))
  >>>1
  >>>2

生成器,是用来创造迭代器的一种简单方式,但不是唯一方式。生成器函数如下:

def range(x):
	i=0
	while i<x:
	yield i
	i+=1

该函数就是一个生成器函数,注意有yield是生成器函数的标志。调用它
range(4)就会返回一个生成器(generator):

 	type(range(4))
 	>>> <class 'generator'>
 	for i in range(4):
 		print(i)

注意:遍历了生成器元素之后,它里面就没有元素了,再用list(range(4))它返回的只能是一个空列表,[ ].
也可以用以下式子得到生成器:

				get_data = (i for i in range(10))
				print(type(get_data))
				>>>  <class 'generator'>

遍历它来得到其中的元素(只能遍历一次)。

迭代器也具有同样的性质,里面的元素只能用一次:
在这里插入图片描述
在这里插入图片描述
如图,把迭代器b变成list后,再去迭代它,什么都没有得到。
在这里插入图片描述
在这里插入图片描述
即使不打印list(b),只要它list化了,迭代器b里面就已经没有元素了,所以运行结果为空。

在这里插入图片描述
在这里插入图片描述
如图,如果先迭代,再打印list(b),则它没有元素,得到的是空列表。

注意即使迭代器b里面没有元素了,它仍是迭代器:
看这里
运行结果
可以看到b的元素迭代完之后,得到的只能说空列表,然而b还是那个迭代器(iterator),它的地址没有变,只是里面没有元素了。

猜你喜欢

转载自blog.csdn.net/qq_43281207/article/details/83514935
今日推荐