Python学习基础笔记二十一——迭代器

news/2024/11/29 17:37:21/

列表,我们使用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循环来遍历了。


http://www.ppmy.cn/news/1564.html

相关文章

NNDL实验 优化算法3D轨迹 pytorch版

3D轨迹有助于直观理解,掌握这样一个工具还是有必要的。 换模型、调参数,可以更加深入的了解算法。 程序改编自《神经网络与深度学习:案例与实践》(Paddle版) 7.3 不同优化算法的比较分析 神经网络与深度学习 (nndl.…

MFC列表控件的用法(基于对话框的编程)

目录 一、List Control列表控件属性 1.List Control 2.View属性 二、OnInitDialog初始化列表 1.创建List Control的变量 2.找OnInitDialog ​3. InsertColumn插入表头 4. InsertColumn设置对齐方式和列宽 5. 设置List的正文内容 ​6.循环结构创建列表 7.设置列表整行…

【torch.utils.data.sampler】采样器的解析和使用

文章目录torch.utils.data.sampler内置的Sampler基类 Sampler顺序采样 SequentialSampler随机采样 RandomSampler子集随机采样 SubsetRandomSampler加权随机采样 WeightedRandomSampler批采样 BatchSamplertorch.utils.data.sampler 内置的Sampler 基类 Sampler sampler 采样…

Java实现猜数游戏

1 问题 编写一个Java程序,实现以下功能: 2 方法 首先导入java.util包下的Random,让程序随便分配给用户一个数。 再导入java.util包下的Scanner类,构建Scanner对象,以便输入。 利用Random().nextInt()生成一个随机的i…

亚马逊云科技re:Invent:Serverless是所有构想的核心

12月2日,2022亚马逊云科技re:Invent全球大会上,Amazon.com副总裁兼首席技术官Werner Vogels博士向开发者们展示了另一种可能。在一系列Serverless工具的帮助下,一些代码可以少写,因为未来你可能再也不需要写它们了。这恐怕是自云原…

Spring中Bean的生命周期

先直接说出过程,再来演示具体的操作 过程 简化来说就是 1、首先是实例化Bean,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚末初始化的依赖时,容器就会调用doCreateBean()方法进行实例化&#xf…

PostgreSQL基本运维

基础 一个系统上可以同时运行多个postgres进程, 只要他们使用不同的数据区和不同的端口号。 postgres 启动时需要知道数据区的位置,该位置必须通过-D选项或PGDATA 环境变量指定;没有缺省值。通常,-D或PGDATA 都直接指向由initdb创…

html相关知识点 笔记

什么是DOCTYPE,有什么作用 doctype是HTML5中的文档声明部分,它告诉浏览器使用什么版本的HTML标准解析文档。如果不告诉浏览器文档解析标准,一般情况下浏览器会开启最大兼容模式来解析网页,这被称为怪异模式,会降低解析…