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

文章目录

  • 1 迭代器前置概念
    • 1.1 容器
    • 1.2 可迭代对象
    • 1.3 迭代器
  • 2 .其他补充
    • 2.1 .常见的可迭代对象
    • 2.2 如何判断一个对象是可迭代对象呢?
    • 2.3.迭代器优点

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))#查看类型

输出

1.3 迭代器

迭代器

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

Python | 超详细的可迭代对象(原理and代码)_第1张图片

如图可迭代对象包含了__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))  #输出

2.3.迭代器优点

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

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

参考

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

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

你可能感兴趣的:(python,开发语言)