SOP/详解*和**/python数据结构(iter,list,tuple,dict)/ 解包

news2024/10/5 14:14:29

一、错误解决合集

1. 在这里插入图片描述
====> combined_seq.named_children()
2.
isinstance 2th parameter : must be a type or tuple of types ====> 改为tuple,不要用列表。改为 LLLayer = (nn.Conv2d,nn.Linear)

3.
File “test.py”, line 90, in calculate_fin_fout
print(“hi”, seq[k].weight.shape[0], layers_fin_fout[“fout”][module])
KeyError: ScaledNeuron(
(neuron): IFNode(
v_threshold=1.0, v_reset=None, detach_reset=False
(surrogate_function): Sigmoid(alpha=1.0, spiking=True)
)
)
KeyError:
试图在字典中查找不存在的
试图通过属性访问或键索引获取对象的属性或字典中的键,但对象或字典中不存在这样的键或属性。
可能在使用类似字典的数据结构时,由于使用了无效的键或索引导致查找失败。
这里是键不存在的问题!首先要搞清楚什么是键?layers_fin_fout[“fout”][module]为键。注意:键需要初始化。键在使用之前一定要初始化,一层一层的初始化:

`layers_fin_fout["fout"] = {}
layers_fin_fout["fout"][module] = 0

二、

1、什么是拆包(解包)和封包:
拆包就是将列表(list)、元组(tuple)、字典(dict)三种类型的元素,全部提炼出来的过程;或者是使用变量去接收函数返回值的过程
封包是将多个值赋值给一个变量时,python会自动将这些值封装成元组,这个特性称之为封包;或者函数返回多个值时,也会进行封包
2、拆包的注意事项:
拆包时,接收返回数据的变量一定要与列表(list)、元组(tuple)、字典(dict)中的元素个数相同,否则会导致程序异常

三、数据结构:迭代器和集合的配合

这里的集合指:list,dict,tuple,set

基础

Python 中的集合类和迭代器是两个不同的概念,它们并没有继承关系。Python 中的集合类并不是继承自迭代器接口,而是通过实现特定的协议和方法来支持迭代器行为。在 Python 中,实现了迭代器接口的对象必须具有__iter__()__next__()方法反过来说,在 Python 中,迭代器是一种用于遍历可迭代对象的工具,它提供了 __iter__()__next__() 方法。当一个对象实现了这两个方法时,它就是一个迭代器,可以通过iter()函数获得。 也就是说对象可以支持迭代器行为。
__iter__() 方法返回迭代器对象自身,而 __next__() 方法用于获取迭代器的下一个元素。集合类可以实现这两个方法来支持迭代器行为,使得它们可以被iter()函数返回对应的迭代器,并支持使用 next() 方法来遍历元素。

a.Iterator迭代器

迭代器(Iterator)并不像列表(List)那样可以直接输出(打印)所有元素。迭代器是一种按需生成元素的对象,每次只生成一个元素。要从迭代器中获取元素,必须使用for循环或next()函数逐个获取。

my_iterator = iter([1, 2, 3])
for element in my_iterator:
    print(element)
 # 1, 2,3
my_iterator = iter([1, 2, 3])
print(next(my_iterator))  # 输出:1
print(next(my_iterator))  # 输出:2
print(next(my_iterator))  # 输出:3

b.集合list,dict,tuple,set

集合可以直接print输出。且所有集合实现了 __iter__()__next__() 方法,那么他就是一个可迭代对象。从而,你可以直接隐式的遍历集合,因为他可迭代,实际是调用的内部实现的__iter__()

my_list = [1, 2, 3, 4, 5]
for element in my_list:
    print(element)

当你需要索引时用emumerate函数生成索引,enumerate函数返回的也是一个迭代器(index, content),所以你可以遍历。
所以,综上所述,for 循环的语法是 f o r for for e l e m e n t element element i n in in i t e r a b l e iterable iterable,iterable可以是:

  • 序列类型:例如列表(list)、元组(tuple)、字符串(str)等。
  • 集合类型:例如集合(set)和字典(dict)。
  • 文件对象:例如使用 open() 函数打开的文件对象。
  • 迭代器:例如使用 iter() 函数获得的迭代器。

c.区分:

  1. __iter__()
    __iter__() 是一个特殊的方法名,用于在 Python 类中定义一个对象的迭代器。当我们在一个类中定义了__iter__()方法时,这个类的实例就成为了可迭代的对象,即支持迭代操作。
    __iter__() 方法应该返回一个迭代器对象,通常是 self 本身,或者是实现了 __next__() 方法的对象。这个迭代器对象可以用于在 for 循环中遍历对象的元素。
  2. iter()
    iter() 是一个内置函数,在 Python 中用于获取一个可迭代对象的迭代器。它的参数可以是任何可迭代对象,比如列表、元组、集合、字典等。
    iter() 函数返回指定对象的迭代器。如果对象本身已经实现了 __iter__() 方法,iter() 函数会直接调用该方法来获取迭代器;否则,它会尝试使用其他方式创建一个迭代器,例如对于序列类型,返回一个索引逐个遍历元素的迭代器。
    具体过程如下:
    首先,iter() 函数会检查传入的对象是否实现了 iter() 方法。如果该对象有实现 iter() 方法,那么 iter() 函数会调用该方法,将返回的迭代器对象作为结果返回。
    如果对象没有实现 iter() 方法,iter() 函数会尝试查找对象是否实现了 getitem() 方法。如果对象有实现 getitem() 方法,那么 iter() 函数会创建一个简单的索引迭代器,通过索引逐个访问对象的元素。
    如果对象既没有实现 iter() 方法,也没有实现 getitem() 方法,那么 iter() 函数会抛出 TypeError,表示该对象不可迭代。

四、详解*与**,*args,**kargs

*args,**kargs:

前置知识提要:

  1. list 是有序可变的数据类型,元素在列表中的顺序由其添加的顺序决定。用.append添加。列表一般不会作为参数直接传入。
    dict 是无序可变的数据类型,元素以键-值对的形式存储。有序的dict称为collections.OrderedDict。直接添加dic["w"] = 2
    tuple是有序不可变的数据类型。

  2. 函数的参数可以分为两种类型:位置参数和关键字参数。位置参数按照定义时的顺序进行传递,并且每个参数的值与传入时的位置一一对应。关键字参数在函数调用时指定了参数的名称,并且可以在任意顺序下传递。

通过上述的数据结构特性,可以得出,作为函数参数时:

  • * 用于收集和传递位置参数,返回类型为tuple(追求有序不可变)
  • ** 用于收集和传递关键字参数,返回类型为dict(追求无序)
def f(*args, **kargs):
    pass
f(1,2,3, Name='xx', age='yy')
# args = (1,2,3)
# kargs = {'Name': xx, 'age': yy}

* & ** 的其他用法

在函数调用或列表拼接等情况下,* 号可以用于解包列表。

my_list = [1, 2, 3]
print(*my_list)
# 1 2 3

*my_list 将会把列表 my_list 中的元素解包,作为单独的参数传递给print()函数。这样,print(*my_list) 就等价于 print(1, 2, 3)

按照上面的思想我们可以完成下面的代码:
children()返回的是iterator,用list()转为转为列表相加。
nn.Sequential接受的参数必须是nn.Module的子类,也就是说你不能把一个列表传给这个类,[nn.ReLU,nn.linear…]
torch.nn.Sequential(*args: Module),且sequential是有顺序要求的,利用解包操作一个个传入。
解包之后原式 = nn.Sequential(nn.ReLU,nn.linear.....)

combined_seq = nn.Sequential()
snn_model = model
for name, module in snn_model.named_modules():
   if isinstance(module, nn.Sequential):
    combined_seq = nn.Sequential(*(list(combined_seq.children()) + list(module.children())))

序列解包运算,也就是把一段不定长数据转换成list,注意这里不是tuple了,而是List

a, b, *c = 1,2,3,4
#c:[3,4]

四、

注意缩进。尤其在Python里的缩进。。。

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

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

相关文章

Python生成自定义URL二维码并保存为图片文件

脚本简介描述: 我们的应用场景是网站提供了Android客户端的二维码,可以进行扫码直接下载。所以使用下方的脚本可以自动生成URL路径二维码,并保存到指定路径下展示在网站上。 代码展示 PS:主要用到了 qrcode第三方模块 [rootnod…

Flask-SocketIO

一、简介: Flask-SocketIO使Flask应用程序可以实现客户端和服务器之间的低延迟双向通信。客户端应用程序可以使用 Javascript、Python、C、Java和Swift中的任何SocketIO客户端库或任何其他兼容客户端来建立与服务器的永久连接。 二、安装: pip instal…

java高并发系列 - 第22天:JUC底层工具类Unsafe

java高并发系列 - 第22天:JUC底层工具类Unsafe 这是java高并发系列第22篇文章,文章基于jdk1.8环境。 本文主要内容 Unsafe基本介绍获取Unsafe实例Unsafe中的CAS操作Unsafe中原子操作相关方法介绍Unsafe中线程调度相关方法介绍park和unpark示例Unsafe锁示例Unsafe中对volati…

window安装mysql

1、下载mysql 官网下载地址:MySQL :: Download MySQL Community Server 国内阿里云镜像下载地址:mysql镜像_mysql下载地址_mysql安装教程-阿里巴巴开源镜像站 2、安装 我下载的是mysql-5.7.36-winx64.msi安装版本 选择安装类型: 选择安装位…

【测试设计】性能测试工具选择:wrk?jmeter?locust?还是LR?

目录 前言 wrk 优点 缺点 jmeter 优点 缺点 locust 优点 缺点 总结 资料获取方法 前言 当你想做性能测试的时候,你会选择什么样的测试工具呢?是会选择wrk?jmeter?locust?还是loadrunner呢? 今…

台式机/工控机通过网线共享笔记本电脑无线网络(待续)

1、 将台式机通过网线和笔记本连接。 2、 将笔记本的“本地连接”和“无线网络连接”的ipv4均设置为自动获取。 4.修改台式机的IP地址为如下(对应笔记本信息) IP地址为192.168.XXX.12 子网掩码为255.255.255.0 默认网关为192.168.XXX.1 首选DNS为192.16…

蓝桥云课ROS机器人旧版实验报告-06工业机械臂-使用Moveit!

项目名称 实验六 使用MoveIt! 成绩 内容:机械臂、体系结构、简单运动规划、抓取放置任务 实验记录(70分) 按实验一完成升级配置。 如果需要查阅moveit详细资料,参考如下官网截图: 本实验需要安装…

python面试题【题目+答案】

最近遇到了一份python的面试题,题目比较简单,时间控制在一个小时之内。以下是面试的题目跟答案,答案不代表最优解,只是当时所想到的一些思路,接下来将分享给大家。 1. 给出下面打印结果 答案: 12.0 6.0…

二叉树OJ(C)

文章目录 1.单值二叉树1.1法一:无返回值1.2法二:有返回值 2.相同的树3.对称二叉树4.二叉树的前序遍历5.二叉树的中序遍历6.二叉树的后序遍历7.另一棵树的子树8.二叉树遍历 1.单值二叉树 1.1法一:无返回值 struct TreeNode {int val;struct …

从国内最早的开放银行说起...

在银行技术部门工作的这几年,频繁听到「开放银行」这个概念。 "开放银行"一词是指通过应用编程接口(API)在各方之间共享财务数据的业务模式,包括金融服务提供商(银行、保险公司、零售商等)之间、…

Excel·VBA定量装箱、凑数值金额、组合求和问题

如图:对图中A-C列数据,根据C列数量按照一定的取值范围,组成一个分组装箱,要求如下: 1,每箱数量最好凑足50,否则为47-56之间; 2,图中每行数据不得拆分; 3&…

数据结构--动态顺序表

文章目录 线性表动态顺序表数组与顺序表 接口实现初始化:尾插:尾删头插头删指定位置插入指定位置删除查找摧毁 完整代码 线性表 线性表是数据结构中最基本、最简单也是最常用的一种数据结构。线性表是指由n个具有相同数据类型的元素组成的有限序列。 线…

Kubernetes (k8s)理论介绍

一:K8s 简介 1、K8s作用 2、K8s 来历 3、为什么要用 K8S? 4、Kubernetes 功能 二:Kubernetes 集群架构与组件 1、Kubernetes 集群架构与组件 2、核心组件 -Master 组件 (1)Kube-apiserver (2)Kube…

Wiki知识库项目-全流程笔记

第一章 第二章 2.1本章项目流程 2.2创建springboot项目 2.2.1修改springboot的版本号为 2.4.0 2.2.3将代码交给git进行管理 2-5修改日志样式 2.5.1将springboot项目打印日志样式进行修改。创建logback-spring.xml文件夹,文件与application.xml文件位置并列。 &l…

图书借阅系统 SSM框架

步骤一:创建数据库、表 步骤二:创建工程、包、pom依赖 步骤三:web.xml 步骤四:applicationContext.xml 步骤五:mybatis-config.xml 步骤六:实体类 步骤七:BookInfoMapper 步骤八: 步…

小白到运维工程师自学之路 第六十一集 (docker容器的操作)

1、创建容器与运行容器 docker create -it nginx /bin/bash -i 让容器的输入保持打开 -t 让Docker 分配一个伪终端 -d 守护进程形式运行 使用docker create 命令创建新容器后会返回一个唯一的ID 2、查看运行状态 docker ps -a 可以使用docker ps 命令来查看所有容器的运行状态…

未能加载文件或程序集“System.CodeDom, Version=4.0.2.0。。。或它的某一个依赖项。系统找不到指定的文件

winform未能加载文件或程序集“System.CodeDom, Version4.0.2.0, Cultureneutral, PublicKeyTokencc7b13ffcd2ddd51”或它的某一个依赖项。系统找不到指定的文件。 触发原因解决方法 触发原因 在NuGet中安装IronPython时,由于一直提示缺少依赖,所以在安…

长度最小的子数组_力扣209

文章目录 题目描述法一 滑动窗口法 题目描述 法一 滑动窗口法 int minSubArrayLen(int target, vector<int>&nums){int n nums.size();int cnt INT_MAX;int start0, end0, sum0;while(end<n){sum nums[end];while(sum>target){cnt min(cnt, end-start1);su…

智慧灯杆四大应用场景

智慧灯杆是一种通过集成先进技术和智能系统的道路照明设施。它不仅具备传统灯杆的基本功能&#xff0c;还具有灯具、传感器、通信设备、监控摄像头等多个功能模块。可以实现智能照明、环境监测、安全监控、交通管理等多种功能&#xff0c;为城市的智慧化建设和市民的生活提供更…

html:去除input/textarea标签的拼写检查

默认情况下&#xff0c;textarea 会启动拼写和语法检查&#xff0c;表现效果就是单词拼写错误会出现红色下划线提示 <textarea></textarea>效果 有时&#xff0c;我们并不需要拼写检查&#xff0c;可以通过配置属性spellcheck"false" 去除拼写和语法检…