迭代器

迭代是访问集合元素的一种方式


1.迭代器是⼀个可以记住遍历的位置的对象。迭代器对象从集合 的第⼀个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

  1. 如何判断⼀个对象是否可以迭代
    可以使⽤ isinstance() 判断⼀个对象是否是 Iterable 对象
from collections import Iterable
 # 使⽤isinstance() 函数检测某个对象是否是⼀个可迭代的对象
 # 列表是可迭代对象 
 result = isinstance([1,2], Iterable)
 print(result) 
  1. 可迭代对象的本质 可迭代对象的本质就是: ⼀个对象所属的类中含有 iter() ⽅法,该对象就是⼀个可迭代对象。
    在这里插入图片描述

2. iter()函数与next()函数

list、tuple等都是可迭代对象,我们可以通过iter()函数获取这些可迭代对象的迭代器。然后我们可以对 获取到的迭代器不断使⽤next()函数来获取下⼀条数据。iter()函数实际上就是调⽤了可迭代对象 的 iter ⽅法。

3. ⾃定义迭代器Iterator

⼀个类实现了 iter ⽅法和 next ⽅法的对象,就是⾃定义迭代器。

⾃定义迭代器类,必须满⾜如下:
1)实现 iter() ⽅法
2)实现 next() ⽅法
当调⽤iter(迭代器对象)时,会调⽤对象的 iter() ⽅法 当调⽤next(迭代器对象)时,会调⽤对象的 next() ⽅法 迭代器⾃身正是⼀个迭代器,所以迭代器的 iter()⽅法返回⾃身即可。

  1 from collections.abc import Iterable
  2 from collections.abc import Iterator
  3 import time
  4 
  5 class Classmate(object):
  6     def __init__(self):
  7         self.names=list()
  8         self.current_num=0
  9 
 10     def add(self,name):
 11         self.names.append(name)
 12 
 13     def __iter__(self):
 14         """如果要使一个对象可以迭代,即可以使用for,必须实现__iter__方法"""
 15         return self
 16 
 17 
 18     def __next__(self):
 19         if self.current_num<len(self.names):
 20            result=self.names[self.current_num]
 21            self.current_num+=1
 22            return result
 23         else:
 24            raise StopIteration
 25 mate=Classmate()
 26 mate.add("王五")
 27 mate.add("张三")
 28 mate.add("李四")
 29 
 30 #class_iterator=iter(mate)
 31 #print("是否是可以迭代的ui对象:",isinstance(mate,Iterable))
 32 #print("是否是迭代器:",isinstance(class_iterator,Iterator))
 33 #print(next(class_iterator))
 34 for name in mate:
 35    print(name)
 36    time.sleep(1)



1.判断xxx.obj是否是可迭代的(看是否有iter方法)
2.在前一步实现的前提下,调用iter(xxx)函数得到xxx.obj的iter()方法的返回值
3.__iter__方法的返回值是一个迭代器

4. for…in…循环的本质

for item in Iterable 循环的本质就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的 迭代器不断调⽤next()⽅法来获取下⼀个值并将其赋值给item,当遇到StopIteration的异常后循环结束。

5.迭代器-斐波那契数列

  1. 迭代器应⽤
    我们发现迭代器最核⼼的功能就是可以通过next()函数的调⽤来返回下⼀个数据值。如果每次返回的数 据值不是在⼀个已有的数据集合中读取的,⽽是通过程序按照⼀定的规律计算⽣成的,那么也就意味 着可以不⽤再依赖⼀个已有的数据集合,也就是说不⽤再将所有要迭代的数据都⼀次性缓存下来供后 续依次读取,这样可以节省⼤量的存储(内存)空间。
  1 class Fabonacci(object):
  2    def __init__(self,all_num):
  3        self.a=0
  4        self.b=1
  5        self.all_num=all_num
  6        self.current_num=0
  7 
  8 
  9    def __iter__(self):
 10        return self
 11 
 12    def __next__(self):
 13        if self.current_num<self.all_num:
 14            ret=self.a
 15            self.a,self.b=self.b,self.a+self.b
 16            self.current_num+=1
 17            return ret
 18        else:
 19            raise StopIteration
 20 
 21 fabonacci=Fabonacci(10)
 22 
 23 for fabo in fabonacci:
 24     print(fabo)
运行结果 
0
1
1
2
3
5
8
13
21
34

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值