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() 被抛弃。
参考资料
最怕一生碌碌无为,还说平凡难能可贵。