Python学习基础笔记二十一——迭代器
创始人
2024-03-17 06:52:20
0

列表,我们使用for循环来取值,我们把每个值都取到,不需要关心每一个值的位置,因为只能顺序的取值,并不能跳过任何一个去取其他位置的值。那么我们为什么可以使用for循环来取值,for循环内部是怎么工作的呢?

迭代器:

示例1:

for i in [1, 2, 3, 4]:print(i)

如果我们换成:

for i in 1234:print(i)

iterable: 可重复的,可迭代的。

 

什么叫可迭代的?

字符串、列表、元组、字典、集合都可以被for循环,说明它们是可迭代的。

from collections.abc import Iterablel = [1, 2, 3, 4]
t = (1, 2, 3, 4)
d = {1: 2, 3: 4}
s = {1, 2, 3, 4}# 判断对象是否是可迭代对象
print(isinstance(l, Iterable))
print(isinstance(t, Iterable))
print(isinstance(d, Iterable))
print(isinstance(s, Iterable))

判断对象是否是可迭代对象。

可以将某个数据集内的数据“一个挨着一个地取出来”, 就叫做迭代。

可迭代协议:

假如我们自己写一个数据类型,我们希望这个数据类型里面的东西可以使用for被一个一个地取出来,那么我们就必须满足for的要求,这个要求就叫做“协议”。

可以被迭代要满足的要求就叫做可迭代协议。可迭代协议非常简单,就是内部实现了__iter__方法。要想可迭代,内部必须有一个__iter__方法:

print(dir([1, 2]))
print(dir((1, 2)))
print(dir({1: 2}))
print(dir({1, 2}))

那么, __iter__做了什么事情呢?得到了一个list_iterator。

iterator:迭代器

迭代器协议:

在列表迭代器中多了三个方法:

iter_l = [1,2,3,4,5,6].__iter__()
#获取迭代器中元素的长度
print(iter_l.__length_hint__())
#根据索引值指定从哪里开始迭代
print('*',iter_l.__setstate__(4))
#一个一个的取值
print('**',iter_l.__next__())
print('***',iter_l.__next__())

在for循环中,就是在内部调用了__next__方法才能取到一个一个的值。

迭代器遵循迭代器协议:必须拥有__iter__方法和__next__方法。

那为什么要有for循环?

for循环就是基于迭代器协议提供了一个统一的可以遍历所有对象的方法,即在遍历之前,先调用对象的__iter__方法将其转换成一个迭代器,然后使用迭代器协议去实现循环访问,这样所有的对象就都可以通过for循环来遍历了。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...