python_迭代器与生成器

本文深入解析Python中的迭代器和生成器概念,包括如何使用iter()和__next__()方法自定义迭代器,以及生成器函数如何通过yield语句产生一系列结果。同时,对比了迭代器与生成器的差异,帮助理解两者在不同场景下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

迭代器

>>> a=[1,2,3]
>>> it=iter(a)
>>> print(it)
<list_iterator object at 0x000001AC6F61AB08>
>>> print(it.__next__())
1
>>> print(it.__next__())
2
>>> print(it.__next__())
3
>>> print(it.__next__())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> a=[1,2,3,4,5]
>>> a=iter(a)
>>> next(a)
1
>>> next(a)
2
>>> next(a)
3
>>> next(a)
4
>>> next(a)
5
>>>
>>> try:                  
...     next(a)
... except StopIteration:
...     print("没有元素可以用了")
...
没有元素可以用了

自定义迭代器

iter()和__next__()方法这两个方法是迭代器最基本的方法:
➢一个用来获得迭代器对象
➢一个用来获取容器中的下一个元素

class MyRange(object):
    def __init__(self, n):
        self.idx = 0
        self.n = n

    def __iter__(self):
        return self
 
    def __next__(self):
        if self.idx < self.n:
            val = self.idx
            self.idx += 1
            return val
        else:
            raise StopIteration()

myRange = MyRange(3)
print (next(myRange))
print (next(myRange))
print (next(myRange))

C:\Users\39621>py -3 d:\2019\py1.py
0
1
2

生成器

如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推 算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python 中,这种一边循环一边计算的机制,称为生成器(Generator)。
迭代器只是遍历,生成器要计算。

l=(x*x for x in range(10))
print(l)
print(next(l))
print(next(l))
print(next(l))

for i in l:
print(i)

C:\Users\39621>py -3 d:\2019\py1.py
<generator object <genexpr> at 0x0000020FFBE236C8>
0
1
4
9
16
25
36
49
64
81
def odd():
    print ('step 1')
    yield 1
    print ('step 2')
    yield 3
    print ('step 3')
    yield 5

o = odd()
print (next(o))
print (next(o))
print (next(o))

for i in o:
    print (i)   #可以遍历执行函数

迭代器与生成器的区别

 通过实现迭代器协议对应的__iter__()和__next__()方法 ,可以自定义迭代器类型。对于可迭代对象,for语句可 以通过iter()方法获取迭代器,并且通过next 方法获得容器的下一个元素。
 生成器是一种特殊的迭代器, 内部支持了生成器协议,不需要明确定义__iter__()和 next()方法。
 生成器通过生成器函数产生,生成器函数可以通过常规的def语句来定义,但是不用return返回,而是用yield一次返回一个结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值