"""
迭代器是一个可以迭代的对象,对于较大的数据集,通过创建该数据集的迭代器用于遍历
可以降低内存的占用量。
"""
ls = [1, 2, 3]
iterator = iter(ls) # 创建列表的迭代器
# 可以用for循环、next函数来遍历迭代器,但只能遍历一次,遍历完后再进行第二次遍历抛出StopIteration
for i in iterator:
print(i, end=",")
print()
iterator1 = iter(ls)
done = False
while not done:
try:
print(next(iterator1), end=',') # next返回迭代对象的下一个元素,没有后续元素时抛出StopIteration
except StopIteration:
done = True
print("已遍历完!")
生成器
"""
生成器(generator)是对一定运算规则的封装,生成器是懒惰计算,并不根据设定的运算规则计算出
实际结果,程序只有执行到yield时才生成数据,可以显著降低对内存的占用。而如果采用列表来存储
大的数据集会消耗大量内存。
使用return的函数和使用yield的函数不同,函数执行到return时结束函数并返回值,而执行到yield
返回一个按预定运算规则计算的值。
"""
def number(n): # 定义生成器
for i in range(n):
yield i ** 5
generator = number(3) # 创建生成器
# 可以通过for循环、next函数遍历生成器,但只能遍历一次,遍历完后再进行第二次遍历抛出StopIteration
for i in generator:
print(i, end=', ')
print()
generator1 = (i for i in range(3)) # 创建生成器
done = False
while not done:
try:
print(next(generator1), end=', ')
except StopIteration:
done = True
print('已遍历完')
# 由其他生成器创建生成器
def number_square(n):
"""平方序列生成器。"""
for i in range(n):
yield i ** 2
def number_square_cube(n):
"""平方、立方序列生成器。"""
yield from number_square(n) # 由其他生成器创建生成器
for j in range(n):
yield j ** 3
squares = number_square(5)
squares_cubes = number_square_cube(5)
for i in squares:
print(i, end=', ')
print()
for i in squares_cubes:
print(i, end=', ')
迭代器和生成器占用内存
# 迭代器和生成器都是懒惰计算,只在需要时进行计算,可以节省内存占用
import sys
ls1 = []
for i in range(3000):
ls1.append(i)
print("列表占用内存:", sys.getsizeof(ls1))
ls2 = [i for i in range(3000)] # 列表推导公式使代码简洁,但是不一定节省内存
print(type(ls2), end=",")
print("列表占用内存:",sys.getsizeof(ls2))
iterator = iter(ls1) # 迭代器可以显著降低内存的占用
print(type(iterator), end=",")
print("迭代器占用内存:", sys.getsizeof(iterator))
generator = (i for i in range(3000)) # 生成器可以显著降低内存的占用
print(type(generator), end=",")
print("生成器占用内存:", sys.getsizeof(generator))