【进阶系列】python的迭代器是什么?生成器又是什么?一篇教会你☝️

迭代器

迭代是python访问集合中元素的一种方式,迭代器是一个可以记住遍历的位置的对象。

举例:

使用map()函数,将一个函数作用于一个序列中的所有元素,并返回一个迭代器——对迭代器可以再次转换成list tuple set等等等

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不能后退。

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

s = "HQYJ"
print(type(s))

# iter() 方法 把序列转换成 迭代器
iter1 = iter(s)
print(type(iter1))

# next() 方法 获取迭代器的下一个元素 【只能往前不能后退】
try:
    while True:
        print(next(iter1))
except StopIteration:
    print("迭代已结束")
list1 = [1, 2, 3, 4, 5]

it1 = iter(list1)

print(next(it1))
print(next(it1))


for i in it1:
    print(i)

StopIteration

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

创建一个迭代器

把一个类作为一个迭代器使用需要在类中实现两个方法 iter() 与 next() 。

  • iter() 方法返回一个特殊的迭代器对象,这个迭代器对象实现了 next() 方法并通过 StopIteration 异常标识迭代的完成。
  • next() 方法会返回下一个迭代器对象。
# 创建一个返回数字的迭代器,起始值为10,逐步递增10
# 也就是说起始值是10,步长值为10
class MyNum:
    def __iter__(self):
        self.a = 10
        return self

    def __next__(self):
        x = self.a
        self.a += 10
        return x

# 实例化对象
my_class = MyNum()
my_iter = iter(my_class)

print(next(my_iter))
print(next(my_iter))
print(next(my_iter))
print(next(my_iter))
print(next(my_iter))

限制迭代到100可以这样: 

# 创建一个返回数字的迭代器,起始值为10,逐步递增10
# 也就是说起始值是10,步长值为10
class MyNum:
    def __iter__(self):
        self.a = 10
        return self

    def __next__(self):
        if self.a <= 100:
            x = self.a
            self.a += 10
            return x
        else:
            raise StopIteration("迭代已完成")

# 实例化对象
my_class = MyNum()
my_iter = iter(my_class)

try:
    while True:
        print(next(my_iter))
except Exception as e:
    print(e)

生成器

在python中,使用了 yield 的函数就被称为——生成器。

yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。

与普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单的理解【生成器就是一个迭代器】。

每次使用yield语句生产一个值之后,函数都将暂停执行【内存释放出来】,等待再次唤醒。

yield语句和return语句的差别就在于yield语句返回的是可迭代对象,而return返回的是不可迭代对象。

每次调用生成器的next()方法或者使用for或while循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇见yield语句。

def creat1(n):
    while n>0:
        yield n
        n -= 1

create_iter = creat1(5)

print(next(create_iter))

for i in create_iter:
    print(i)

未完待续(持续更新中🏆)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值