当前位置: 首页 > news >正文

Python语法进阶笔记(五)

一、可迭代对象

  1. 可迭代对象Iterable

    1. 遍历(迭代):依次从对象中把一个个元素取出来的过程

    2. 数据类型:str、list、tuple、dict、set等

  2. 可迭代对象的条件

    1. 对象实现了_ _ iter _ _ () 方法

    2. _ _iter _ _() 返回了迭代器对象

  3. for 循环工作原理

    1. 先通过_ _ iter _ _ () 获取可迭代对象的迭代器

    2. 对获取到的迭代器不断调用_ _ next _ _ ()方法,来获取下一个值并将其赋值给临时变量(比如 i)

  4. isinstance() : 判断一个对象是否是可迭代对象或者是一个已知的数据类型

    1. isinstance(o,t): o: 对象, t : 类型,可以是直接或是间接类名,基本类型或者元组

    2. 使用方式:

      • 先导入模块,在python 3.3以上版本中,需要使用from collections.abc import Iterable

      • 使用isinstance() 判断

        from collections.abc import Iterable st = '123' print(isinstance(st, Iterable)) # True print(isinstance([1,2,3], int)) # False print(isinstance(st, (int, list))) # False 既不是int ,也不是list

二、迭代器 (Iterator)

  1. 含义:是一个可以记住遍历位置的对象:在上次停留的位置继续去做一些事情

  2. iter():获取可迭代对象的迭代器

  3. next():一个个去取元素,取完后会引发一个异常

    li = [1,2,3] #1. 创建迭代器对象 iter_obj = iter(li) print(iter_obj) # <list_iterator object at 0x0000023A7B359480> # 2. 获取吓下一条数据 print(next(iter_obj)) # 1 print(next(iter_obj)) # 2 print(next(iter_obj)) # 3 # 3. 取完元素后,再使用next()会引发StopIteration异常
  4. 步骤总结:

    1. iter () 调用对象的 __ iter__(),并把 __ iter__() 方法的返回结果作为自己的返回值

    2. next () 调用对象的 __ next__(),一个个取元素

    3. 所有元素都取完了,__ next__() 将引发 StopIteration 异常

  5. 可迭代对象iterable和迭代器iterator区别

    • 凡是可以作用于for 的循环都属于可迭代对象

    • 凡是可以作用于next()的都是迭代器

    • 可迭代对象不一定是迭代器对象,迭代器对象一定是可迭代对象

    • 总结:

      可迭代对象可以通过iter()函数转换为迭代器对象

      如果一个对象拥有__iter__()方法,那么这个对象就是可迭代对象,

      一个对象拥有 __ next__()和__iter__()方法,那么这个对象就是迭代器对象

      迭代器 = iter(可迭代对象)

      下个值 = next(迭代器)

    • 注意:dir(): 查看对象所有属性和方法

    from collections.abc import Iterator, Iterable name = '小象' print(isinstance(name, Iterable)) # True print(isinstance(name, Iterator)) # False #说明:可迭代对象不一定是迭代器对象 name1 = iter(name) # 将name转换为迭代器对象 print(isinstance(name1, Iterable)) # True print(isinstance(name1, Iterator)) # True # 说明:迭代器对象一定是可迭代对象 #总结: # 可迭代对象可以通过iter()函数转换为迭代器对象 # 如果一个对象拥有__iter__()方法,那么这个对象就是可迭代对象,一个对象拥有 __next__()和__iter__()方法,那么这个对象就是迭代器对象 # dir(): 查看对象所有属性和方法 print(dir(name)) # 包含'__iter__'-------- 可迭代对象 print(dir(name1))# 包含'__iter__'、'__next__' -----------迭代器
  6. 迭代器协议:

    对象必须提供一个next方法,执行该方法要么就返回迭代中的下一项,要么就引发StopIteration异常,来终止迭代

  7. 自定义迭代器类:

    两个特性:__ iter __ () 和 __ next__ ()

    class MyIterator(object): def __init__(self): self.num = 0 def __iter__(self): return self # 返回迭代器对象本身,当前迭代器类的实例对象 def __next__(self): if self.num == 5: # 抛出迭代结束的异常 raise StopIteration("终止迭代") self.num += 1 return self.num mi = MyIterator() print(mi) for i in mi: print(i)

三、生成器(generator)

