SOP/详解*和**/python数据结构(iter,list,tuple,dict)/ 解包
一、错误解决合集
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.区分:
__iter__()
:
__iter__()
是一个特殊的方法名,用于在 Python 类中定义一个对象的迭代器。当我们在一个类中定义了__iter__()
方法时,这个类的实例就成为了可迭代的对象,即支持迭代操作。
__iter__()
方法应该返回一个迭代器对象,通常是 self 本身,或者是实现了__next__()
方法的对象。这个迭代器对象可以用于在 for 循环中遍历对象的元素。iter()
:
iter()
是一个内置函数,在 Python 中用于获取一个可迭代对象的迭代器。它的参数可以是任何可迭代对象,比如列表、元组、集合、字典等。
iter()
函数返回指定对象的迭代器。如果对象本身已经实现了__iter__()
方法,iter()
函数会直接调用该方法来获取迭代器;否则,它会尝试使用其他方式创建一个迭代器,例如对于序列类型,返回一个索引逐个遍历元素的迭代器。
具体过程如下:
首先,iter() 函数会检查传入的对象是否实现了 iter() 方法。如果该对象有实现 iter() 方法,那么 iter() 函数会调用该方法,将返回的迭代器对象作为结果返回。
如果对象没有实现 iter() 方法,iter() 函数会尝试查找对象是否实现了 getitem() 方法。如果对象有实现 getitem() 方法,那么 iter() 函数会创建一个简单的索引迭代器,通过索引逐个访问对象的元素。
如果对象既没有实现 iter() 方法,也没有实现 getitem() 方法,那么 iter() 函数会抛出 TypeError,表示该对象不可迭代。
四、详解*与**,*args,**kargs
*args,**kargs:
前置知识提要:
-
list 是有序可变的数据类型,元素在列表中的顺序由其添加的顺序决定。用
.append
添加。列表一般不会作为参数直接传入。
dict 是无序可变的数据类型,元素以键-值对的形式存储。有序的dict称为collections.OrderedDict
。直接添加dic["w"] = 2
tuple是有序不可变的数据类型。 -
函数的参数可以分为两种类型:位置参数和关键字参数。位置参数按照定义时的顺序进行传递,并且每个参数的值与传入时的位置一一对应。关键字参数在函数调用时指定了参数的名称,并且可以在任意顺序下传递。
通过上述的数据结构特性,可以得出,作为函数参数时:
*
用于收集和传递位置参数,返回类型为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里的缩进。。。
相关文章:

SOP/详解*和**/python数据结构(iter,list,tuple,dict)/ 解包
一、错误解决合集 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”…...

使用webdriver-manager解决浏览器与驱动不匹配所带来自动化无法执行的问题
1、前言 在我们使用 Selenium 进行 UI 自动化测试时,常常会因为浏览器驱动与浏览器版本不匹配,而导致自动化测试无法执行,需要手动去下载对应的驱动版本,并替换原有的驱动,可能还会遇到跨操作系统进行测试的时候&…...
【vue】Vue中debugger报错 unexpected ‘debugger’ statement no-debugger
前言: Vue中debugger报错 unexpected ‘debugger’ statement no-debugger (意外的“调试器”语句没有调试器) eslink规则没有开启’debugger’ ,被规则屏蔽了,需要手动放开 解决方法 方式一: 找到.esl…...
课题方向a
首先在无线感知的研究方向下,辅以深度学习和计算机视觉的技术和知识,可以从事哪些具体课题的研究?请你尽可能多的给出课题名称供我选择 在无线感知的研究方向下,辅以深度学习和计算机视觉的技术,有很多具体课题可以进行研究。以下是一些供您选择的课题名称: 基于深度学习…...

【Matter】基于Ubuntu 22.04 交叉编译chip-tool
编译工程之际,记录一下编译过程,免得后续遗忘,总结下来chip-tool 交叉编译涉及到的知识点: 需要了解如何支持交叉编译,基于GN编译框架需要理解应用库如何交叉编译,理解pkg-config的使用meson 编译…...

Qt/C++音视频开发50-不同ffmpeg版本之间的差异处理
一、前言 ffmpeg的版本众多,从2010年开始计算的项目的话,基本上还在使用的有ffmpeg2/3/4/5/6,最近几年版本彪的比较厉害,直接4/5/6,大版本之间接口有一些变化,特别是一些废弃接口被彻底删除了,…...

