Python | 超详细的可迭代对象(原理and代码)

本文详细解释了Python中的迭代器和可迭代对象的概念,涉及容器、__iter__和__next__方法,以及它们在数据结构、深度学习中的应用,还介绍了如何判断对象是否可迭代及迭代器的优点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 迭代器前置概念

python 中的可迭代对象,迭代器其实很常见

有一些python官方实现的迭代器对象,如列表,元组、字典、字符串等,我们也可以定义并实现自己的迭代器~

在python中其实有一个很特殊的for in循环结构,他可以用for in这样的循环结构其实就是因为迭代的原因

在深度学习的训练中,也常常需要利用迭代器取出批量数据

对此,我们从容器开始了解

1.1 容器

**容器:**容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。

容器仅仅只是用来存放数据的,看如下代码

numbers=[1,2,3,4]
one=numbers[0]
print(one)

for i in numbers:
    print(i)

好像我们可以直接从列表这个容器中取出元素,但事实上容器并不提供这种能力,而是可迭代对象赋予了容器这种能力。

那么什么是可迭代对象呢?

1.2 可迭代对象

可迭代对象

​ 可迭代对象并不是指某种具体的数据类型,它是指存储了元素的一个容器对象,且容器中的元素可以通过__iter__( )方法或__getitem__( )方法访问。

__iter__方法的作用是返回迭代器让对象可以用for … in循环遍历,如上面的for i in numbers:

__getitem__方法是让对象可以通过“实例名[索引]”的方式访问实例中的元素,如上面的numbers[0]。

​ 可迭代对象可以是列表、元组、字典、字符串、文件对象等。通过迭代器,可以按顺序依次访问可迭代对象中的每个元素,从而实现遍历操作

​ 为了使对象具有可迭代性,需要在对象中实现 __iter__() 方法,该方法返回一个迭代器。

iter() 函数用于显示调用可迭代对象的__iter__函数,返回一个迭代器,迭代器有一个状态,记录当前迭代所在的位置

list=[1,2,3,4]   #定义一个可迭代对象列表
iterator=iter(list) #使用iter函数 显示调用可迭代对象的__iter_`函数
print(type(iterator))#查看类型

输出

<class ‘list_iterator’>

1.3 迭代器

迭代器

​ 迭代器内部还实现了__iter__和__next__方法(注意迭代器内部的__iter__函数和上面可迭代对象的__iter__函数不一样!!具体可以看下图)。当迭代器调用**__iter__返回迭代器自身,当调用next()**方法的时候,返回容器中的下一个值。

在这里插入图片描述

如图可迭代对象包含了__iter__函数,__iter__函数可以返回可迭代对象里的一个迭代器

迭代器内部又实现了自己的__iter__函数和__next__函数,迭代器自己的__iter__函数可以返回迭代器自己,__next__函数返回迭代器的下一个状态

list=[1,2,3,4]   #定义一个可迭代对象列表
iterator=iter(list)   #使用iter函数 显示调用可迭代对象的__iter__函数,返回迭代器iterator
iterator=iter(iterator) #使用iter函数 显示调用迭代器的__iter__函数,返回迭代器自己iterator
print(type(iterator)) @输出

#调用next函数
number_1=next(iterator) 
print(number_1)   #返回下一个值 输出1
number_2=next(iterator)
print(number_2)    #返回下一个值 输出2

再举一个例子 官方实现的数据结构列表

这里我们可以用iter()函数 和 next()函数显示调用__iter__函数和__next__

循环中(例2)看似没有使用,实际使用了这两个函数

显示调用 例1

my_list = [1, 2, 3, 4, 5]
my_iterator = iter(my_list) #返回一个迭代器
print(next(my_iterator))  # 输出 1
print(next(my_iterator))  # 输出 2
print(next(my_iterator))  # 输出 3

隐式调用 例2

Python中,迭代是通过for … in来完成的。凡是可迭代对象都可以直接用for… in…循环访问,这个语句其实做了两件事:第一件事是调用__iter__()获得一个可迭代器,第二件事是循环调用__next__()。

my_list = [1, 2, 3, 4, 5]
for item in my_list:
    print(item)

2 .其他补充

2.1 .常见的可迭代对象

包括:

a) 集合数据类型,如list、tuple、dict、set、str等;
b) 生成器(generator),包括生成器和带yield的生成器函数(generator function)

2.2 如何判断一个对象是可迭代对象呢?

可以通过collections模块的Iterable类型判断,具体判断方法如下:

from collections import Iterable
string="sss"
print(isinstance(string,Iterable)) #返回True,表明字符串也是可迭代对象

像上面一样调用iter函数输出

from collections import Iterable
string="sss"
print(iter(string))  #输出<str_iterator object at 0x7f7510708af0>

2.3.迭代器优点

节约内存(循环过程中,数据不用一次读入,在处理文件对象时特别有用,因为文件也是迭代器对象)

不依赖索引取值、实现惰性计算(需要时再取值计算);

参考

(65条消息) Pytorch(三):Dataset和Dataloader的理解_火柴的初心的博客-CSDN博客

第4章 基础知识进阶 第4.1节 Python基础概念之迭代、可迭代对象、迭代器-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值