for in列表一次性加载列表的所有数据到内存,而迭代器通过一次只加载一项数据,有效避免了当加载的列表过大导致内存不足问题
生成器
有两种方法提供生成器:生成器函数,生成器表达式
- 生成器函数:常规函数定义,只是用yield而不是return返回结果。yield语句一次返回一个结果,在每个结果蹭挂起函数状态,以便下次从它离开的地方继续执行
def gensquares(N):
for i in range(N):
yield i ** 2
for item in gensquares(5):
print(item)
# 使用普通函数一次性生成一个列表
def gensquares(N):
res = []
for i in range(N):
res.append(i*i)
return res
for item in gensquares(5):
print(item)
- 生成器表达式:类似列表推导,只不过不是一次性生成一个结果列表
squares = (x**2 for x in range(5))
for item in squares(5):
print(item)
显然使用推导式代码更少更易理解
为了避免定义难理解,可以简单地认为
迭代器就是一个可迭代对象,可以在for in中迭代出各元素
生成器的作用差不多就是生成一个可迭代对象
注意:生成器生成的可迭代对象只能遍历一次