Python迭代器和生成器

迭代器

"""
迭代器是一个可以迭代的对象,对于较大的数据集,通过创建该数据集的迭代器用于遍历
可以降低内存的占用量。
"""
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))
  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值