快速理解python中的可迭代对象、迭代器、生成器

2023-11-01

快速学会python中的可迭代对象、迭代器、生成器

今天周一,又要开始新的一周的学习了,加油鸭!多学一点不吃亏哈哈

迭代

什么是迭代?迭代就是将重复的代码进行执行,处理相似的数据集。并且上一个迭代的结果会给到下一次,作为初始化值进行下一次的迭代。如果途中有停止,都不能算作是一次迭代。那么迭代器就是驱动这件事的人,迭代器负责把对象一个一个拿出来。

可迭代对象

定义:可迭代对象必须实现 “iter()” 方法,可返回迭代对象
我们所学过的容器均是可迭代对象,例如:字符串、列表、元组、字典、集合、文件对象等都是可迭代对象。

#迭代对象
list1=[1,3,4,5,7]
#迭代过程
for i in list1:
    print(i)

迭代原理(面试)一共三步:
1、for 循环的原理
2、可以被for的条件是什么?容器为啥可以被for?
答:
1、获取迭代器
2、循环获取下一个元素
3、遇到异常停止迭代

迭代器是什么?

Python的迭代器协议要求实现__iter__方法,__iter__方法会返回一个迭代器对象,这个迭代器对象实现了__next__方法,并且通过抛出StopIteration异常标识迭代的完成

迭代器实现

#1、获取迭代器
iter=list1.__iter__()
while True:
    #获取下一个元素
    next=iter.__next__()
    print(next)
结果会抛异常
    next=iter.__next__()
StopIteration

将异常捕获

#迭代对象
list1=[1,3,4,5,7]
#迭代过程
# for i in list1:
#     print(i)

#1、获取迭代器
iter=list1.__iter__()
while True:
    try:
        #获取下一个元素
        next=iter.__next__()
        print(next)
    except StopIteration:
        break
以上是迭代的原理

for循环原理:
为什么要用for:因为需要去触发、调用迭代器。字符串 、字典、列表在for循环的作用下,会生成迭代器,然后被使用。
原理:用 _iter_方法,返回自身self,也就是返回迭代器。不断地调用迭代器的next()方法,每次按序返回迭代器中的一个值。迭代到最后没有元素时,就抛出异常 StopIteration

#迭代器
class Skill:
    pass
class SkillIterator:
    def __int__(self,target):
        self.__target=target
        self.__index=0
    def __next__(self):
        #判断如果没有数据就抛异常,停止迭代器
        if self.__index>len(self.__target)-1:
            raise StopIteration
        #返回下一个数据
        temp=self.__target[self.__index]
        self.__index+=1
        return temp

class SillManager:

    def __int__(self):
        self.__skill=[]
    def add_skill(self,skill):
        self.__skill.append(skill)
    def __iter__(self):
        #创建一个迭代器
        return SkillIterator(self.__skill)

s=SillManager()
s.add_skill(Skill())

实际上,在迭代器协议中,__next__在哪里定义并不重要,重要的是__iter__要返回带有__next__方法的对象。

所以从实用的角度出发,我们可以将__next__方法和__iter__方法实现在同一个类里面,像下面这样

class MyIterator(object):
    def __iter__(self):
        return self
    
    def __next__(self):
        return "hello world"


for i in MyIterator():
    print(i)

现在,因为MyIterator实现了__iter__方法,所以它是可迭代的,同时因为它还实现了__next__方法,所以它又是一个迭代器。
因为这个类实现了__next__方法,所以在__iter__方法中返回实例自身,就满足了迭代器协议。

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

快速理解python中的可迭代对象、迭代器、生成器 的相关文章

