python迭代器(Iterator)

本文深入讲解了Python中的迭代器概念,包括其定义、特点及其实现方式,并通过具体实例展示了如何使用迭代器以及如何自定义迭代器类。

背景:

在python中,有很多对象都可以通过for循环来对其中的每一个元素进行访问,比如list、dict、string等,这些对象被称为可迭代对象

什么是迭代器

迭代器(Iterator)是访问集合内元素的一种方式,提供了一种遍历序列对象的方法。用来迭代操作对象,可以像列表一样,迭代的获取其中的每一个元素,任何实现了__next__方法的对象,都可以称之为迭代器。

迭代器的特点

__iter__方法返回迭代器本身;

next()方法返回容器的下一个元素

当没有下一个元素时,会报出StopIteration异常

与列表的区别

构建迭代器的时候,不需要像列表一样,把所有的元素一次性加载到内存,而是通过使用延迟计算(lazy evaluation)的方式返回元素,这是迭代器的优点之一。

举例:如果一个列表包含一千万个整数,需要占用400M的内存,如果使用迭代器,只需要几十字节的内存。因为迭代器没有把所有元素加载到内存,而是调用迭代器的next方法时才返回该元素。

迭代器的例子

alist = [1,2,3,4]
it = iter(alist)

这里创建了一个列表,然后使用了iter()方法实现了迭代器。

打印看一下是不是迭代器类型:

print(it)
<list_iterator object at 0x00000219B162C8E0>

那么如何遍历迭代器里面的元素呢,下面是一些方法。

当我们使用next()方法时,会按顺序返回迭代器中的元素,比如第一次调用next方法,返回列表中的元素1,第二次调用next方法,会返回列表中第二个元素2。

print(next(it))
print(next(it))
1
2

那么如何遍历所有的元素呢,每一次都用next不太现实,这里就要用到循环,第一种方式while循环:

 while True:
     try:
         print(next((it)))
     except StopIteration:
         break
1
2
3
4

注意,这里用while(True)不断的取出迭代器中的元素,但是当超出范围时,会报出StopIteration异常,所以这里用Try-expect来捕获异常。

第二种方式:利用for循环

 for item in it:
     print(item)

直接利用for-in结构,取出迭代器中的每一个元素,然后输出,很明显比上面一种方法简洁很多。

如果需要在遍历的同时取出元素的索引值,只需要使用enumerate即可,和一般的列表之类的遍历相同:

for index,item in enumerate(it):
    print(index,item)

接下来让我们自己编写一个迭代器的类

class Fib:
    def __init__(self,n):
        self.prev = 0
        self.cur = 1
        self.n = n
        print(self.n)
    def __iter__(self):
        return self
    def __next__(self):
        if self.n>0:
            value = self.cur
            self.cur = self.cur + self.prev
            self.prev = value
            self.n-=1
            return value
        else:
            raise StopIteration()
f = Fib(10)
for item in f:
    print(item)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值