详细了解下可迭代对象与迭代器

news/2024/12/4 20:01:32/

文章目录

  • 前言
  • 一、可迭代对象(Iterable)
    • 1. 定义
    • 2. 常见的类型
    • 3. 可迭代对象的特性
  • 二、迭代器(Iterator)
    • 1. 定义
    • 3. 迭代器的特性
  • 三、检查常用的数据类型,是否可迭代对象与迭代器
    • 1. 字符串类型(str)
    • 2. 列表
    • 2. 可迭代对象转换为迭代器:内置函数iter()或__iter__()
  • 总结


前言

python中有很多常用的数据类型,包括liststrtuple,那么这些数据有什么样的特性,比如数据是否可以被遍历等。下面就用一些通俗易懂的例子,介绍下可迭代对象与迭代器。


一、可迭代对象(Iterable)

1. 定义

能够使用for循环进行遍历的都是可迭代对象

2. 常见的类型

所有序列类型 :如 liststrtuplerange
非序列类型: dictset文件对象:f = open(xx,)

3. 可迭代对象的特性

实现了 __iter__() 方法的任意对象(可迭代协议)。
实现了序列语义的 __getitem__()方法的任意对象。

注解:对象定义了一个 __iter__方法,那么这个对象就实现了迭代协议

二、迭代器(Iterator)

1. 定义

迭代器由一个 __iter__ 方法和__next__方法共同构成。实现了这两个方法的对象就实现了迭代器协议。

3. 迭代器的特性

实现了迭代协议的对象。
实现了__next__方法,__next__方法在迭代完所有数据之后,会抛出StopIteration的错误信息。

三、检查常用的数据类型,是否可迭代对象与迭代器

1. 字符串类型(str)

from collections.abc import Iterable, Iteratorst1 = '111m22m33'
# 判断是否是可迭代对象
print(isinstance(st1, Iterable))
# 判断是否是迭代器
print(isinstance(st1, Iterator))
运行结果:
True
False

2. 列表

from collections.abc import Iterable, Iteratorli = [11, 22, 33]
# 判断是否是可迭代对象
print(isinstance(li, Iterable))
# 判断是否是迭代器
print(isinstance(li, Iterator))
运行结果:
True
False

2. 可迭代对象转换为迭代器:内置函数iter()或__iter__()

from collections.abc import Iterable, Iteratorst2 = 'jack'
# 转化成迭代器
# 方法一:
s = iter(st2)
# # 方法二:
# s = st2.__iter__()print(s)# 判断是否是可迭代对象
print(isinstance(s, Iterable))
# 判断是否是迭代器
print(isinstance(s, Iterator))# 迭代器可以使用next进行迭代操作
print(next(s))  # st1.__next__()
print(next(s))
print(next(s))
print(next(s))
# print(next(s))  # StopIteration
运行结果:
<str_iterator object at 0x000001A692A87430>
True
True
j
a
c
k

总结

迭代器和可迭代对象的操作

  1. 实现了迭代器协议的对象,就是一个迭代器。
  2. 所有的可迭代对象 都可以通过内置函数iter()转换为迭代器。
  3. 迭代器对象能够使用 内置函数next 进行迭代操作
  4. 所有的迭代器都是可迭代对象,因为迭代器协议包含了迭代协议

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

相关文章

SpringBoot基础学习之(十二):通过spring boot框架连接MySql数据库(通过idea中的工具Database连接Mysql数据库)

Springboot这个系列实现的案例&#xff1a;员工后台管理系统 之前讲解的内容是前后端的交互&#xff0c;并没有涉及到数据库。把员工信息放置在一个数组中&#xff0c;实现的方法则是对数组的增删改查操作&#xff0c;但是从今天开始&#xff0c;实现的功能则是在数据库的基础上…

Solidity中的pure和view修饰符的区别是什么?什么时候添加pure和view修饰符?

Solidity是一种用于编写智能合约的编程语言&#xff0c;它被广泛应用于以太坊区块链上的智能合约开发。在Solidity中&#xff0c;有两种函数修饰符&#xff0c;即“pure”和“view”&#xff0c;它们被用来指示函数的行为。这篇文章将深入探讨“pure”和“view”的含义&#xf…

Vue——计算属性

目录 一、基础示例​ 二、计算属性缓存 vs 方法​ 三、可写计算属性​ 四、最佳实践​ Getter 不应有副作用​ 避免直接修改计算属性值​ 一、基础示例​ 模板中的表达式虽然方便&#xff0c;但也只能用来做简单的操作。如果在模板中写太多逻辑&#xff0c;会让模板变得臃…

SpringBoot + MyBatisPlus实现Yaml配置参数AES算法加密

文章目录SpringBoot MyBatisPlus实现Yaml配置参数AES算法加密1概述2 密钥加密3 Yaml参数配置4 使用方式SpringBoot MyBatisPlus实现Yaml配置参数AES算法加密 1概述 该功能为了保护数据库配置及数据安全&#xff0c;在一定的程度上控制开发人员流动导致敏感信息泄露。Mybati…

网络安全从业人员应该如何提升自身的web渗透能力?

前言 web 渗透这个东西学起来如果没有头绪和路线的话&#xff0c;是非常烧脑的。 理清 web 渗透学习思路&#xff0c;把自己的学习方案和需要学习的点全部整理&#xff0c;你会发现突然渗透思路就有点眉目了。 程序员之间流行一个词&#xff0c;叫 35 岁危机&#xff0c;&am…

归并排序(非递归实现) 计数排序

上一期我们说了归并排序的递归是如何实现的&#xff0c;但是递归如果层次太多的话容易栈溢出&#xff0c;所以我们还需要掌握非递归的实现&#xff0c;但是我们非递归需要如何实现&#xff1f; 下面我们就来看一下非递归的实现 归并排序的非递归实现他并不需要栈队列这些东西…

有趣的小知识(四)从基站到天线:深入了解如何优化网站速度的关键技术

一、全面认识基站 1.1 基站的定义 基站是一种通信设施&#xff0c;用于提供无线通信服务。它通常由一座塔、天线、收发信设备、电源和辅助设备等组成&#xff0c;可以与移动设备&#xff08;如手机、平板电脑等&#xff09;进行无线通信。基站是是无线终端(如手机)接入互联网…

IDEA虚拟机参数配置【自我总结】

idea内存溢出问题 最近自己在跑一个大一点的微服务项目时候,发生了这样的一个现象,就是启动idea的时候,首先发现电脑的CPU小风扇急速的飞转,电脑的运行内存也快要飙升到100%了,而且最重要的是光是加载项目就加载了几分钟啊(我当时就炸锅锅)像下图一样,一直加载一直加载 想了想,…