python如何在循环中为容器添加多个带不同实参的函数?

For循环和append方法合用 开发工具与关键技术: Vs、For循环和append方法合用 作者:木有窝的鸟~小通 撰写时间:2019年7月15日 针对append追加元素来说,一般运用于设置布局,而更多的是append的运用也比较广泛,对于一些简单的div布局,它可能仅限于元素的父元素后边的追加其他子元素(元素的父布局后边的追加其他子布局),而这种单独的使用方式也比较单一。Append()方法呢,它可以运用循环体中,其实它还... 阅读详情

一.起因

前几天给自己写了一个应用,界面的展示用到了python的tkinter,过程中遇到一个问题,我要给界面中的按钮绑定函数,由于按钮较多而功能类似,而且只能绑定没有参数的函数名,可我需要参数。所以我的策略是for循环加lambda函数,lambda函数内调用带参数的长函数,靠for循环的顺序作为参数传入,函数内部映射以实现响应功能。

可惜出现了个bug,那就是添加到列表里的函数,分别调用后都是相同的结果。

将问题聚焦,简化得到如下模型。

二.BUG出现

lst = []
def go(item):
    print(item)
     
for i in range(3):
    lst.append(lambda:go(i))
    
for fn in lst:
    fn()
    
2
2
2

我希望他出现的是0,1,2

如上图,只需要让添加到列表里的每一个匿名函数在调用时,产生的结果都不同就基本成功了。

接下来就是怎么解决了。

三.浅拷贝试试。

import copy
lst = []

def go(item):
    print(item)

for i in range(3):
    buf = copy.copy(i)
    lst.append(lambda :go(buf))

for fn in lst:
    fn()

2
2
2

不得行。(这时lst里每一个函数的内存地址都是不同的,肯定是参数的问题)

随后我反应过来,只要lambda函数里带有变量名i,那么这个函数调用时一定会找到i这个全局变量,而容器里的每一个函数调用结果,势必都会相同。

也就是说只要参数和i有关,就极大可能出错,而如果和i完全无关,那就上游数据都没了,不可能实现功能。

所以想到了局部变量来解决,代码如下。

四.解决方法

lst = []
def go(item):
    print(item)

for i in range(3):
    def go2(i):  # 函数摆在这里理解快,扔上面更好
        lst.append(lambda: go(i))
    go2(i)

for fn in lst:
    fn()


#结果
0
1
2

成功了。

这段看起来是在废话的代码实际上还是挺能办事的,把核心代码函数封装再调用,而且到现在我都没想到第二种方法,事后也在网上找过,没有对这种问题的处理方法。

五.解释

之前的错误是因为每一个添加的函数的实参都指向了同一个全局变量,但我需要的是n个不同的变量,而不是一个。函数内的局部变量可以完美解决这个问题,我们不必关心每次调用go2的局部变量名是什么,尽管看起来都叫i,但在解释器眼里都不同就对了。

在容器中添加带变量名的容器,和直接添加无依赖的变量是不同的。后者很容易在循环里进行添加,而前者如果是在循环中,就必须考虑这个带变量名的容器,其变量指向的内存地址在设计逻辑中是否可变,如果可变,那么不必管。如果不可变,那么最好用局部变量的方式传递。因为解释器已经专为这种只使用一次的变量写好了整个生命周期,一般局部变量会在作用域结束后消亡,但如果你在其消亡前将他给了其他对象作为引用,不怕,解释器有引用计数器去管理内存,只要还有别的对象引用你,这个局部变量的内存地址将会保存给他。

之后问题就解决了,就是这么个小问题扔到项目里就是一百多行的排查,不知道具体症结的时候还以为是类继承修改的时候破坏掉什么东西了,解决完之后真是血脉舒畅。

六.总结

都说函数是为了增加代码复用率,提高扩展性。但其实还有一个重要的作用,就是将全局变量引入到局部变量,解决全局变量双拳难敌四手的问题。

