Python 迭代器与生成器
迭代器
wiki百科:在 Python 中,迭代器是遵循迭代协议的对象。使用 iter() 从任何序列对象中得到迭代器(如 list, tuple, dictionary, set 等)。另一种形式的输入迭代器是 generator(生成器)。
举例
# 迭代器部分 # 简单的遍历方法 for item in [1,2,3,4,6]: print(item) # 不使用for进行遍历 a = iter([1,2,3,4,6]) print(next(a)) print(next(a))
输出:
1 2 3 4 6 1 2
个人理解:
函数 next() 每次只迭代一次,因此只返回一个值。
生成器
廖雪峰解释:通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)。
生成器也是一种只能迭代一次的迭代器,因为它们并没有把所有的值存在内存中,而是在运行时生成值。
生成器都是迭代器,但迭代器不一定是生成器。
作用:节省内存,只需要在用的时候计算元素的值就行。适合处理非常大的文件。
举例
# 生成器 # 生成器有两种产生方式,一种是列表生成式加括号,比如 range() 函数,另一种一般通过 yield 去实现 def reverse(data): for index in range(len(data)-1, -1, -1): yield data[index] for char in reverse("0123456789"): print(char)
输出:
9 8 7 6 5 4 3 2 1 0
个人理解:
在 Python 2 中,xrange 用法与 range 完全相同,所不同的是生成的不是一个数组,而是一个生成器。
在 Python 3 中,range() 是像 xrange() 那样实现,xrange() 被抛弃。