python 迭代器生成器
目录
一、可迭代对象
1.1 判断是否为可迭代对象
二、迭代器
2.1 判断对象是否是一个迭代器
2.2 手写一个迭代器
2.3 迭代器应用场景
三、生成器
3.1 生成器介绍
3.2 使用yield 关键字 生成器,来实现迭代器
3.3 生成器(yield关键字)的运行逻辑
一、可迭代对象
可迭代对象,就是 可以使用for 循环遍历的对象。
比如 list 列表
tuple 元组
set 集合
str 字符串
dic 字典
如果想要使用for来遍历,这个对象必需具有 __iter__ 方法
1.1 判断是否为可迭代对象
方法一:
from typing import Iterable
isinstance(obj,Iterable)
方法二:
是否有__iter__ 方法
print(hasattr(list,"__iter__"))
print(hasattr(str,"__iter__"))
print(hasattr(tuple,"__iter__"))
print(hasattr(dict,"__iter__"))
print(hasattr(set,"__iter__"))True
True
True
True
True
二、迭代器
1、迭代器首先是一个可迭代对象,拥有__iter__ 方法,返回self
2、还必须要有 __next__ 方法。__next__ 方法 用来输出下一个元素。如果没有下一个值,则抛出StopIterator 异常
3、迭代器,使用for操作时,得到的每一个元素,会自动的调用__next__方法,从而得到下一个元素,依次循环,这样就能遍历所有的元素了。for语句迭代会忽略异常。
4、迭代器迭代的时候,使用for,不要使用while
5、迭代器只能迭代一次。(因为对象里用于迭代计算的下标一直是增加的)
6、迭代器比list占用更小的内存。
2.1 判断对象是否是一个迭代器
迭代器同时拥有 __iter__ 方法 与 __next__ 方法。
方法一:
isinstance(obj,Iterator)
注意,这里是Iterator 不是Iterable
列表list,是一个可迭代对象,但不是一个迭代器。
from typing import Iterable, Iteratora = [1,2,3]
print(isinstance(a,Iterable))
# True
print(isinstance(a,Iterator))
# False
将 可迭代对象,转化为一个迭代器,使用iter方法.
from typing import Iterable, Iteratora = [1,2,3]
print(isinstance(a,Iterable))
print(isinstance(a,Iterator))b = iter(a)
print(isinstance(b,Iterator))# True
2.2 手写一个迭代器
# -*- coding:utf-8 -*-
# @Author: 喵酱
# @time: 2023 - 02 -18
# @File: my_iterator.pyclass MyIterator(object):def __init__(self, stop: int, start=0):self.stop = stopself.value = startdef __next__(self):"""返回下一个元素,没有则抛出StopIteration 异常"""if self.value < self.stop:self.value += 1else:raise StopIterationreturn self.valuedef __iter__(self):return selfif __name__ == '__main__':myIterator = MyIterator(5)print(myIterator.__next__())print(myIterator.__next__())print(myIterator.__next__())print(myIterator.__next__())print(myIterator.__next__())print(myIterator.__next__())
输出结果:
1
2
3
4
5
Traceback (most recent call last):File "/Users/zhaohui/PycharmProjects/MyTest/cekai/my_iterator.py", line 27, in <module>print(myIterator.__next__())File "/Users/zhaohui/PycharmProjects/MyTest/cekai/my_iterator.py", line 16, in __next__raise StopIteration
StopIteration
使用for遍历
myIterator = MyIterator(5)for i in myIterator:print(i)打印结果:
1
2
3
4
5
2.3 迭代器应用场景
迭代器,占用内存,远远小于list。
需要节省内存的场景。
三、生成器
3.1 生成器介绍
生成器:为了快速、方便的创建一个迭代器。
生成器,就是一个使用了yield 关键字的迭代器。
3.2 使用yield 关键字 生成器,来实现迭代器
举例:
list = [ 1,2,3,4,5]
每个元素平方,再生成一个新的list
new_list = [1,4,9,16,25]
方法一:
使用list实现
list = [1, 2, 3]
list1 = []for i in list:list1.append(i * i)
print(list1)
方法二:
手动创建一个迭代器
class Square(object):def __init__(self, start, stop):self.value = startself.stop = stopdef __iter__(self):return selfdef __next__(self):if self.value > self.stop:raise StopIterationqueare_num = self.value * self.valueself.value += 1return queare_numif __name__ == '__main__':square = Square(1, 5)for i,s in enumerate(square):print(i,s)
打印结果:
0 1
1 4
2 9
3 16
4 25
方法三 使用yield 关键字,实现一个生成器
def square_yield(start:int,stop:int):for i in range(start,stop+1):yield i*iif __name__ == '__main__':square_yield(1,4)
yield 就等价于迭代器中的 __next__ 方法
yield 关键字,与 return 方法比较
def square_yield(start:int,stop:int):for i in range(start,stop+1):yield i*idef squqre_return(start,stop):for i in range(start,stop+1):return i*iif __name__ == '__main__':square_yield(1,4)print(squqre_return(1,4))
方法中,return 方法,就表示这个函数结束了。
yield 返回的是一个 生成器类。
3.3 生成器(yield关键字)的运行逻辑
1、yield 关键字,与return 一样,会返回一个结果。 但是return返回的是 运行结果
但是yield返回的,可不是运行结果,返回的是一个迭代器的对象。只有这个对象调用__next__
的时候,才会执行业务逻辑
2、 yield 会记录每次的运行位置。
3、只有生成器的对象在调用__next__方法时,才会执行业务代码。业务代码执行完,函数就会变成非runnning状态(挂起状态)。直到下一次__next__方法被调用
举几个例子,方便我们理解一下
举例一:
------没有使用yield关键字
def f1():print("开始执行")return "f1被执行了"if __name__ == '__main__':fun = f1()
当调用f1函数时,f1里面的业务代码被执行了。
------使用yield关键字
def f():print("yield 1------------")a = 1yield aprint("yield 2=================")a = 2yield aprint("yield 3=================")a = 3yield aif __name__ == '__main__':generator = f()
运行结果为空,因为generator = f(),得到的是一个生成器的对象,没有调用业务代码。
当我们第一次调用__next__时
generator = f()print(generator.__next__())
输出结果:
yield 1------------
1
当第二次调用__next__时
输出结果:
yield 2=================
2
当第三次调用__next__时
输出结果:
yield 3=================
3
当生成器的对象,调用__next__方法时,yield 会记录每一次 运行的位置,当 下一次调用__next__方法时,业务代码会接着上一次的位置继续运行。
如下图:
整体代码:
# -*- coding:utf-8 -*-
# @Author: 喵酱
# @time: 2023 - 02 -18
# @File: diedai5.pydef f():print("yield 1------------")a = 1yield aprint("yield 2=================")a = 2yield aprint("yield 3=================")a = 3yield aif __name__ == '__main__':generator = f()print(generator.__next__())print(generator.__next__())print(generator.__next__())
举例二:
解释一下上面求平方的函数,的生成器
def square_yield(start:int,stop:int):for i in range(start,stop+1):yield i*i
每次__next__ 都会记录 业务代码运行位置。
--------当第一次调用__next__ 时:
i = 1 ,返回 1x1 的结果。内存中记录 i = 1
--------第二次调用__next__ 时:
上一次的记录是i=1,开启for下一轮的循环,则i=2.返回 2x2 的结果。内存中记录 i = 2
相关文章:
python 迭代器生成器
目录 一、可迭代对象 1.1 判断是否为可迭代对象 二、迭代器 2.1 判断对象是否是一个迭代器 2.2 手写一个迭代器 2.3 迭代器应用场景 三、生成器 3.1 生成器介绍 3.2 使用yield 关键字 生成器,来实现迭代器 3.3 生成器(yield关键字)…...
Iceberg基于Spark MergeInto语法实现数据的增量写入
SPARK SQL 基本语法 示例SQL如下 MERGE INTO target_table t USING source_table s ON s.id t.id //这里是JOIN的关联条件 WHEN MATCHED AND s.opType delete THEN DELETE // WHEN条件是对当前行进行打标的匹配条件 WHEN MATCHED AND s.opType update THEN…...
JavaScript Array(数组) 对象
JavaScript 中的 Array(数组)对象是一种用来存储一系列值的容器,它可以包含任意类型的数据,包括数字、字符串、对象等等。通过使用数组对象,我们可以轻松地组织和处理数据,以及进行各种操作,比如…...
Debian如何更换apt源
中科大 deb https://mirrors.ustc.edu.cn/debian/ stretch main non-free contrib deb https://mirrors.ustc.edu.cn/debian/ stretch-updates main non-free contrib deb https://mirrors.ustc.edu.cn/debian/ stretch-backports main non-free contrib deb-src https://mirr…...
Connext DDSPersistence Service持久性服务
DDS持久性服务,它保存了DDS数据样本,以便即使发布应用程序已经终止,也可以稍后将其发送到加入系统的订阅应用程序。 简介Persistence Service是一个Connext DDS应用程序,它将DDS数据样本保存到临时或永久存储中,因此即使发布应用程序已经终止,也可以稍后将其交付给加入系…...
自抗扰控制ADRC之微分器TD
目录 前言 1 全程快速微分器 1.1仿真分析 1.2仿真模型 1.3仿真结果 1.4结论 2 Levant微分器 2.1仿真分析 2.2仿真模型 2.3仿真结果 3.总结 前言 工程上信号的微分是难以得到的,所以本文采用微分器实现带有噪声的信号及其微分信号提取,从而实现…...
链表学习之复制含随机指针的链表
链表解题技巧 额外的数据结构(哈希表);快慢指针;虚拟头节点; 复制含随机指针的链表 该链表节点的结构如下: class ListRandomNode { public:ListRandomNode() : val(0), next(nullptr), random(nullptr…...
【人脸检测】Yolov5Face:优秀的one-stage人脸检测算法
论文题目:《YOLO5Face: Why Reinventing a Face Detector》 论文地址:https://arxiv.org/pdf/2105.12931.pdf 代码地址:https://github.com/deepcam-cn/yolov5-face 1.简介 近年来,CNN在人脸检测方面已经得到广泛的应用。但是许多…...
【Unity3d】Unity与Android之间通信
在unity开发或者sdk开发经常遇到unity与移动端原生层之间进行通信,这里把它们之间通信做一个整理。 关于Unity与iOS之间通信,参考【Unity3d】Unity与iOS之间通信 Unity(c#)调用Android (一)、编写Java代码 实际上,任何已经存在的Java代码…...
Allegro如何更改DRC尺寸大小操作指导
Allegro如何更改DRC尺寸大小操作指导 在做PCB设计的时候,DRC可以辅助设计,有的时候DRC的尺寸过大会影响视觉,Allegro支持将DRC的尺寸变小或者改大 如下图,DRC尺寸过大 如何改小,具体操作如下 点击Setup选择Design Parameters...
Mongodb WT_PANIC: WiredTiger library panic
文章目录故障现象排查过程1.查看Log2.同步恢复数据故障现象 周五突然收到Mongo实例莫名奇妙挂了告警,一般都是RS复制集架构模式(5节点),查看此实例角色为SECONDAR,挂了暂时不影响线上业务,但还是需要尽快修…...
【HTML】HTML 表格总结 ★★★ ( 表格标签 | 行标签 | 单元格标签 | 表格标签属性 | 表头单元格标签 | 表格标题标签 | 合并单元格 )
文章目录一、表格标签组成 ( 表格标签 | 行标签 | 单元格标签 )二、table 表格属性 ( border 属性 | align 属性 | width 属性 | height 属性 )三、表头单元格标签四、表格标题标签五、合并单元格1、合并单元格方式2、合并单元格顺序3、合并单元格流程六、合并单元格示例1、原始…...
linux013之文件和目录的权限管理
用户、组、文件目录的关系: 简介:用户和组关联,组合文件目录关联,这样就实现了用户对文件的权限管理。首先来看一下,一个文件或目录的权限是怎么查看的,ls -l, 如下,这个信息怎么看呢…...
设计模式之状态模式
什么是状态模式 状态模式是指允许一个对象在其内部状态改变时改变他的行为,对象看起来似乎改变了整个类。 状态模式将一个对象在不同状态下的不同行为封装在一个个状态类中,通过设置不同的状态对象可以让环境对象拥有不同的行为,而状…...
XQuery 选择 和 过滤
XML实例文档 我们将在下面的例子中继续使用这个 "books.xml" 文档(和上面的章节所使用的 XML 文件相同)。 在您的浏览器中查看 "books.xml" 文件。 选择和过滤元素 正如在前面的章节所看到的,我们使用路径表达式或 FL…...
室友打了一把王者的时间,我理清楚了grep,find,管道|,xargs的区别与联系,用的时候不知道为什么要这样用
目录 问题引入 find和grep的基本区别 xargs命令 Linux命令的标准输入 vs 命令行参数 举例总结 问题引入 在自己做项目的过程中,想使用linux命令统计下一个目录下html文件的数量,在思考应该使用grep还是find去配合wc指令统计文件数量,后来…...
python 刷题时常见的函数
collections.OrderedDict 1. move_to_end() move_to_end() 函数可以将指定的键值对移动到最前面或者最后面,即最左边或最右边 。 2. popitem() popitem()可以完成元素的删除操作,有一个可选参数last(默认为True),…...
Python之列表推导式和列表排序
Python中的列表推导式,是小编比较喜欢的一种,他能大大减少你的代码量来得到你想要的结果,下面说说列表中常用的几种推导式 列表排序 Python开发中会经常用到排序操作,这里提供两种方式供大家参考,对象的sort()方法和…...
力扣(LeetCode)240. 搜索二维矩阵 II(C++)
题目描述 枚举 枚举整个矩阵,找到等于 target 的元素,则 return true ,否则 return false。 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int n matrix.size(), m matrix[0]…...
golang defer
文章目录延迟函数的参数在defer语句出现时就已经确定下来了延迟函数没有入参时,延迟函数体内的变量会受到影响延迟函数 *可以* 修改主函数的 *具名* 返回值延迟函数 *无法* 修改主函数的 *匿名* 返回值defer会把声明的 延迟函数以及 函数的入参放到栈上,…...
【Java】线程的死锁和释放锁
线程死锁是线程同步的时候可能出现的一种问题 文章目录1. 线程的死锁1.1 基本介绍1.2 应用案例2. 释放锁2.1 下面的操作会释放锁2.2 下面的操作不会释放锁1. 线程的死锁 1.1 基本介绍 多个线程都占用了对方的锁资源,但不肯相让,导致了死锁,…...
如何使用断点续传上传大文件
概念 大文件上传的需求介绍 不管怎样简单的需求,在量级达到一定层次时,都会变得异常复杂。 文件上传简单,文件变大就复杂 上传大文件时,以下几个变量会影响我们的用户体验 服务器处理数据的能力请求超时网络波动 上传时间会变长…...
【图神经网络】图拉普拉斯滤波器如何实现全通、低通、高通滤波
【图神经网络】图拉普拉斯滤波器如何实现全通、低通、高通滤波 文章目录【图神经网络】图拉普拉斯滤波器如何实现全通、低通、高通滤波1. 前言2. 符号说明3. 三种滤波3.1 全通滤波3.2 低通滤波3.2.1 平滑信号分析3.2.2 广义拉普拉斯平滑滤波器3.3 高通滤波4. 总结1. 前言 GCN&…...
python操作mysql数据库详解
使用Python操作MySQL数据库 MySQL是一种关系型数据库管理系统,它可以用来存储和管理大量的数据。之前介绍了大部分主流数据库,今天将介绍如何使用Python来操作MySQL数据库。 安装MySQL 首先,我们需要安装MySQL服务器,可以从MyS…...
netty群聊系统
1设计思路:启动一个服务端,多个客户端第一个客户端启动时,会告诉服务器上线了第二个客户端启动时,告诉服务器上线,并且通知第一个启动的客户端第三个客户端启动时,告诉服务器上线,并且通知第一个…...
Android 初代 K-V 存储框架 SharedPreferences,旧时代的余晖?
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问。 前言 大家好,我是小彭。 SharedPreferences 是 Android 平台上轻量级的 K-V 存储框架,亦是初代 K-V 存储框架,至今被很多应用沿用。 有的…...
在windows中使用tomcat搭建Jenkins
1、 准备环境:JDK JDK官网下载:https://download.oracle.com/java/19/latest/jdk-19_windows-x64_bin.msi 2、 tomcat包 tocat官网下载:https://tomcat.apache.org/download-90.cgi 3、 Jenkins.war包 Jenkins官网下载:https://mi…...
Linux系统
linux系统 世界上最重要的服务器端操作系统。 创建新目录 mkdir app mkdir -m 目录权限 目录名 创建有权限的目录名。 创建一个空白文件 touch app.txt创建一个文件。 cat创建一个文件。 vi/vim创建一个文件。 nano创建一个文件。 truncate创建一个文件。 pwd查看当前目录。 rm…...
Mel Frequency Cepstral Coefficients (MFCCs)
wiki里说 在声音处理中,梅尔频率倒谱( MFC ) 是声音的短期功率谱的表示,基于非线性梅尔频率标度上的对数功率谱的线性余弦变换。 倒谱和MFC 之间的区别在于,在 MFC 中,频带在梅尔尺度上等距分布,这比正常频谱中使用的线…...
第七讲---贪心(上课)
1.股票买卖 一、贪心 考虑一种方案,在每次上升的前一天购入股票,并在上升后的当天卖出的方案 if (w[i] > w[i - 1])res w[i] - w[i - 1];接下来证明该贪心思路得出的方案即是最优解。 (1)证明贪心解 ≥ 最优解: …...
网站建设的主要特征/长春网站建设开发
go get github.com/garyburd/redigo/redis import "github.com/garyburd/redigo/redis" 连接 Conn接口是与Redis协作的主要接口,可以使用Dial,DialWithTimeout或者NewConn函数来创建连接,当任务完成时,应用程序必须调用Close函数来…...
wordpress 自动分享/宁波seo运营推广平台排名
一、 Hibernate介绍 Hibernate是基于对象/关系映射(ORM,Object/Relational Mapping)的一个解决方案。ORM方案的思想是将对象模型表示的对象映射到关系型数据库中,或者反之。Hibernate目前是ORM思想在Java中最成功、最强大的实现。…...
网盘做网站空间/网络营销的推广方法
一:索引优势劣势 优势 1) 类似于书籍的目录索引,提高数据检索的效率,降低数据库的IO成本。 2) 通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。 劣势 1) 实际上索引也…...
专业做网站/电子商务沙盘seo关键词
版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢! 本文网址:https://blog.csdn.net/sun8112133/article/details/84350216 好久没写博客咯,今天来写一写今天写代码中遇到的一个问题…...
兖州城乡建设局网站/免费网站提交入口
内省是 Java 语言对 Bean 类属性、事件的一种处理方法(也就是说给定一个javabean对象,我们就可以得到/调用它的所有的get/set方法)。例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规…...
网店设计与装修实训报告/乐陵市seo关键词优化
前言 当我们来回切换页面时候,视图被缓存下来,不用每次再去new一个新的视图,可以大大地提高性能。当跳出一个视图后,视图的元素被保存在DOM中,它的作用域也就不在$watch的作用域内,当我们访问一个已经被缓存…...