python进阶:可迭代对象和迭代器

一、Iterable(可迭代对象)

1、可迭代对象:能够进行迭代操作的对象。

  • 可以理解为:能够使用for循环遍历的都是可迭代对象;**
  • 所有的可迭代对象,偶可以用内置函数iter转换为迭代器**

2、可迭代对象包括:

  • 序列类型:元组、列表、字符串、range
  • 字典、集合
  • 文件对象(open(xxx))
  • 实现了迭代协议(iter)方法的对象
class Myclass1:"""实现迭代协议"""def __iter__(self):# return iter([111,22,33])m = Myclass1()
for i in m :print(i)
  • 实现了序列语义方法(getitem)的对象
class Myclass2:"""实现序列语义"""value = [11,22,33]def __getitem__(self, item):return self.value[item]m = Myclass2()
for i in m :print(i)

二、Iterator(迭代器)

**1、迭代器:**实现了迭代器协议的对象(__iter__方法和__next__方法)。

  • 能够使用内置函数next进行逐个迭代数据的对象
li = [111,222,333]
itor = iter(li)
print(next(itor))#每次使用next都能迭代出一个数据
print(next(itor))

2、特性:

  • 迭代器内的数据只能迭代一次
  • 当迭代器内部的数据,迭代完,,迭代器就会进入停止状态,如果再次通过next进行迭代就会抛出异常(StopIteration)

三、Generator(生成器;常用)

1、生成器:**生成器是迭代器的子类,可以把他当做一种特殊的迭代器,生成器支持支持迭代器所有的操作和特性。

2、生成器定义的方法:

  • 生成器表达式 g = (i for i in xxx)
  • 生成器函数:函数中使用了关键字yield的函数,都称之为生成器函数;生成器函数调用时不会直接执行,会直接返回一个生成器对象
def test1():print("-------------1--------------")yield 1print("%%%%%%%%%%%%%%%%%%%%%%%%%%%%")yield 2res = test1()
print(res)

这时打印出的test1函数为生成器对象

