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 1
	print("%%%%%%%%%%%%%%%%%%%%%%%%%%%%")
	yield 2

res = 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 token

	print("=====用例后置脚本=====")

def test_demo(login_fixture):
	print("=====执行测试用例中=====")

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

from inspect import signature


def login_fixture():
	print("=====用例前置脚本=====")
	token = 'xxxxxxxx'

	yield token

	print("=====用例后置脚本=====")


def demo(login_fixture):
	print("=====执行测试用例中=====")


if __name__ == '__main__':
	#自动化测试框架中夹具是如何运行的
	"""
	1、框架初始运行时,会对所有夹具进行收集,
	2、检测用例中是否使用到了夹具,若,则去夹具列表中查询同名的测试夹具
	3、存在同名测试夹具,,先执行夹具的前置,再执行测试用例,最后执行夹具的后置脚本
	"""

	##检测函数中定义的参数
	res = signature(demo).parameters
	print(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 1
	print("-------------2--------------s1=",s1)
	s2 = yield 2
	print("%%%%%%%%%%%%%%%%%%%%%%%%%%%%s2=",s2)
	yield 3

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

res = 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参数),那么该信息将包含在生成器捕获的异常中,使得异常的回溯信息更加完整。如果没有提供回溯信息,则系统会自动生成默认的回溯信息。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux文本处理三剑客:awk(常用匹配模式)

在Linux操作系统中&#xff0c;grep、sed、awk被称为文本操作“三剑客”&#xff0c;上三期中&#xff0c;我们将详细介绍grep、sed、awk的基本使用方法&#xff0c;希望能够帮助到有需要的朋友。 1、前言 awk作为一门编程语言还有很多内容&#xff0c;我们继续学习awk。 网…

快速解决maven依赖冲突

我们在开发过程中经常出现maven依赖冲突&#xff0c;或者maven版本不匹配的情况&#xff0c;我们可以使用阿里云原生脚手架来做maven管理&#xff0c;添加需要的组件&#xff0c;然后点击获取代码&#xff0c;就可以获得对应的依赖文件。

【C语言】InfiniBand驱动mlx4_init和mlx4_cleanup

一、中文注释 Linux内核模块的初始化和清理过程&#xff0c;针对一个称为mlx4的网络设备驱动。以下是代码的逐行中文注释&#xff1a; static int __init mlx4_init(void) {int ret;if (mlx4_verify_params())return -EINVAL; // 检查设备参数是否有效&#xff0c;无效则返回…

.idea文件详解

.idea文件的作用&#xff1a; .idea文件夹是存储IntelliJ IDEA项目的配置信息&#xff0c;主要内容有IntelliJ IDEA项目本身的一些编译配置、文件编码信息、jar包的数据源和相关的插件配置信息。一般用git做版本控制的时候会把.idea文件夹排除&#xff0c;因为这个文件下保存的…

ABAP - SALV教程08 列设置热点及绑定点击事件

实现思路&#xff1a;将列设置成热点&#xff0c;热点列是可点击的&#xff0c;再给SALV实例对象注册点击事件即可&#xff0c;一般作用于点击单号跳转到前台等功能 "设置热点方法METHODS:set_hotspot CHANGING co_alv TYPE REF TO cl_salv_table...."事件处理方法M…

OSCP靶场--Hepet

