Python迭代器

1、迭代器一

      在 Python 中,如果你想要访问对象中的每个元素,可以像下面这样做,我在这以列表举例:

>>> my_list = ['r','o','c','k','y']
>>> for i in my_list:
...    print(i,end=' ')
... 
r o c k y >>>

      除了上述方法以外,还可以像下面这样:

>>> my_iter = iter(my_list)
>>> my_iter.__next__()
'r'
>>> my_iter.__next__()
'o'
>>> my_iter.__next__()
'c'
>>> my_iter.__next__()
'k'
>>> my_iter.__next__()
'y'
>>> my_iter.__next__()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
StopIteration

      或者:

>>> my_iter = iter(my_list)
>>> while True:
...    print(my_iter.__next__())
... 
r
o
c
k
y
Traceback (most recent call last):
 File "<stdin>", line 2, in <module>
StopIteration

      在 Python3 中,所有的迭代器对象都有 __next()__ 方法,迭代器,当然是可迭代的,在上面的例子中,__next()__ 就是要获得下一个对象。

      看了上面演示的例子可以发现,如果我们用 for 循环来写的话,当到了末尾的时候就自动结束了,但是用了 __next__() 的话,当完成最后一个的时候它不会自动结束,还会向下继续,但是后面已经没有元素了,所以就发出了一个 StopIteration 的信息,即停止迭代。

      在这我们还要再关注一下迭代器对象的另一个特点,看上上个的那个例子就可以知道,对象 my_iter 被迭代结束后,即每个元素都读取了一遍之后,指针就移到了最后一个元素后面,如果想要再访问的话,指针并没有自动移动到初始位置,所以会报 StopIteration,如果想要重新开始的话,就需要重新载入迭代对象。

      参考,初识迭代器

2、迭代器二

      现在有一个 “test.txt” 的文件,文件内容是:


My name is Rocky
I love Python
a,hhhhhhh

      现在用迭代器来尝试操作这个文件:

>>> f = open('test.txt')
>>> for line in f:
...    print(line,end=' ')
... 
My name is Rocky
I love Python
a,hhhhhhh >>>

      上面的过程当然用 __next__() 也能够读取:

>>> f = open('test.txt')
>>> f.__next__()
'My name is Rocky\n'
>>> f.__next__()
'I love Python\n'
>>> f.__next__()
'a,hhhhhhh'
>>> f.__next__()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
StopIteration

      如果用 __next__() 就可以直接读取每行的内容,这就说明文件是天生可迭代的对象,不需要用 iter() 转换。再者,我们用 for 来实现迭代,本质上就是自动调用 __next__() ,只不过这个工作被 for 偷偷的做了。

      参考,初识迭代器

3、迭代器三

      一种检查是否可迭代的方法:

>>> hasattr(list,'__iter__')
True

      可以用上面的这种方法检查已经学习过的其他默认类型的对象,比如字符串,列表,字典等是否是可迭代的。

      __iter__() 是一个特殊方法,它是迭代规则的基础,有了它,就说明对象是可迭代的。跟迭代有关的一个内建函数 iter(),这个函数我们在之前的文章中介绍过,它返回的是一个迭代器对象,比如像下面这样:

>>> list1 = [1,2,3,4]
>>> iter_list = iter(list1)
>>> iter_list
<list_iterator object at 0x00000000021CE438>

      从上述代码的结果可以看出,iter_list 引用的是迭代器对象。那么在这里有一个问题,iter_list 和 list1 有区别吗?我们来试一下:

>>> hasattr(list1,'__iter__')
True
>>> hasattr(iter_list,'__iter__')
True

      从上面看出它们都有 __iter__,说明它们都是可迭代的。

>>> hasattr(list1,"__next__")
False
>>> hasattr(iter_list,"__next__")
True

      我们把像 iter_list 所引用的对象那样,称之为「迭代器对象」。显而易见的是,迭代器对象必然是可迭代的,但可迭代的不一定是迭代器对象。且 Python 中迭代器对象实现的是 __next__() 方法。

      参考,迭代器延伸

4、总结

  • 在 Python 中,迭代器是遵循迭代协议的对象。我们可以使用 iter() 从任何序列得到迭代器(exp: list,turple,set and so on)。
  • 当自己编写迭代器的类的时候,其中实现 __iter__() 和 __next__() 方法,如果没有元素的话,会引发 StopIteration 异常。
  • 如果有很多值的话,列表会占用太多的内存,而迭代器则占用的更少,它从第一个元素开始访问,直到所有的元素被访问完结束,只能向前冲,不能后退
  • 迭代器并不适合在多线程的环境中对可变集合使用。

      参考,迭代器延伸​​​​​​​。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像的目标属于哪个类别。 定位问题:确定目标在图像的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值