2、可迭代对象与迭代器

2023-05-16

 1、Iterable, 可迭代对象
    概念:python中能够使用for循环遍历的都是可迭代对象
    1、常见的可迭代对象:
        1.1、序列如:list、str、tuple、range
        1.2、非序列:dict、set、文件对象:f = open(xx)
            1.2.1文件对象说明:
                每次open一个文件时,这个文件就是一个可迭代对象,因为可以通过for循坏遍历获取文件的每一行
                f = open('xxx文件','r',encoding = 'utf-8')
                # 判断是否为可迭代对象,输出为True则为可迭代对象
                print(isinstance(f, Iterable))
        
        1.3、对象拥有__iter__()方法的任意对象(可迭代协议)
            class MyClass1:
                # 实现迭代协议
                def __iter__(self):
                    return iter([11,22,33])
            迭代协议(__iter__):
                对象定义了一个__iter__方法的,那么这个对象就实现了迭代协议,__iter__方法的返回值必须是一个迭代器

# 1.3
# 当我们去遍历一个不是可迭代对象的类时,会报错提示"TypeError: 'Demo1' object is not iterable"
# class Demo1:
#     pass
#
#
# d = Demo1()
# for i in d:
#     print(i)


# 当我们在类中实现了__iter__()方法时,这个类就变成可迭代对象
class Demo2:
    # 对象迭代时调用的方式
    def __iter__(self):
        return iter([11, 22, 33, 44])


d = Demo2()
for i in d:
    print(i)


        1.4、实现了序列语义的__getitem__()方法的任意对象。
            class MyClass2:
                value = [11,22,33]
                # 实现迭代协议
                def __getitem__(self,item):
                    return self.value[item]
        注:实现了__iter__()方法或者__getitem__()方法都是可迭代对象,for循环会先去找是否有__iter__()方法,没有是才去找__getitem__()方法

# 1.4
li = ["aa", "bb", "cc"]
print(li[0])  # 实际执行为li.__getitem__(0),可以通过列表的源码看到
list()


class MyClass2:
    value = [11, 22, 33]

    # 实现迭代协议
    def __getitem__(self, item):
        return self.value[item]


d = MyClass2()
for i in d:
    print(i)

2、Iterator, 迭代器
    概念:实现了迭代器协议的对象 被称之为迭代器
    1、迭代器协议:
        迭代器协议由 `__iter__` 方法和`__next__`方法共同构成。实现了这两个方法的对象就实现了迭代器协议。
        (迭代器的__iter__方法是从可迭代对象中继承来的)
    2、实现了迭代器协议的对象,就是一个迭代器
    3、所有的可迭代对象,都可以通过内置函数iter(转化为迭代器):
        li = [11, 22, 33]
        # 可迭代对象转换为迭代器:内置函数iter()
        # 本质上是调用了可迭代对象的__iter__方法
        # 传进去的是一个可迭代对象li,返回一个迭代器list_iterator
        s = iter(li)# ===> iter(li) ===> li.__iter__() 
    4、迭代器对象能够使用内置函数next进行迭代操作(与可迭代对象的区别,有next()这个内置函数)
        (每次迭代一个数据),当数据迭代完之后,会自动关闭迭代器
       当迭代器关闭之后再使用next进行迭代,则抛出异常 StopIteration
       注意点:迭代器中的数据  只能迭代一次(迭代完之后,迭代器就关闭了)
       例如:
        li = [11, 22, 33]
        res = iter(li)
        res1 = next(res)
        print('res1:', res1)
        
        res2 = next(res)
        print('res2:', res2)
        
        res3 = next(res)
        print('res3:', res3)
        
        res4 = next(res)
        print('res4:', res4) # 抛出异常StopIteration
       
       #注意点:
        print('---以下的x不会被输出,因为迭代中的数据只能迭代一次------')
        for x in res:
            print(x)
 

# 2
li = [11, 22, 33]
# 可迭代对象转换为迭代器:内置函数iter()
res = iter(li)  # ===> iter(li) ===> li.__iter__()
print(res)  # 输出一个<list_iterator>,传进去的是一个可迭代对象,返回一个迭代器

# 迭代器可以使用next进行迭代操作
res1 = next(res)
print('res1:', res1)

res2 = next(res)
print('res2:', res2)

res3 = next(res)
print('res3:', res3)

# res4 = next(res)
# print('res4:', res4)

print('---以下的x不会被输出,因为迭代中的数据只能迭代一次------')
for x in res:
    print(x)