随机推荐

  • 【点云】Large-scale Point Cloud Semantic Segmentation with Superpoint Graphs

    目录 1 摘要 2 介绍 3 方法 3 1 基于全局能量的集合分割 3 2 建立超点图 3 3 嵌入超点 3 4上下文分割 1 摘要 我们提出一个基于深度学习的框架 来解决大规模点云的语义分割问题 我们认为点云的组织形式可以被SPG Sup
  • 简单了解单点登录及实现方案

    代码演示基于springboot 一 单应用单节点登录认证 任何一个应用系统都离不开登录认证过程 实现登录认证主要目的是对系统的权限管理 在单应用单节点下常用做法通常采用session认证机制 其主要流程如下 客户端访问登录接口 传递用户名
  • i219-v不支持服务器,网络适配器中找不到Intel(R) Ethernet Connection I219-V该怎么解决?在虚拟机配...

    是因为网络适配器权限问题 1 打开网络连接 如下图 2 打开本地连接的属性 选择高级菜单 并将Internet连接共享的勾都打上 3 然后选择无线网卡进行专用网络连接 4 设置之后 您可以看到本地连接有一个手形图标 表明它是一个共版享状态
  • 三极管饱和及深度饱和状态的理解和判断!

    三极管饱和问题总结 1 在实际工作中 常用Ib V R作为判断临界饱和的条件 根据Ib V R算出的Ib值 只是使晶体管进入了初始饱和状态 实际上应该取该值的数倍以上 才能达到真正的饱和 倍数越大 饱和程度就越深 2 集电极电阻 越大越容易
  • 单选按钮input[type=radio],加上disabled后按钮颜色失效,始终默认为灰色

    在前端使用单选按钮input type radio 时 渲染后台数据时将单选按钮设为不可修改 给input加上disabled后 按钮颜色变灰 且通过css修改样式也无法改变 通过百度尝试了类似以下方式的几种修改css样式的常用办法解决 但
  • 【Android学习】导入别人的Android项目到AS中

    更新 最好直接导入 有错误再根据对应错误修改 学习阶段 下载学习他人的项目是必不可少的一步 但是新手又常常会遇到各种奇葩的问题 问题不可怕 可怕是自己退缩 总结下自己的一些经验 望对后来的你有所帮助 一 快速更改 在移植别人项目之前 最好先
  • 华为机试题69-矩阵乘法

    描述 如果A是个x行y列的矩阵 B是个y行z列的矩阵 把A和B相乘 其结果将是另一个x行z列的矩阵C 矩阵的大小不超过100 100 输入描述 第一行包含一个正整数x 代表第一个矩阵的行数 第二行包含一个正整数y 代表第一个矩阵的列数和第二
  • 20210220--CTF小笔记之常见的md5碰撞

    欢迎大家一起来Hacking水友攻防实验室学习 渗透测试 代码审计 免杀逆向 实战分享 靶场靶机 求关注 0e开头的md5和原值 QNKCDZO 0e830400451993494058024219903391 s878926199a 0e
  • 小程序内嵌webview实现支付

    点击上方 青年码农 关注 回复 特效源码 可获取各种资料 目前的一个小程序项目需要把客户之前的h5页面嵌入到现在的小程序中 并且之前的支付功能要正常 小程序提供了webview开放能力供我们使用 但是不允许在webview直接调起微信支付
  • 重载的分析

    前言 在c 中 出现重载的概念 其实就是一个高级语言的象征 他的出现就是机器语言更加的自然化 他其实可以理解位我们自然语言中的动词 它可以和不同的名词起到不同的功能 重载 定义 用一个相同的函数名来定义不同的函数 重载的条件 参数的个数不同
  • CMSIS-RTOS的信号量使用备忘

    说明 因为要使用CMSIS RTOS的信号量 所以需要了解以下几点功能 1 接收信号量时 返回值的意思 2 接收信号量时 如果信号量容器不只为一 那么是否可以再次接收到 3 发送信号量是否有限制 带着以上问题做了一个测试程序 例一 程序代码
  • strace ltrace记录

    strace 安装 常用选项 报错 strace trace system calls and signals ltrace A library call tracer 安装 首次使用可能出现这个提示 就是没安装 yum y install
  • ubuntu 远程服务器文件与本地文件互传

    放在这里自学 cite https blog csdn net Iv zzy article details 109412198 1 从服务器下载文件到本地 scp r 远程服务器用户名 远程IP 需要下载的文件路径 本地存放文件路径 2
  • 金融分析与风险管理——资本资产定价模型

    金融分析与风险管理 资本资产定价模型 1 系统性风险与非系统性风险 2 资本资产定价模型 1 系统性风险与非系统性风险 在理论上 股票面临的风险可以抽象的划分为系统性风险与非系统性风险 系统性风险 不可分散风险 也称市场风险 通常是由于公司
  • 数据挖掘十大算法(一):决策树算法 python和sklearn实现

    学完到第三章 决策树 python代码实现的仅是ID3算法 sklearn为优化过的C4 5 这里做一个详细的总结包括 原理 代码 可视化 scikit learn实现 皆为亲自实践后的感悟 以下进入正文 早前简单了解了决策树的原理 然后为
  • clang与gcc的区别

    gcc g 和 clang clang 都是Linux操作系统中常用的C C 编译器 gcc g 是gnu标准下的Linux的编译器 clang是一个C 编写 基于LLVM Low Level Virtual Machine 底层虚拟机 是
  • QT 设置程序图标

    在qt应用程序中 我们能想到的图标一般就以下三种 icon种类 应用窗口左上角的 图标 setWindowIcon 状态栏上显示的图标 setWindowIcon 可执行程序本身的图标 两种设置方式 下面会讲 对于以上三种图标都该怎么样设置
  • 【PTA】判断一个数是否为回文数

    1 题目 如果一个数与它的反转数相等 则该数为回文数 输入一个数 判断是否为回文数 输入格式 输入一个数 输出格式 若XX是回文数 则输出 XX 是回文数 若不是 则输出 XX 不是回文数 输入样例1 6234326 输出样例1 62343
  • radius认证服务器系统,03-Radius认证配置举例

    RADIUS 是一种用于在需要认证其链接的网络访问服务器 NAS 和共享认证服务器之间进行认证 授权和记帐信息的文档协议 RADIUS在运维审计系统中 主要体现的是认证功能 收集RADIUS服务器信息 IP地址 RADIUS端口号 RADI
  • 快速理解python中的可迭代对象、迭代器、生成器

    快速学会python中的可迭代对象 迭代器 生成器 今天周一 又要开始新的一周的学习了 加油鸭 多学一点不吃亏哈哈 迭代 什么是迭代 迭代就是将重复的代码进行执行 处理相似的数据集 并且上一个迭代的结果会给到下一次 作为初始化值进行下一次的