Python中的迭代器(Iterator)与生成器(Generator)

Python中的迭代器是Python最常用的功能之一,是在Python中访问集合元素的一种方式。

迭代器(Iterator)是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束。

迭代器只能往前而不可以后退。

迭代器中有两个基本的方法:iter()和next()。

在Python中,字符串、列表或元组对象都可以用于创建迭代器:

迭代器对象也可以使用常规的for语句进行遍历:

也可以在循环中使用next()遍历迭代器对象:

创建一个类迭代器:

如果要把一个类作为一个迭代器使用,需要在类中实现两个方法__iter__()与__next__()。

__iter__():返回一个特殊的迭代器对象,这个迭代器对象实现了__next__()方法并通过StopIteration异常来标识迭代的完成。

__next__():返回下一个迭代器对象。

创建一个返回数字的类迭代器,初始值为1,逐步递增1.


class Number():
    def __iter__(self):
        self.a=1
        return self
    
    def __next__(self):
        x=self.a
        self.a+=1
        return x
    

number=Number()
it=iter(number)

print(type(it))

for _ in range(7):
    print(next(it))

 

StopIteration:

StopIteration异常用于标识迭代的完成,防止出现无限循环的情况,在__next__()中可以设置在完成指定循环次数后触发StopIteration异常来结束迭代。


class Number():
    def __iter__(self):
        self.a=1
        return self
    
    def __next__(self):
        if self.a<=20:
            x=self.a
            self.a+=1
            return x
        else:
            raise StopIteration
    

number=Number()
it=iter(number)

print(type(it))


while True:
    try:
        print(next(it))
    except StopIteration as e:
        print(e)
        print('End')
        break

 

 

生成器:

在Python中,使用yield的函数被称为生成器(Generator)。

与普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作。

在调用生成器函数运行的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值,并在下一次执行next()方法时从当前位置继续运行。

调用一个生成器函数,返回的是一个迭代器对象。


def Yield_test():
    print('Starting.......')
    
    while True:
        ret=yield 'Test'
        print(f'Return : {ret}')
        
        
g=Yield_test()

print(next(g))
print('='*20)
print(next(g))

print(type(g))

# send()函数可以发送一个参数给生成器
print(g.send(17))

 

使用yield实现斐波那契数列:


def fibonacci(n):
    a,b,counter=0,1,0
    while True:
        if counter<=n:
            yield a
            a=b
            b=a+b
            counter+=1
        else:
            return None
        
        
fb=fibonacci(7)

while True:
    try:
        print(next(fb))
    except StopIteration as e:
        print(e)
        break

 

 

Reference:Python3 迭代器与生成器 | 菜鸟教程

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Think@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值