python 中的可迭代对象,迭代器其实很常见
有一些python官方实现的迭代器对象,如列表,元组、字典、字符串等,我们也可以定义并实现自己的迭代器~
在python中其实有一个很特殊的for in循环结构,他可以用for in这样的循环结构其实就是因为迭代的原因
在深度学习的训练中,也常常需要利用迭代器取出批量数据
对此,我们从容器开始了解
**容器:**容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。
容器仅仅只是用来存放数据的,看如下代码
numbers=[1,2,3,4]
one=numbers[0]
print(one)
for i in numbers:
print(i)
好像我们可以直接从列表这个容器中取出元素,但事实上容器并不提供这种能力,而是可迭代对象赋予了容器这种能力。
那么什么是可迭代对象呢?
可迭代对象
可迭代对象并不是指某种具体的数据类型,它是指存储了元素的一个容器对象,且容器中的元素可以通过__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))#查看类型
输出
迭代器
迭代器内部还实现了__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)
包括:
a) 集合数据类型,如list、tuple、dict、set、str等;
b) 生成器(generator),包括生成器和带yield的生成器函数(generator function)
可以通过collections模块的Iterable类型判断,具体判断方法如下:
from collections import Iterable
string="sss"
print(isinstance(string,Iterable)) #返回True,表明字符串也是可迭代对象
像上面一样调用iter函数输出
from collections import Iterable
string="sss"
print(iter(string)) #输出
节约内存(循环过程中,数据不用一次读入,在处理文件对象时特别有用,因为文件也是迭代器对象)
不依赖索引取值、实现惰性计算(需要时再取值计算);
参考
(65条消息) Pytorch(三):Dataset和Dataloader的理解_火柴的初心的博客-CSDN博客
第4章 基础知识进阶 第4.1节 Python基础概念之迭代、可迭代对象、迭代器-CSDN博客