迭代器

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() 被抛弃。

参考资料

python中yield的用法详解——最简单,最清晰的解释

Python中的闭包