OSCP靶场–Hepet 考点(1.邮件获取 2.msf恶意宏文档制作 3. 邮件投递恶意宏文档 4.服务配置不当提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC -p- 192.168.188.140 --min-rate 2000 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-01 05:46 ES…

【网上商城系统的设计与开发】

目录 1.实训概况 1 1.1 实训题目 1 1.2实训时间 1 1.3实训目的 1 1.4 实训环境 1 1.5 实训内容 2 1.6 进度安排 3 2.需求分析 5 2.1 功能需求分析 5 2.1.1用户需求分析 5 2.2.2网站前台需求 5 2.2.3网站后台需求 6 2.2 可行性分析 7 2.2.1社会可行性 7 2.2.2技术可行性 8 3.系统…

通过多进程并发方式(fork)实现服务器(注意要回收子进程)

以下内容为视频学习记录。 1、父进程accept后返回的文件描述符为cfd以及用于创建连接的lfd; 调用fork()创建子进程后&#xff0c;子进程继承cfd,lfd&#xff0c;通过该cfd与连接过来的客户端通信,lfd对子进程来说没用&#xff0c;可以直接close(lfd); 对于父进程来说&#x…

如何利用ChatGPT搞科研?论文检索、写作、基金润色、数据分析、科研绘图(全球地图、植被图、箱型图、雷达图、玫瑰图、气泡图、森林图等)

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

2023天津公租房网上登记流程图,注册到信息填写

2023年天津市公共租赁住房网上登记流程图 小编为大家整理了天津市公共租赁住房网上登记流程&#xff0c;从登记到填写信息。 想要体验的朋友请看一下。 申请天津公共租赁住房时拒绝申报家庭情况会怎样&#xff1f; 天津市住房保障家庭在享受住房保障期间&#xff0c;如在应申…

安装 node 错误的配置环境变量之后使用 npm 报错,更换淘宝镜像 (cnpm)

安装 node 错误的配置环境变量之后使用 npm 报错&#xff0c;更换淘宝镜像 (cnpm) node:internal/modules/cjs/loader:1147 throw err; ^ Error: Cannot find module ‘F:\ACodeTools\Node\node_modules\npm\bin\node_modules\npm\bin\npm-cli.js’ at Module._resolveFilename…

JVM(6)

JMM JVM定义了一种Java内存模型来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果.在此之前,C/C直接使用物理硬件和操作系统的内存模型,因此,会由于不同平台下的内存模型差异,有可能导致程序在一套平台上并发完全正常,而在另…

多输入多输出 | MATLAB实现GWO-Elman灰狼优化循环神经网络多输入多输出预测

多输入多输出 | MATLAB实现GWO-Elman灰狼优化循环神经网络多输入多输出预测 目录 多输入多输出 | MATLAB实现GWO-Elman灰狼优化循环神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 Matlab实现GWO-Elman灰狼优化循环神经网络多输入多输出…

手把手教测试,全网内容最全有深度-jmeter-Flow Control Action

5.1.7.6.Flow Control Action(测试活动) Logical Action on Thread&#xff1a; Pause 暂停&#xff0c;配合 Duration 一起使用&#xff1b;Duration(milliseconds) 延迟时间&#xff0c;单位是毫秒 Start Next Thread Loop 开始本线程下一次循环 设置线程组线程数2&#xff…

(资源篇)2025届暑假实习春招全攻略路线

绝对的全攻略&#xff0c;资源完善程度绝对的全网唯一。 觉得有帮助的&#xff1a;随手一键三连关注就是对up主最大的激励。 绝对的宝藏up主&#xff01;&#xff01;&#xff01;&#xff0c;up主每天都会进行更新视频&#xff0c;算法视频or校招信息or八股讲解。 【暴躁老…

位运算第二弹

力扣191.位1的个数 public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n) {int ret0;while(n!0){n(n&n-1);ret;}return ret;} } 推荐是自己去手动推一下&#xff0c;深刻理解一下&#xff0c;什么叫做最右侧的1。 力扣338.…

在docker中搭建selenium 爬虫环境(3分钟快速搭建)

1、安装docker 省略 2、拉取镜像 docker pull selenium/standalone-chrome-debug 3、运行容器 docker run -d -p 4444:4444 -p 5900:5900 -v C:\Users\Public\VNC_Donwnloads:/home/seluser/Downloads --memory6g --name selenium_chrome selenium/standalone-chrome-debu…

[VulnHub靶机渗透] CONNECT THE DOTS

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

《秦时明月》IP新高度:与陕西历史博物馆共同书写文化传承新篇章!

在IP产业风起云涌的今天&#xff0c;如何以创意和匠心为传统文化注入新的活力&#xff0c;成为了摆在每一位文化工作者面前的重要课题。近日&#xff0c;《秦时明月》作为一部深受观众喜爱的国产动画IP&#xff0c;在迎来其十七周年之际&#xff0c;联手陕西历史博物馆&#xf…

字符函数和字符串函数(下)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 目录 strncpy函数的使用 函数原型&#xff1a; strncpy的使用 strncat函数的使用 函数原型&#xff1a; strncat的使用 strncmp函数的使用 函…