[Python] For循环遍历容器 目录 使用range通过for循环遍历列表 使用range通过for循环遍历元组 使用zip通过for循环遍历列表 通过for循环遍历字典 循环列表时利用enumerate获取索引 使用range通过for循环遍历列表 列表的遍历可以直接使用for循环,也可以借助 range() 函数。它可创建一个整数列表,一般用在 for 循环中。 range语法:range(start,sto... 阅读详情

相关推荐

python -【五】数据容器

本文主要是针对 python 内置提供的数据容器( list,set,tuple, dict, str)的基础用法讲解并提供了相应的案例,且针对不同容器的切片进行举例,最后对各个容器之间相互转换举例说明

qq_38800175的博客 1992

python多元函数求解_一元和多元函数求极值(Python)-牛顿法

1. 引言我们在中学的时候学过一元二次函数,求解时引入一个求根公式,代入公式就可以得到不同的根,假如想计算一个高次方程的解,我们还能推导出求根公式吗?伽罗瓦在群论中证实,五次及以上多项式方程没有显示表达的求根公式,但是科学研究(例如行星轨道计算)中还是有很多求解高次方程的真实需求。既然得不到明确的求根公式,我们可以用迭代的办法来不断逼近真实的解。多项式方程求解的问题实际上可以看成是函数求极值,假如...

weixin_39877182的博客 7725

python中tkinter使用LabelFrame组件实现容器、在容器内放置多个组件

python中tkinter使用LabelFrame组件实现容器、在容器内放置多个组件

statistics+insight+vista+power 716

python循环函数怎么改变变量_python:循环定义多个变量

我们可能会时长碰到这样一个场景,计算得到一个非固定值,需要根据这个值定义相同数量个变量。实现方式的核心是exec函数,exec函数可以执行我们输入的代码字符串。exec函数的简单例子:>>>exec ('print "hello world"')hello world可以很清晰的看到,我们给exec传入一个字符串'print "hello world"',exec是执行字符串里面...

weixin_39647787的博客 791

用Django框架+爬虫技术实现自动获取可画(Canva)团队会员资格的方法

可画(canva)是一个非常流行的在线平面设计平台,因为它无需专业训练和技能就可以利用其丰富的资源设计出美观、酷炫的作品,因而它受到了极其广泛的设计专业和非专业人群的喜爱本文介绍了一种方法,它采用Django网络框架与爬虫技术相结合,实时监控定时更新可画团队版免费邀请链接的网站页面,一旦链接有更新动作,第一时间获取相关信息,并直接加载这个有效的邀请链接,自动进入可画网站获得团队版使用资格。

hhyyqq的博客 2204

postgresql 数据库 timescaledb 函数time_bucket_gapfill()报错解决及更换 license

最近在工作中使用postgresql 和 timescaledb 的time_bucket_gapfill()函数 报错,让更换license,在网上找了一大圈,没有找到,最后解决了这个问题,这篇文章记录我的解决办法查看timescaledb.license参数命令:show timescaledb.license;修改命令: 结果不行,报错如下:lter system set timescaledb.license=‘timescale’;那只能换包了如果出现上面那种情况,那我们只能先从官网上下载带 '

yang_z_1的博客 3249

python:循环定义多个变量

我们可能会时长碰到这样一个场景,计算得到一个非固定值(这次是3,下次可能是8),需要根据这个值定义相同数量个变量。实现方式的核心是exec函数,exec函数可以执行我们输入的代码字符串。exec函数的简单例子:>>>exec ('print "hello world"') hello world可以很清晰的看到,我们给exec传入一个字符串'print "hello world"...

L_cccC的博客 2万+

ESP32 LVGL开发板例程使用记录:自制常用汉字字库(二)

1、将下载的文件移入工程文件中 ,路径为项目文件中 ”......\lib\lvgl\src\font“文件夹下。3、修改字库配置文件,文件名为lv_conf.h中的内容,向其中加入下面内容(位置可搜索注释块来找到地方)修改完成可以编译试试,看是否成功,如字库较大时编译出错,请使能:LV_FONT_FMT_TXT_LARGE。2、打开此文件,修改包含头文件的路径,不然会报错,修改方法可对照自己库中其他字库文件中的包含路径。导入完成后在VSCode工程中可以查看到此文件。上次说完了如何制作 字库.c 文件。

qq_43279097的博客 1955

python循环函数迭代_如何创建多个Python函数的迭代循环?

我正在尝试编写一个Python代码,它是一维热传导(使用FVM)的数值求解器,它具有与温度相关的热导率。在解算器有三个函数需要迭代,直到收敛:电导率函数:对温度场进行初始猜测,并根据节点温度的过去值输出节点电导率。在节点系数:根据当前节点电导率计算节点系数。在节点温度:使用TDMA算法根据电流系数计算节点温度。在一旦计算出温度,这些值将循环到电导率函数,以继续循环,直到收敛。在当导电率恒定时,我可...

weixin_42122881的博客 698

角谱迭代与傅里叶变换迭代算法(GS)的原理及其实例演示分析

角谱迭代与傅里叶变换迭代算法(GS)的原理及其实例演示分析 目前,迭代法和强度传输方程(TIE)法是两类典型的非干涉相位检索技术(Phase Retrieval,被称为相位恢复、相位检索、相位反演法、相位复原等)。迭代法中的经典算法是Gerchberg-Saxton(GS),随后,出现了包括错误减少算法(ER)、混合输入输出法(HIO)、梯度搜索算法、角谱迭代算法等改进算法。...

简单光学 2万+

YOLOv9电力巡检实战:绝缘子破裂/鸟巢识别+无人机自动定位

摘要:本文聚焦电力输电线路巡检的效率与安全痛点,提出基于YOLOv9与无人机的智能巡检解决方案。针对绝缘子破裂、鸟巢等高危缺陷,通过“无人机改装-模型训练-缺陷识别-工单生成”四阶段工程落地流程,实现全自动化巡检。系统采用大疆M300无人机搭载RTK模块与Jetson边缘计算盒,结合改进YOLOv9模型实时识别5类缺陷,通过4G传输将GPS定位与缺陷数据同步至工单系统。实测表明,该方案巡检效率达50公里/天(较人工提升10倍),缺陷发现率95%(提升40%),事故预防率98%。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1509

【Python】基础 - 循环、容器类型

本文回顾了Python基础中的循环结构和容器类型。在循环部分,详细讲解了while和for两种循环的语法及控制语句(break/continue),并通过实例演示了循环嵌套的应用。容器类型部分系统地介绍了字符串、列表、元组、集合和字典五大容器:字符串重点讲解切片操作和常用方法;列表详细说明增删改查操作;元组强调其不可变性;集合突出元素唯一性特点;字典着重键值对操作。每种容器类型都配有清晰的语法说明和实用案例,帮助理解不同类型的特点和使用场景。文章通过大量代码示例使抽象概念具体化,是Python基础知识的实用

weixin_52613525的博客 1089

C# Socket通信从入门到精通(14)——多个异步UDP客户端C#代码实现(史上最全)

本文详细介绍了Socket通信中多个异步Udp客户端功能的实现、介绍如何使用多个客户端与多个服务器进行数据的交互,包含连接服务器、断开服务器、发送数据、读取数据、C#代码实现,由高级工程师多年经验总结而成,绝对干货!

qq_34059233的博客 1981

1.6 Python循环结构

1.6 Python循环结构1.6 Python循环结构1.6.1 while型循环1.6.2 for ... in 循环1.6.3 range()函数:1.6.4 break和continue语句及循环中的else子句: 1.6 Python循环结构 循环结构就是为了将相似或者相同的代码操作变得更见简洁,使得代码可以重复利用 循环结构分为2类:while循环 和 for…in循环 1...

kzl_knight的博客 1万+

传统方式部署 Hadoop 高可用集群

传统方式部署 Hadoop 高可用集群

寂夜了无痕的博客 265

基础入门篇 | YOLOv8 项目【训练】【验证】【推理】最简单教程 | YOLOv8必看 | 最新更新,直接打印 FPS,mAP50,75,95

三个文件搞定YOLOv8【训练】【验证】【推理】🚀🚀🚀

Coding... 2万+

Python之数据容器

列表的定义语法:[元素,元素,元素,...]元素:数据容器内的每一份数据,都称之为元素。元素的数据类型无限制,甚至元素可以是列表,这样就定义了嵌套列表。字典可以提供基于Key检索Value的场景实现,就像查字典一样。字典的定义语法:# 定义字典my_dict = {"张三":99,"李四":88,"王五":77}# 内容:{'张三': 99, '李四': 88, '王五': 77},类型:

m0_60121089的博客 3971

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Python概述 基础语法 判断 循环 函数 数据容器 函数进阶 Jupyter notebook

python从入门到精通

我亦无他,唯手熟尔 666

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

python学习笔记之俩个循环和数据容器入门

while循环和for循环打印99乘法表,以及五种数据容器

Y17837690351的博客 1387

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

python循环结构 容器

python基础知识循环结构while循环for循环break和continue容器列表(list(线性表))集合(set)------ 哈希结构元组(tuple)字典(dict) 循环结构 while循环 while 条件: 循环体 for循环 for 变量 in 容器: 循环体 实现数据运算 取值范围:前闭后开 range(参数)表示从0开始到(参数-1)结束 range(参数1,参数2) 参数1开始,到参数2结束 range(参数1,参数2,step) 参数1开始,到参数2结束 ,步长 练

wfl1486409520的博客 178

带你从入门到精通——Python(五. 五大容器二)

定义空字符串s1 = ''s2 = ""s5 = str()# 定义非空字符串s8 = '''abcd'''s9 = """abcd"""使用三引号定义的字符串如果不使用变量接收则表示注释,如果使用变量接收则表示字符串,且字符串的其中的内容可以换行。# 如果要嵌套单引号,外层引号必须使用双引号或者双三引号# 如果要嵌套双引号,外层引号必须使用单引号或者单三引号# 如果要嵌套单三引号,外层引号必须使用双引号# 如果要嵌套双三引号,外层引号必须使用单引号# 定义空集合。

2401_86480334的博客 1580

【Python】基础知识(函数与数据容器)

各类数据容器的特点列表:一批数据,可修改、可重复的存储场景元组:一批数据,不可修改、可重复的存储场景字符串:一串字符串的存储场景集合:一批数据,去重存储场景字典:一批数据,可用key检索value的存储场景数据容器通用方法len(容器):统计容器的元素个数max(容器):统计容器的最大元素min(容器):统计容器的最小元素list(容器):将给定容器转换为列表tuple(容器):将给定容器转换为元组str(容器):将给定容器转换为字符串。

qq_45951891的博客 856

ssis for循环容器_SSIS Foreach循环与For循环容器

ssis for循环容器 In this article, first, we will briefly describe foreach loops and for loops. Then, we will give an overview of SSIS Foreach Loop Container and For Loop Container. Finally, we will com...

culuo4781的博客 1843

【Python】一篇带你掌握数据容器之列表

本篇主要介绍了列表的定义,下标索引,相关操作以及列表的两种遍历方法,并进行了对比

qq_73017178的博客 1260

python 通过for循环同时迭代两个不同列表_一文搞懂Python循环小技巧

Python的for循环是coder最常用的语句之一,如果只是简单地对容器循环遍历,那便会少了很多美好的体验。像下面这样:for python提供了很多用于循环的技巧,这些方法能让代码更加简洁美观,这次就来扒一扒。enumerate()函数当遍历一个非数值序列时,有时候会需要将元素和索引一起取出,这时候便可以用到enumerate()函数。enumerate()函数接受一个序列或者迭代器,返回一个...

weixin_39831242的博客 1234

python-容器、循环

python-容器、循环

m0_75008371的博客 195
下一篇: python开发ahp算法应用(1024祝各位程序员节日快乐)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值