3、生成器的应用场景:

  • 在程序中使用上万级别低的数据时,使用生成器来保存数据,可以显著的减少内存开销
    • 生成器内部不直接保存数据,只存储生成数据低的规则(算法),使用next去获取才会生成(用的时候才生产)
  • 可以使用生成器来实现函数内部的代码分段执行(pytest中的fixture实现,python3.5以前的携程实现

4、运行过程
当效用生成器函数时,他会返回一个生成器对象,该对象可以迭代获取生成器函数中通过yield语句产生的值。每次迭代时,生成器函数会从上一次yield语句的位置继续执行,直到再次遇到yield语句并产生下一个值,当超过迭代器中的数据全部取完以后,再取数据则会报错

5、自动化框架中用到的生成器

使用pytest执行
import pytest@pytest.fixture()
def login_fixture():print("=====用例前置脚本=====")token = 'xxxxxxxx'yield tokenprint("=====用例后置脚本=====")def test_demo(login_fixture):print("=====执行测试用例中=====")

上面的是pytest封装好的夹具功能,下面的代码是模拟完整的使用夹具的过程

from inspect import signaturedef login_fixture():print("=====用例前置脚本=====")token = 'xxxxxxxx'yield tokenprint("=====用例后置脚本=====")def demo(login_fixture):print("=====执行测试用例中=====")if __name__ == '__main__':#自动化测试框架中夹具是如何运行的"""1、框架初始运行时,会对所有夹具进行收集,2、检测用例中是否使用到了夹具,若,则去夹具列表中查询同名的测试夹具3、存在同名测试夹具,,先执行夹具的前置,再执行测试用例,最后执行夹具的后置脚本"""##检测函数中定义的参数res = signature(demo).parametersprint(res)#OrderedDict([('login_fixture', <Parameter "login_fixture">)])params = list(res.keys())print(params)#['login_fixture']#判断参数中是否有同名的测试夹具#for key in params:#	pass#如果存在对应的测试夹具,先执行夹具的前置脚本f1 = login_fixture()res = next(f1)#再执行测试用例demo(res)#最后执行夹具的后置脚本try:next(f1)except StopIteration:pass

6、生成器的内置方法

  • close方法:关闭生成器,关闭后无法再生成数据了
def work():print("-------------1--------------")s1 = yield 1print("-------------2--------------s1=",s1)s2 = yield 2print("%%%%%%%%%%%%%%%%%%%%%%%%%%%%s2=",s2)yield 3res = work()
print(next(res))
res.close()
print(next(res))
  • send方法:和内置函数next一样,用来生成数据;但是send方法可以再生成数据的同时和生成器内部进行数据交换
    • 使用send方法之前,必须先通过next去生成至少一次数据(通过next去启动生成器)
    • send方法必须要传一个参数(值)且只能传一个
    • send方法传入的值,会传到生成器内部上一次,挂起的yield处
def work():print("-------------1--------------")s1 = yield 1print("-------------2--------------s1=",s1)s2 = yield 2print("%%%%%%%%%%%%%%%%%%%%%%%%%%%%s2=",s2)yield 3res = work()
print(next(res))
print(res.send('test1'))#执行时先返回已定义的数据
print(res.send('test'))

结果:
image.png

  • 主动生成器内部抛出异常(了解)
    • 当调用 generator.throw(exc_type, exc_value, traceback) 时,会在生成器内部当前暂停的位置引发一个异常。生成器会尝试捕获这个异常,并在适当的位置执行相应的异常处理逻辑。如果生成器内部没有捕获到这个异常,或者异常处理逻辑中抛出了新的异常,那么这个异常会传播到生成器的调用处。
    • 相当于在生成器内部上一次挂起的位置,执行raise,抛出异常
generator.throw(exc_type, exc_value=None, traceback=None)- exc_type 表示要抛出的异常类型。- exc_value 表示异常的值,默认为 None- traceback 表示异常的回溯信息,默认为 None

PS:
回溯(traceback)信息是指当程序出现异常时,系统会生成一份包含异常发生位置及调用栈信息的报告。这份报告就是回溯信息。
回溯信息通常包含以下内容:

  • 异常类型(Exception Type):表示引发异常的类型,例如TypeError、ValueError等。
  • 异常值(Exception Value):表示异常的具体信息,通常是一个字符串,描述了异常的原因或相关信息。
  • 回溯栈(Traceback Stack):表示调用栈信息,即异常发生时代码的执行路径,从最内部的函数或方法开始,逐步向外展示调用关系。

回溯信息可以帮助开发者追踪和定位异常发生的位置,以及异常抛出时的上下文信息。
在generator.throw()方法中,如果提供了回溯信息(traceback参数),那么该信息将包含在生成器捕获的异常中,使得异常的回溯信息更加完整。如果没有提供回溯信息,则系统会自动生成默认的回溯信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/716453.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯题练习:平地起高楼

题目要求 function convertToTree(regions, rootId "0") {// TODO: 在这里写入具体的实现逻辑// 将平铺的结构转化为树状结构&#xff0c;并将 rootId 下的所有子节点数组返回// 如果不存在 rootId 下的子节点&#xff0c;则返回一个空数组}module.exports convert…

网络防御保护——课堂笔记

一.内容安全 攻击可能只是一个点&#xff0c;防御需要全方面进行 IAE引擎 DFI和DPI技术 --- 深度检测技术 DPI ---深度包检测技术 ---主要针对完整的数据包&#xff08;数据包分片&#xff0c;分段需要重组&#xff09;&#xff0c;之后对数据包的内容进行识别。&#xff08;应…

ifcplusplus 示例 函数中英文 对照分析以及流程图

有需求&#xff0c;需要分析 ifc c渲染&#xff0c;分析完&#xff0c;有 230个函数&#xff0c;才能完成一个加载&#xff0c;3d加载真的是大工程&#xff01; 示例代码流程图 函数中英文对照表&#xff0c;方便 日后开发&#xff0c;整理思路顺畅&#xff01;&#xff01;&am…

C++三级专项 digit函数

在程序中定义一函数dight(n,k),他能分离出整数n从右边数第k个数字。 输入 正整数n和k。 输出 一个数字。 输入样例 31859 3 输出样例 8解析&#xff1a;递归&#xff0c;详情看code. 不准直接抄&#xff01;&#xff01;&#xff01; #include <iostream> usin…

包装类和综合练习

包装类 基本数据类型对应的应用类型。 jdk5以后对包装类新增了&#xff1a;自动拆箱、自动装箱 我们以后如何获取包装类对象&#xff1a; 不需要new,不需要调用方法&#xff0c;直接赋值即可 package MyApi.a09jdkdemo;public class A_01IntergerDemo1 {public static voi…

C语言——指针的进阶——第1篇——(第26篇)

坚持就是胜利 文章目录 一、字符指针1、面试题 二、指针数组三、数组指针1、数组指针的定义2、&数组名 VS 数组名3、数组指针的使用&#xff08;1&#xff09;二维数组传参&#xff0c;形参是 二维数组 的形式&#xff08;2&#xff09;二维数组传参&#xff0c;形参是 指针…

【RT-Thread应用笔记】英飞凌PSoC 62 + CYW43012 WiFi延迟和带宽测试

文章目录 一、安装SDK二、创建项目三、编译下载3.1 编译代码3.2 下载程序 四、WiFi测试4.1 扫描测试4.2 连接测试 五、延迟测试5.1 ping百度5.2 ping路由器 六、带宽测试6.1 添加netutils软件包6.2 iperf命令参数6.3 PC端的iperf6.4 iperf测试准备工作6.5 进行iperf带宽测试6.6…

未来三年AI的深度发展:AIGC、视频AI与虚拟世界构建

人工智能&#xff08;AI&#xff09;正站在科技演进的前沿&#xff0c;未来三年将见证其在多领域实现更深层次的突破。以下是对AI发展方向的深度探讨以及其对各行业的深远影响&#xff1a; 1. AIGC的演进与全面提升&#xff1a; AIGC&#xff0c;即AI通用性能力&#xff0c;将…

AI前沿-YOLOV9算法

AI前沿-YOLOV9算法 关注B站查看更多手把手教学&#xff1a; 肆十二-的个人空间-肆十二-个人主页-哔哩哔哩视频 (bilibili.com) 今天我们来一起说下最近刚出的YOLOV9算法 论文和源码 该算法的原始论文地址为&#xff1a;https://arxiv.org/abs/2402.13616 该算法的原始代码地…

Muduo库编译学习(1)

1.muduo库简介 muduo是由Google大佬陈硕开发&#xff0c;是一个基于非阻塞IO和事件驱动的现代C网络库&#xff0c;原生支持one loop per thread这种IO模型&#xff0c;该库只支持Linux系统&#xff0c;网上大佬对其褒贬不一&#xff0c;作为小白用来学习就无可厚非了。 git仓库…

b站小土堆pytorch学习记录——P14 torchvision中的数据集使用

文章目录 一、前置知识如何查看torchvision的数据集 二、代码&#xff08;附注释&#xff09;及运行结果 一、前置知识 如何查看torchvision的数据集 &#xff08;1&#xff09;打开官网 https://pytorch.org/ pytorch官网 &#xff08;2&#xff09;打开torchvision 在Do…

Linux:top显示信息

简介 top命令是Linux系统中常用的性能监控工具&#xff0c;它可以实时显示系统中各个进程的CPU使用情况以及其他系统资源的使用情况。当您在终端中运行top命令时&#xff0c;它会显示一个实时更新的列表。 CPU相关的信息 CPU状态&#xff1a; us&#xff08;user&#xff09…

梯度和梯度损失

梯度主要用于计算图像融合过程中的梯度损失&#xff0c;对应的损失函数是梯度损失&#xff08;loss_grad&#xff09;。 梯度的作用&#xff1a; 图像的梯度是指图像中每个像素的灰度变化率&#xff0c;通常用于表示图像的边缘和纹理信息。在图像融合任务中&#xff0c;通过计算…

Unity游戏输入系统(新版+旧版)

使用新版还是旧版 旧版 using System.Collections; using System.Collections.Generic; using UnityEngine;public class c5 : MonoBehaviour {void Start(){}void Update(){// 注意要在游戏中 点鼠标键盘进行测试// 鼠标// 0左键 1右键 2滚轮if (Input.GetMouseButtonDown(0)…

【javaSE-语法】lambda表达式

【javaSE-语法】lambda表达式 1. 先回忆一下&#xff1a;1.1 接口不能直接通过关键字new进行实例化1.2 函数式接口1.3 匿名内部类1.31 匿名内部类在代码中长啥样&#xff1f;1.32 构造一个新的对象与构造一个扩展了某类的匿名内部类的对象&#xff0c;两者有什么区别&#xff1…

maven--->maven中的<properties>属性有什么作用?

&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c; 在Maven中&#xff0c;元素用于定义项目中可重用的属性值。这些属性值可以在项目的POM文件中被引用&#xff0c;以便在整个项目中统一管理和使用。通过使用元素&#xff0c;可以避免在POM文件…

SpringBean生命周期之InitializingBean,初始化bean

1 yml文件 weixin:appid: aaaaaapartner: 12313214partnerkey: ccccccert: C:\\Users\\lenovo\\Desktop 2 Bean初使化 import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; import org.springframewor…

midjourney提示词语法

更高级的提示可以包括一个或多个图像URL、多个文本短语和一个或更多个参数 Image Prompts 可以将图像URL添加到提示中&#xff0c;以影响最终结果的样式和内容。图像URL总是位于提示的前面。 https://docs.midjourney.com/image-prompts Text Prompt 要生成的图像的文本描述。…

YOLOv6、YOLOv7、YOLOv8网络结构图(清晰版)

承接上一篇博客&#xff1a;YOLOv3、YOLOv4、YOLOv5、YOLOx的网络结构图(清晰版)_yolox网络结构图-CSDN博客 1. YOLOv6网络结构图 2. YOLOv7网络结构图 3. YOLOv8网络结构图

搭建 LNMP 架构

一 理论知识 &#xff08;一&#xff09;架构图 &#xff08;二&#xff09;CGI 由来 最早的Web服务器只能简单她响应浏览器发来的HTTP请求&#xff0c;并将存储在服务器上的HTML文件返回给浏览器&#xff0c;也就是静态html文件&#xff0c;但是后期随着网站功能增多网站开…