news 2026/4/16 16:14:02

Python语法进阶笔记(五)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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提供的通过简便的方法写出迭代器的一种手段

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 14:12:13

学长亲荐!继续教育必备8款AI论文网站TOP8测评

学长亲荐&#xff01;继续教育必备8款AI论文网站TOP8测评 2026年继续教育AI论文工具测评&#xff1a;为何需要这份榜单&#xff1f; 在继续教育领域&#xff0c;论文写作已成为许多学员提升学历、获取职称的必经之路。然而&#xff0c;面对繁重的工作压力与有限的时间&#xff…

作者头像 李华
网站建设 2026/4/16 15:51:39

Linux环境编程第二天笔记

Linux环境编程第二天fork()fork()会使得进程本身被复制&#xff0c;父子进程几乎一模一样。被复制的实际的UID和GID&#xff0c;以及有效的UID和GID所有的环境变量进程组ID和会话ID当前的工作路径&#xff0c;除非用chdir()修改打开的文件信号响应函数整个内存空间、包括栈、堆…

作者头像 李华
网站建设 2026/4/16 12:42:25

MBA必看!10个高效降aigc工具推荐,轻松应对AI检测

MBA必看&#xff01;10个高效降aigc工具推荐&#xff0c;轻松应对AI检测 AI降重工具&#xff1a;高效应对论文查重难题 在当前的学术环境中&#xff0c;随着AI技术的广泛应用&#xff0c;论文的AIGC率逐渐成为高校和研究机构关注的重点。对于MBA学生而言&#xff0c;如何在保证…

作者头像 李华
网站建设 2026/4/16 12:41:30

深度学习目标检测算法 YOLOV8 YOLO26

往期热门主题 主页搜两字"关键词"直达 代码数据获取&#xff1a; 获取方式&#xff1a;***文章底部卡片扫码获取***. 覆盖了YOLO相关项目、OpenCV项目、CNN项目等所有类别&#xff0c; 覆盖各类项目场景&#xff1a;项目名称项目名称基于YOLOv8 智慧农业作物长势监测…

作者头像 李华