3、Generator,生成器
    应用层面的,学习之前需要先了解可迭代对象和迭代器。后续进行技术输出
    处理大数据量时,使用生成器几乎不占内存。
    因为生成器本身不存储数据,只存储数据迭代的规则
   

4、可迭代对象、迭代器、生成器的关系


# 关系:
from collections.abc import Iterable, Iterator, Generator
# 继承关系(生成器是儿子,迭代器是爸爸,可迭代对象是爷爷)
class Iterable(object):
    pass
class Iterator(Iterable)
    pass
class Generator(Iterator)
    pass
    

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2、可迭代对象与迭代器 的相关文章

  • 写算法的方法

    写算法步骤 xff1a xff08 以下方法 xff0c 都是老生常谈 但是非常简单有用 xff09 数据结构 xff08 所有的算法都是基于数据结构的操作 所有算法都是针对数据结构的属性进行操作 列出所有的属性 xff0c 写算法逐项修改
  • Windows系统下QT+OpenCasCAD仿真开发

    背景 最近开发了一个六自由度机械臂调姿平台的控制软件 xff0c 集成了API激光跟踪仪和KUKA机器人 xff0c 实现了根据产品的测量位姿驱动仿真环境中模型并且实现模型间的碰撞检测 其中KUKA机器人的控制可以参考笔者以前的博客 xff
  • 飞控IMU姿态估计流程

    飞控中使用加速度计 xff0c 陀螺仪 xff0c 磁罗盘进行姿态估计算法流程 step1 xff1a 获取陀螺仪 xff0c 加速度计 xff0c 磁罗盘的原始数值 step2 xff1a 陀螺仪 xff0c 加速度计减去固定的偏移后得到
  • 图拓扑关系可视化的qt实现

    前言 最近在做数据可视化的相关工作 xff0c 包括曲线图 xff0c 航迹图 xff0c 图结构 xff0c 树结构等 其中树结构相关的工作笔者以前曾经做过 xff0c 可以参考笔者以前的博客 qt自定义树形控件之一和qt自定义树形控件之
  • 基于qwt3D 的3D航迹图的实现

    前言 使用qt实现三维空间直角坐标系中的航迹实时绘制网上很难查到资料 在qt下实现3D绘图通常实现方式有OpenGL VTK qwt3d QtDataVisualization等 Qcharts QCustomPlot只支持2D绘图 这里给
  • 树莓派4b连接RealSense T265

    使用的是树莓派4 8G版本 准备连接RealSense T265的双目相机 T265目前官方编译好的的只有Ubuntu16和18 其他的系统版本需要自己编译realsense驱动 安装ubuntu20 10 https ubuntu com
  • Dockerfile文件解释

    一 先来看一个简单的 Dockerfile 这个Dockerfile作用是打一个python3项目环境 FROM python 3 alpine WORKDIR app ADD app RUN pip3 install r requirem
  • 一文读懂BLOB算法

    算法执行效果 相关参考资料 看着玩的 BLOB算法简述 https blog csdn net icyrat article details 6594574 话说这老哥写的也太 简 了吧 完全口水话 把blob算法说的很神秘 说什么把blo
  • Sobel算法优化 AVX2与GPU

    国庆假期 一口气肝了10篇博客 基本上把最近的成果都做了遍总结 假期最后一天 以一个比较轻松的博客主题结束吧 这次是Sobel算法的AVX2优化 执行效果 sobel算法的原理 使用如下的卷积核 c 硬写 span class token
  • 随机Hough直线算法的改进

    背景介绍 随机Hough直线算法相比Hough直线算法 xff0c 算法效率会有提高 xff0c 但仍不能满足工程需求 因此提出使用生长的随机Hough直线算法 该算法对随机Hough直线算法进行改造 xff0c 在随机选点转到Hough空
  • MATLAB编写的读取.mat文件数据并画曲线图的gui程序

    matlab编写的读取sd卡数据的gui程序 界面截图 xff1a 打开文件界面 xff1a 导入数据后截图 xff1a 是不是高端大气上档次 xff0c 不要急 xff0c 慢慢往下看 xff0c 后面更精彩 xff0c 代码会贴出来的
  • px4飞控位置估计lpe移植到vs

    本文主要内容 px4飞控的位置估计有两种方式 xff0c 一是inav xff0c 二是lpe xff0c 用到的传感器用加速度计 xff0c 磁场传感器 xff0c gps xff0c 超声 xff0c 激光 xff0c 气压 xff0c
  • 常见的信号平滑处理方法

    本文介绍了常见的信号平滑处理方法 xff1a xff08 一阶滤波 xff0c 互补滤波 xff0c 卡尔曼滤波 xff09
  • PX4代码学习系列博客(1)——开发环境配置

    写在前面 虽然有很多关于px4博客 xff0c 但还是想自己亲手写 xff0c 一来记录自己的学习过程 xff0c 以备将来复习 xff0c 二来方便后来者参考学习 xff0c 好多西当然要大家分享 关于px4飞控程序的博客 xff0c 我
  • PX4代码学习系列博客(3)——px4固件目录结构和代码风格

    写在前面 px4不是普通的单片机程序 xff0c 其中没有main函数 它实际上是一个操作系统 xff0c 上面运行着很多应用程序 xff08 类比windows xff09 xff0c 比如姿态解算 xff0c 位置解算 xff0c 姿态
  • PX4代码学习系列博客(5)——在px4中添加自己的模块

    怎么在px4中添加自己的模块 在 px4固件目录结构和代码风格 这一节 xff0c 曾经说过NuttX是一个实时的嵌入式系统 xff0c 上面可以像windows那样运行程序 那既然是应用程序 xff0c 那我们应该也能写一些可以在Nutt
  • PX4代码学习系列博客(6)——offboard模式位置控制代码分析

    分析offboard模式的代码需要用到以下几个模块 local position estimator mavlink mc pos control mc att control mixer 程序数据走向 mavlink 一般的offboar
  • selenium安装

    一 安装webdriver 1 下载安装包 下载地址 xff1a CNPM Binaries Mirror 注意 xff1a 下载版本应与自己的chrome的大版本一致 chrome版本查看 xff0c 设置 gt 关于chrome xff
  • 基于惯性轮倒立摆原理的自行车

    背景 自平衡车有很多种 xff0c 其中一种是利用惯性轮倒立摆原理 xff0c 早在2003年 xff0c 日本的村田顽童就已经问世 xff0c 它采用的就是惯性轮倒立摆原理 后来其他研究组织和个人纷纷效仿 xff0c 制作出了五花八门的基
  • 二维码的特征定位和信息识别

    二维码的特征定位和信息识别 背景介绍 视觉的方法可以用来估计位置和姿态 最容易想到的是在目标上布置多个容易识别的特征 xff0c 这样使用opencv相机标定和 相机畸变矫正 轮廓提取 solvepnp来获取目标相对于相机的位姿 在实际使用

