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语言——指针的进阶——第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…

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…

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…

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;但是后期随着网站功能增多网站开…

c++阶梯之模板初阶

1. 泛型编程 void Swap(int& x, int& y) {int tmp x;x y;y tmp; }void Swap(double& x, double& y) {double tmp x;x y;y tmp; }void Swap(char& x, char& y) {char tmp x;x y;y tmp; } int main() {int a 10, b 20;double c 1.1, d 2.2…

《Spring Security 简易速速上手小册》第7章 REST API 与微服务安全(2024 最新版)

文章目录 7.1 保护 REST API7.1.1 基础知识详解7.1.2 重点案例&#xff1a;使用 JWT 进行身份验证和授权案例 Demo 7.1.3 拓展案例 1&#xff1a;API 密钥认证案例 Demo测试API密钥认证 7.1.4 拓展案例 2&#xff1a;使用 OAuth2 保护 API案例 Demo测试 OAuth2 保护的 API 7.2 …

linux安装matlab获取许可证

1.点击许可证 2. 3. 4. 4.主机ID 打开linux输入 /sbin/ifconfigether后边的就是 6.计算机登录名 打开linux输入 whoami7. 8. 9.

(规划)24届春招和25届暑假实习路线准备规划

春招&&暑假实习&#xff1a; 1.八股&#xff1a; 可以去一些八股网站上面进行阅读。 2.项目&#xff1a;至少准备1-2个项目&#xff0c;可以条理清晰的进行项目介绍和难点剖析。 3.算法&#xff1a; hot100 &#xff0c;剑指offer 能刷的很熟&#xff0c;算法关就差…

我的相关奖项

博士录取证明 名单第53&#xff1a;https://yzb.bupt.edu.cn/content/content.php?p2_2_651 论文链接 第一篇&#xff1a;https://doi.org/10.1186/s13677-022-00373-8 第二篇&#xff1a;https://doi.org/10.1016/j.ipm.2022.103167 第三篇&#xff1a;https://doi.org/10…

Unity 脚本-生命周期常用函数

在Unity中&#xff0c;万物皆是由组件构成的。 右键创建C&#xff03;脚本&#xff0c;拖动脚本到某物体的组件列表。 生命周期相关函数 using System.Collections; using System.Collections.Generic; using UnityEngine;// 必须要继承 MonoBehaviour 才是一个组件 // 类名…

matplotlib——散点图和条形图(python)

散点图 需求 我们获得北京2016年三月和十月每天白天最高气温&#xff0c;我们现在需要找出气温随时间变化的某种规律。 代码 # 导入库 from matplotlib import pyplot as plt import random# 解决中文乱码 import matplotlib matplotlib.rc("font",family"F…

领域驱动设计(Domain-Driven Design DDD)——战略设计1

一、概述 随着系统的增长&#xff0c;它会越来越复杂&#xff0c;当我们无法通过分析对象来理解系统的时候&#xff0c;就需要掌握一些操纵和理解大模型的技术了。 最负雄心的企业欲实现一个涵盖所有业务、紧密集成的系统。因大型公司的业务模型巨大且复杂&#xff0c;很难把它…