Python中一边循环一边计算的机制,叫做生成器

  1. 生成器表达式

    列表推导式:li =[ i*5 for i in range(5)]------> [ ] 改为(),就变成了生成器表达式

    gen = ( i*5 for i in range(5) )

  2. 生成器函数

    Python中使用了yield 关键字的函数就称为生成器函数

    yield:

    1. 类似return,将指定值或者多个值返回给调用者

    2. yield 语句依次返回一个结果,在每个结果中介,挂起函数,执行next(),再重新从挂起点继续往下执行 ,是函数中断,并保存终端的状态

      def gen(): print("开始执行") yield "a" # 返回a,暂停函数,在此处挂起,下一次再从此处恢复运行 yield "b" yield "c" gen01 = gen() print(next(gen01)) # 开始执行 a print(next(gen01))# b def gen2(n): li = [] for i in range(n): li.append(i) yield i print(li) print(gen2(5)) for i in gen2(5): print(i) # <generator object gen2 at 0x0000020927488E40> # 0 # 1 # 2 # 3 # 4 # [0, 1, 2, 3, 4] def test(): yield 1 yield 2 yield 3 print(test()) print(next(test())) # 加括号是调用函数 ,从头开始,每次都是1 print(next(test()))#c1 te = test() print(next(te)) # 从对象中取值 1 print(next(te))# 2 print(next(te))# 3

四、三者关系

  • 可迭代对象:指实现了python迭代协议,可以通过 for... in...循环遍历的对象,比如list、dict、str...迭代器、生成器

  • 迭代器: 可以记住自己遍历位置的对象,直观体现就是可以使用next()函数返回值,迭代器只能往前,不能往后。当遍历完毕之后,next()会抛出异常

  • 生成器:是特殊的迭代器,需要注意迭代器不一定是生成器,它是python提供的通过简便的方法写出迭代器的一种手段

  • 包含关系:可迭代对象>迭代器>生成器

http://www.cnnetsun.cn/news/720170.html

相关文章:

  • paperxie 毕业论文:硕士专属智能写作工具,30000 字高质论文轻松交付
  • paperxie 毕业论文:本科通关神器,3000 字原创轻松交付[特殊字符]
  • 使用 pip3 一键卸载当前环境中所有已安装的 Python 包(Linux / macOS / Windows)
  • 计算机毕业设计springboot线上票务系统app 基于Spring Boot的移动票务管理平台开发 Spring Boot框架下的线上票务系统设计与实现
  • Linux运维必备:一个LVM管理添加和扩容脚本的诞生记(完整版)
  • 【Linux 网络】拒绝传输卡顿!滑动窗口如何让数据 “跑赢” 等待?
  • LeetCode 379 电话目录管理系统
  • 04. 引用
  • 当AI刺破泡沫:算力瓶颈、能源战争与资本主义的“物理转向”
  • YOLOv11魔改高效涨点 | 注意力篇 | DAT注意力:可变形自注意力,结合变形卷积之魂,动态捕捉全局核心特征,让 Transformer 拥有“动态猫眼”,精准锁定目标,彻底疯狂!!!
  • SSM272的交通事故档案管理系统
  • SSM296的汽车租赁系统vue
  • 【AIGC】2025年12月13日 AutoMV: Automatic Multi-Agent System for Music Video Generation 1:介绍
  • 【AIGC】2025年12月13日 AutoMV: Automatic Multi-Agent System for Music Video Generation 2:论文
  • 知光项目对象存储模块
  • 大数据领域数据服务的用户需求挖掘方法
  • Python:wxauto或PyOfficeRobot的使用
  • FPGA实现万兆网络协议栈UDP/TCP/IP连续16小时无丢包传输
  • 超实用!二维码条形码生成打印软件C#源码分享
  • 三菱FX3U与欧姆龙E5CC温控器通讯控制实战
  • 三菱fx3u模拟量FB:打开模拟量控制新世界
  • 当一个新的观察者诞生,它所见的世界,已非旧世界
  • SSM236的动漫周边商城vue多商家
  • 通过WiFI远程采集导航磁场信号
  • MonkeyCode+cpolar,让国产 AI 编程助手随时随地用
  • 基于FPGA的图像形态学腐蚀处理Verilog开发与开发板硬件测试
  • 公路修建(洛谷P1265)
  • 技术必看:Agent不是低代码工具,而是运行时机制,彻底理解智能体本质,建议收藏反复研读
  • 【必藏】智能体“失忆“问题破解:记忆管理技术与多智能体协同方案
  • Navicat Premium Mac终极重置指南:告别试用期限制的简单方法