随机推荐

  • 学生作业信息管理系统

    一 xff0e 引言 1 1编写目的 首先 xff0c 软件系统的设计报告可以出用户提出的模糊需求分析出具体的工程需求 xff0c 并转化为数据流图 xff0c 程序流程图 xff0c 模块图 xff0c 数据库设计等软件设计必要的底层步骤
  • NVIDIA显卡驱动版本,CUDA版本,cudnn版本之间关系及如何选择

    要配置NVIDIA显卡的CUDA和cudnn xff0c 各种版本之间的依赖关系以及与其他使用GPU的库版本兼容一直没有弄明白 xff0c 最近经过多次卸载重装 xff0c 终于成功配置好了显卡计算环境 xff0c 于是把各个驱动程序和库之
  • 机器人定位误差标定模型

    概述 以工业机器人为基础 xff0c 构建柔性制造单元或柔性生产线 xff0c 实现产品自动化 柔性化 智能化生产必将成为现代制造发展的重点 新型产业环境下 xff0c 工业机器人的应用范围将越来越广泛 作业任务也将越来越精细复杂 xff0
  • 觉得C/C++难懂的、面临找工作面试笔试的,速来看这本书!

    如果你是C C 43 43 的初学者 xff0c 请看这本书 xff0c 因为其他的书也许你看了还不如不看 xff0c 一定要选一本好书 xff1b 如果你正准备求职 xff0c 那么请认真看这本书 xff0c 因为这本书会教会你工作中必备
  • rosdep update错误失败一直timeout解决方法

    更新rosdep 终端输入 rosdep update 失败1 The read operation timed out xff08 包括ERROR unable to process source xff0c ERROR error lo
  • bat, shell脚本ssh自动输入密码

    我电脑是win11 xff0c 并且自带ubuntu系统 xff0c 打开cmd xff0c 然后输入ubuntu xff0c 可以直接进入ubuntu系统 xff0c 然后执行简单的linux命令 我在两个系统下都写了自动连接远程服务的脚
  • FreeRtos 文件结构

    最核心的三个文件 1 xff09 tasks c 2 xff09 list c 3 xff09 queue c tasks c 任务相关 list c 为一个双向链表 queue c 队列 xff0c 信号量用于任务间通讯 4 xff09
  • 论文超详细精读:SMPL: A Skinned Multi-Person Linear Model

    文章目录 前言总览一 Introduction二 Related WorkBlend Skinning xff08 混合蒙皮 xff09 Blend shapes xff08 混合变形 xff09 Learning pose and sha
  • 1、列表推导式、字典推导式

    34 34 34 1 列表推导式 xff1a 作用 快速生成列表 需求1 xff1a 如何快速生成一个 34 data0 34 34 data1 34 34 data99 34 的列表 语法 xff1a y for x in xxx 实现
  • pwm超详细解读,大佬细说pwm的控制方式

    pwm xff0c 也就是常说的脉冲宽度调制脉冲宽度调制技术 目前 xff0c pwm技术的应用是非常多的 为了增进大家对pwm的认识 xff0c 本文将对pwm 的几种控制方法进行详细的阐述 xff0c 保证大家彻底理解 如果你对pwm
  • WiFi信号覆盖面积小?如何扩大Wifi信号覆盖范围?

    WiFi已是现代生活不可缺少的组成之一 xff0c 在WiFi的帮助下 xff0c 一个家庭网络或办公网络 xff0c 能够通过无线的方法连接诸多设备 为增进大家对WiFi的认识 xff0c 本文将对WiFi以及扩大WiFi信号覆盖范围的方
  • 数据存储方式有哪些?这3种数据存储方式了解吗?

    数据存储具有很强的现实意义 xff0c 只有采取合理的数据存储方式 xff0c 才能够有利于数据的管理 检索等 为增进大家对数据存储方式的认识 xff0c 本文将对三种数据存储方式予以介绍 如果你对数据存储方式具有兴趣 xff0c 不妨继续
  • 这里带你了解IR2104驱动电路

    Ir2014驱动电路及自举电容的应用 以前做智能车的时候用H桥驱动电路 xff0c 驱动芯片就是用的IR2104 xff0c MOS管用的IR7843 xff0c 想把以前的知识总结一下 1 为什么需要H桥电路 因为驱动电机正反转 xff0
  • 什么是神经网络模型,常见神经网络模型有哪些?

    神经网络模型是机器学习 深度学习的核心 xff0c 针对不同的问题 xff0c 我们需要搭建不同的神经网络模型 为增进大家对神经网络模型的认识 xff0c 本文将对常见的神经网络模型予以介绍 如果你对神经网络模型具有兴趣 xff0c 不妨继
  • STM32L431使用TencentOS tiny操作系统连接腾讯物联网开发平台

    去年腾讯为了宣传自己针对物联网的开源操作系统TencentOS tiny xff0c 举办了一场试用活动 xff0c 当时幸运获得一块 板子实物就这样 xff0c 没啥好介绍的 xff0c 都是基础的外设 xff0c 如今闲来无事 xff0
  • [总线技术]汽车ECU网络传输-诊断协议测试-基于Canoe软件CAPL脚本编写

    一 xff0e 汽车电子电控结构 先介绍一下汽车电子电控的结构 xff0c 汽车并不像电脑一样 xff0c 只有一个CPU xff0c 而是分为多个 CPU 独立工作 xff0c 就是由很多很多个控制器组成的 xff0c 比如 xff1a
  • [STM32F1]关于STM32F103芯片按钮机制串口发送程序

    就是目前遇到一个项目 xff0c 是监视各个按钮状态并将各个按钮的状态发送至上位机 xff0c 上位机进行整体程序逻辑动作 一般情况下串口发送可以直接一直发送给上位机 xff0c 通过解析不同数据位0和1的状态可以知道具体哪个按钮按下 xf
  • [uCOS/RTOS]freertos——创建任务(一)

    FreeRTOS操作系统学习 前言 FreeRTOS操作系统的学习正式开始 一 了解FreeRTOS FreeRTOS共有32个优先级 xff08 0 31 xff09 使用时0和31不使用 优先级规则 xff1a 数字越大优先级越高 任务
  • 基于FreeRTOS的UART空闲中断框架设计

    设计背景 xff1a 针对大部分国产低端MCU ARM CortexM0 来说 xff0c 并没有空闲中断 xff0c 此时就需要一个定时器Timer配合来完成此任务 对于UART接受不定长数据 xff0c 空闲中断还是非常实用的 xff0
  • 2、可迭代对象与迭代器

    1 Iterable 可迭代对象 概念 xff1a python中能够使用for循环遍历的都是可迭代对象 1 常见的可迭代对象 1 1 序列如 xff1a list str tuple range 1 2 非序列 xff1a dict se