低碳 Web 实践指南
现状和问题 2023年7月6日,世界迎来有记录以来最热的一天。气候变化是如今人类面临的最大健康威胁。据世界卫生组织预测2030年至2050年期间,气候变化预计每年将造成约25万人死亡。这是人们可以真切感受到的变化,而背后的主要推手是碳排放。 …...

信息安全:网络安全体系 与 网络安全模型.
信息安全:网络安全体系 与 网络安全模型. 网络安全保障是一项复杂的系统工程,是安全策略、多种技术、管理方法和人员安全素质的综合。一般而言,网络安全体系是网络安全保障系统的最高层概念抽象,是由各种网络安全单元按照一定的规…...

【云原生】Serverless 技术架构分析
一、什么是Serverless? 1、Serverless技术简介 Serverless(无服务器架构)指的是由开发者实现的服务端逻辑运行在无状态的计算容器中,它由事件触发, 完全被第三方管理,其业务层面的状态则被开发者使用的数据库和存…...
Visual Studio Code 设置文件头部添加作者、日期和函数注释
step1:安装插件KoroFileHeader step2:左下角选择管理—设置—输入"fileheader"—点击"在setting.json中编辑" step3:添加下面的代码到json文件中 // 文件头部注释 "fileheader.customMade": {"Descripttion":"","ve…...

HCIA云计算 V5.0题库
云计算,这是近几年听得最多词了,云计算对于网络的发展帮助非常大,它自身所产生的价值是不可估量的!所以云计算的岗位对于很多IT公司来说,都是有一定地位的。华为认证云计算面向的对象很简单就是对云计算技术感兴趣的人…...
基于Matlab实现帧间差分法的运动目标检测(附上完整源码+图像+程序运行说明)
帧间差分法是一种常用的运动目标检测方法,可以通过对连续帧之间的差异进行分析来确定目标的运动情况。在本文中,我们将介绍如何使用Matlab实现帧间差分法的运动目标检测。 文章目录 部分源码完整源码图像程序运行说明下载 部分源码 首先,我们…...

Jenkins搭建最简教程
纠结了一小会儿,到底要不要写这个,最终还是决定简单记录一下,因为Jenkins搭建实在是太简单了,虽然也有坑,但是坑主要在找稳定的版本上。 先学一个简称,LTS (Long Term Support) 属实是长见识了,…...

设置git可以同时推送gitee和github
查看当前的远程仓库设置: git remote -v 这会列出你当前配置的远程仓库。你可能会看到类似以下的输出:origin-gitee <gitee仓库地址> (fetch)origin-gitee <gitee仓库地址> (push) 新增一个远程仓库 git remote add origin-github <githu…...
Java给Excel设置单元格格式
maven 依赖 <!--读取excel文件--> <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.3</version> </dependency> <dependency><groupId>org.apache.poi</group…...

__block的深入研究
__block可以用于解决block内部无法修改auto变量值的问题 __block不能修饰全局变量、静态变量(static) 编译器会将__block变量包装成一个对象 调用的是,从__Block_byref_a_0的指针找到 a所在的内存,然后修改值 第一层拷贝&…...

Segment anything(图片分割大模型)
目录 1.Segment anything 2.补充图像分割和目标检测的区别 1.Segment anything 定义:图像分割通用大模型 延深:可以预计视觉检测大模型,也快了。 进一步理解:传统图像分割对于下图处理时,识别房子的是识别房子的模型…...

【雕爷学编程】MicroPython动手做(27)——物联网之掌控板小程序3
知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…...

Java中集合容器详解:简单使用与案例分析
目录 一、概览 1.1 Collection 1. Set 2. List 3. Queue 1.2 Map 二、容器中的设计模式 迭代器模式 适配器模式 三、源码分析 ArrayList 1. 概览 2. 扩容 3. 删除元素 4. 序列化 5. Fail-Fast Vector 1. 同步 2. 扩容 3. 与 ArrayList 的比较 4. 替代方案…...

机器学习04-数据理解之数据可视化-(基于Pima数据集)
什么是数据可视化? 数据可视化是指通过图表、图形、地图等视觉元素将数据呈现出来的过程。它是将抽象的、复杂的数据转化为直观、易于理解的视觉表达的一种方法。数据可视化的目的是帮助人们更好地理解数据,从中发现模式、趋势、关联和异常,从而作出更明…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...