当前位置: 首页 > 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.jsqmd.com/news/274969/

相关文章:

  • 第二篇冲刺博客
  • paperxie 毕业论文:硕士专属智能写作工具,30000 字高质论文轻松交付
  • 1.20 2026多校冲刺省选模拟赛3题解
  • 人群仿真软件:Legion_(4).Legion用户界面介绍
  • 为什么在 Windows 的运行对话框(Win + r)里输入 code 会打开 VSCode ???
  • 基于网页在线标定板的 Halcon 单目相机标定
  • 6款写论文AI工具测评:AI智能润色+提升学术原创性,高效搞定论文写作! - 麟书学长
  • 从选题到定稿:paperxie 毕业论文工具如何让本科毕业不再 “渡劫”
  • 开源鸿蒙PC版真机运行——开源鸿蒙原生开发案例之魅力河北应用之河北简介
  • 创建CUDA11.8环境部署DeepSeek-OCR
  • 2个方法设置打开密码,保护Excel安全性!
  • 学长亲荐!继续教育必备8款AI论文网站TOP8测评
  • 人群仿真软件:AnyLogic_(17).仿真结果的解读与报告
  • 掌握Excel公式运行的底层逻辑:引用运算符与运算优先级完全解析
  • 计算机的“神经网络”:三大总线及桥接器
  • ChatGPT 需要一个时间轴,所以我开发了它 ❤️ - Monkey
  • Excel公式灵魂三要素:彻底掌握相对、绝对、混合引用
  • .NET+AI | Workflow | 核心概念速通(1)
  • MyBatis的二级缓存
  • 【总结】说课的语言风格
  • 为什么 IO 流通常只能被读取一次
  • 第六天|454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和
  • 2026年比较好的酶解海藻液,纯酶解海藻,高浓度酶解海藻厂家选购选型手册 - 品牌鉴赏师
  • 1/17考试总结
  • scATAC Transformer 输入的token是什么,句子是什么?
  • 天然蛋白vs重组蛋白:核心差异、应用选择与质量控制全解析
  • HBase在大数据领域金融数据处理中的应用
  • 本人入住博客园啦 原CSDN昵称大Mod_abfun是本人
  • 1.20假期记录
  • 2026年诚信的立式混料机,连续螺带混料机,混料机厂家行业优选榜单 - 品牌鉴赏师