news 2026/5/3 16:37: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/30 21:42:45

掌握Excel公式运行的底层逻辑:引用运算符与运算优先级完全解析

当你的公式结果与预期不符时&#xff0c;很可能不是函数用错了&#xff0c;而是忽略了Excel运算的“交通规则”。 在Excel中编写公式就像指挥一个交响乐团&#xff0c;每个运算符都有自己的“声部”和“进入顺序”。引用运算符决定了数据从哪里来&#xff0c;而运算符优先级决定…

作者头像 李华
网站建设 2026/5/1 4:49:51

MyBatis的二级缓存

二级缓存是SqlSessionFactory级别&#xff0c;通过同一个SqlSessionFactory创建的SqlSession查询得的结果会被缓存&#xff0c;此后若再次执行相同的查询语句&#xff0c;结果就会从缓存中获取 二级缓存开启的条件 在核心配置文件中&#xff0c;设置全局配置属性cacheEnabled&q…

作者头像 李华
网站建设 2026/4/30 21:45:19

HBase在大数据领域金融数据处理中的应用

HBase在大数据领域金融数据处理中的应用 关键词&#xff1a;HBase、大数据、金融数据处理、分布式存储、实时读写 摘要&#xff1a;本文主要探讨了HBase在大数据领域金融数据处理中的应用。首先介绍了相关背景知识&#xff0c;包括HBase的基本概念、金融数据处理的特点和需求。…

作者头像 李华
网站建设 2026/4/29 19:07:29

2026.1.20 SQL Server命令

创建&#xff1a;create 修改&#xff1a;alter 删除&#xff1a;drop mdf ndf ldf 主文件 辅助文件 日志文件 create database [数据库名] #创建数据库 on primary #主数据文件 …

作者头像 李华
网站建设 2026/4/23 18:45:45

SSM248的高校奖学金管理系统vue

目录高校奖学金管理系统&#xff08;SSM248Vue&#xff09;摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;高校奖学金管理系统&#xff08;SSM248Vue&#xff09;摘要 该系统基于SSM&#xff08;SpringSpringMVCMyBatis&a…

作者头像 李华