发布时间:2026/7/12 3:32:10
影刀RPA 元组Tuple的使用:不可变序列的场景 影刀RPA 元组Tuple的使用不可变序列的场景作者林焱什么情况用你在影刀RPA中需要存储一组不会改变的数据——比如一周七天、HTTP状态码映射、Excel列的固定顺序。用列表怕不小心被修改了导致流程出错函数需要返回多个值但不想用字典那么笨重**元组Tuple**就是解决这些场景的数据类型。它和列表很像但一旦创建就不能修改。这个不可变的特性恰恰是它的价值所在——安全、高效、可哈希。本文讲清楚元组和列表到底有什么区别、什么时候该用元组、在影刀RPA中的实际用法。怎么做一、元组 vs 列表对比特性元组 Tuple列表 List语法(1, 2, 3)[1, 2, 3]可变性不可变创建后不能改可变可增删改性能更快、更省内存稍慢| 可哈希 | 可哈希能做字典key、放集合里 | 不可哈希 || 方法 | 只有count和index | append/remove/sort等 || 适用场景 | 固定数据、多返回值、字典key | 需要修改的数据集合 |二、创建元组# 基本创建coords(10,20)colors(red,green,blue)mixed(1,hello,3.14,True)# 单元素元组注意逗号single(42,)# 这是元组: (42,)not_tuple(42)# 这不是元组就是整数42# 空元组empty()[video(video-3dy7TVuW-1783795343060)(type-csdn)(url-https://live.csdn.net/v/embed/526818)(image-https://v-blog.csdnimg.cn/asset/582d14c3bd0451c5399cd990b56e2a0d/cover/Cover0.jpg)(title-拼多多店群自动化报活动上架)]# 不用括号也能创建自动打包point10,20# (10, 20)name张三,# (张三,) ← 注意逗号# 从列表转换my_list[1,2,3]my_tupletuple(my_list)# (1, 2, 3)# 从字符串转换charstuple(ABC)# (A, B, C)三、元组的基本操作data(商品A,128.5,50,电子)# 访问元素和列表一样data[0]# 商品Adata[-1]# 电子倒数第一个data[1:3]# (128.5, 50)切片返回元组# 遍历foritemindata:print(item)# 解包元组的杀手锏name,price,stock,categorydata# name商品A, price128.5, stock50, category电子# 部分解包name,*restdata# name商品A, rest[128.5, 50, 电子]first,*middle,lastdata# first商品A, middle[128.5, 50], last电子# 统计data.count(商品A)# 1data.index(128.5)# 1找到128.5的索引# 长度len(data)# 4# 拼接combined(1,2)(3,4)# (1, 2, 3, 4)repeated(0,)*3# (0, 0, 0)四、元组的不可变性详解data(1,2,3)# 这些操作都会报错 TypeError# data[0] 10 # 不能修改元素# data.append(4) # 不能添加# data.remove(1) # 不能删除# data.sort() # 不能排序# 但如果元组里装的是可变对象对象本身可以改data([1,2],[3,4])data[0].append(3)# data变成([1, 2, 3], [3, 4]) ← 列表内部变了# data[0] [10] # 这还是报错不能替换元素引用五、RPA实战场景场景1函数多返回值defscrape_product(url):采集商品信息返回多个值# ... 采集逻辑 ...nameiPhone 15price5999.0stock100is_availableTrue# 用元组返回多个值returnname,price,stock,is_available# 调用时直接解包product_name,product_price,product_stock,availablescrape_product(https://...)print(f商品{product_name}价格{product_price}库存{product_stock})# 写入影刀变量yd_var[product_name]product_name yd_var[product_price]product_price yd_var[product_stock]product_stock yd_var[available]available场景2固定配置映射# HTTP状态码映射不可变配置HTTP_STATUS{(200,):成功,(301,302):重定向,(400,):请求错误,(401,403):认证失败,(404,):未找到,(500,502,503):服务器错误,}# 用元组作为字典的key列表不行# 一周七天WEEKDAYS(周一,周二,周三,周四,周五,周六,周日)# 根据日期获取星期importdatetime todaydatetime.date.today()weekday_nameWEEKDAYS[today.weekday()]print(f今天是{weekday_name})# Excel固定列顺序EXCEL_COLUMNS(序号,商品名,价格,库存,分类,更新时间)# 确保每次写入Excel时列顺序一致forcol_idx,col_nameinenumerate(EXCEL_COLUMNS,1):print(f第{col_idx}列:{col_name})场景3坐标定位与区域定义# 定义网页元素的区域范围SCREEN_REGIONS{header:(0,0,1920,80),# (x, y, width, height)sidebar:(0,80,200,900),content:(200,80,1720,900),footer:(0,980,1920,100),}# 截图区域regionSCREEN_REGIONS[content]# 传给影刀的截图指令yd_var[screenshot_region]list(region)# 影刀可能需要列表格式# 表格区域定义TABLE_AREA(2,5)# 第2行到第5行forrowinrange(TABLE_AREA[0],TABLE_AREA[1]1):print(f处理第{row}行)场景4多条件排序的key# 用元组作为排序key实现多列排序products[(商品A,电子,128.5,50),(商品B,服装,99.9,200),(商品C,电子,59.9,120),(商品D,服装,199.0,30),(商品E,电子,128.5,80),]# 按分类升序同分类按价格升序同价格按库存降序![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/010d365815904880b7e25b4f6b1290fd.png#pic_center)sorted_productssorted(products,keylambdax:(x[1],x[2],-x[3]))# 排序结果# (商品D, 服装, 199.0, 30) ← 服装价格199# (商品B, 服装, 99.9, 200) ← 服装价格99.9# (商品C, 电子, 59.9, 120) ← 电子价格59.9# (商品A, 电子, 128.5, 50) ← 电子价格128.5库存50# (商品E, 电子, 128.5, 80) ← 电子价格128.5库存80场景5 namedtuple结构化数据fromcollectionsimportnamedtuple# 定义结构化的元组Productnamedtuple(Product,[name,category,price,stock])ScrapeResultnamedtuple(ScrapeResult,[success,data,error,elapsed])# 创建实例p1Product(name商品A,category电子,price128.5,stock50)p2Product(商品B,服装,99.9,200)# 像对象一样访问字段比普通元组可读性好print(p1.name)# 商品Aprint(p2.price)# 99.9# 也能像元组一样解包name,category,price,stockp1# 采集结果resultScrapeResult(successTrue,data[{id:1,name:商品A}],errorNone,elapsed2.5)ifresult.success:print(f采集成功{len(result.data)}条数据耗时{result.elapsed}秒)else:print(f采集失败{result.error})六、元组与列表的选择决策# 用列表数据需要增删改urls[]# 空列表后续要添加urls.append(https://example.com)urls.remove(https://example.com)# 用元组数据固定不变DAYS(周一,周二,周三,周四,周五,周六,周日)# 用元组需要作为字典的keycoordinates{(0,0):左上角,(1920,0):右上角,(0,1080):左下角,(1920,1080):右下角,}# 用元组函数返回多个值defparse_price(text):从128.50中解析出数值和货币符号symbolifintextelse¥if¥intextelsenumfloat(text.replace(,).replace(¥,).replace(,,).strip())returnnum,symbol# 返回元组price,symbolparse_price(128.50)有什么坑坑1单元素元组忘了加逗号现象x (42)以为创建了元组实际type(x)是int。原因括号在Python中有两种含义——元组语法和运算分组。(42)被解释为运算分组等价于42。只有加逗号(42,)才是元组。解决单元素元组必须加逗号。或者直接不加括号x 42,Python会自动打包成元组。坑2误以为元组完全不可变TEMU店群矩阵自动化运营核价报活动现象元组里放了个列表修改列表内容后发现元组变了。原因元组的不可变性是指引用不可变——不能替换元组中的元素指向但如果元素本身是可变对象如列表对象内部是可以修改的。解决如果需要完全不可变元组里只放不可变类型int、str、tuple等。放列表的话列表部分是可以被修改的。坑3元组排序返回的是列表现象sorted((3, 1, 2))返回[1, 2, 3]类型是list不是tuple。原因sorted()函数总是返回列表不管输入是什么类型。解决如果需要元组结果手动转换tuple(sorted((3, 1, 2)))→(1, 2, 3)。坑4影刀变量不支持元组现象在Python代码块中创建了元组yd_var[coords] (10, 20)后续指令读取时变成了列表[10, 20]。原因影刀变量系统在序列化/反序列化时会把元组转成列表。解决在Python代码块内部使用元组需要存入影刀变量时转成列表。从影刀变量读取后如果需要元组再tuple(yd_var[coords])转换。不要依赖影刀变量中的数据保持元组类型。坑5namedtuple字段名冲突现象namedtuple(MyData, [class, name])报错ValueError。原因class是Python关键字不能作为字段名。解决改用非关键字名称如category代替class。或者用renameTrue参数自动重命名冲突字段namedtuple(MyData, [class, name], renameTrue)此时class会被自动重命名为_0。

相关新闻

2026/7/12 3:32:10

CLIP模型可视化:从原理到实践的多模态AI理解工具

今天我们来深入探讨一个在AI多模态领域极具价值的话题——如何通过可视化方法直观理解CLIP模型的工作原理。CLIP(Contrastive Language-Image Pre-training)作为OpenAI推出的革命性多模态模型,通过对比学习将图像和文本映射到同一语义空间&am…

2026/7/12 3:32:10

影刀RPA 元素定位进阶:XPath从入门到精通

影刀RPA 元素定位进阶:XPath从入门到精通 作者:林焱 什么情况用 CSS选择器能搞定大部分元素定位,但有些场景CSS选择器无能为力:你需要找"某个元素的父元素"、你需要根据文本内容定位元素、你需要找"第3个之后的所…

2026/7/12 6:47:31

深度学习七大经典网络实战:从CNN到Transformer系统精讲

深度学习入门最容易踩的坑就是盲目自学!今天我们来系统梳理七大经典网络模型,从CNN、GNN到YOLO、Transformer全覆盖,帮你避开碎片化学习的弯路,直接打通项目实战路径。这次我们重点看迪哥(我是土堆)整理的深…

2026/7/12 6:47:31

AI驱动参数化建模:自然语言指令修改模型的技术实践

这次我们来看一个很有意思的技术方向:如何用AI直接修改参数化模型。参数化建模在工程、建筑和计算机图形学领域很常见,它通过定义模型参数及其关系来创建可灵活调整的设计。传统上修改这些模型需要专业软件和手动调整,但现在AI技术正在改变这…

2026/7/12 6:47:31

MPC 2500硬件采样与AI语音生成:完整说唱制作工作流实践

这次我们来看一个结合硬件采样器和AI语音生成的技术实践——用MPC 2500制作伴奏,再通过Conway the Machine的说唱风格生成饶舌人声。这个项目的核心不是单一工具的使用,而是硬件与AI的完整工作流整合。MPC 2500作为经典硬件采样器,提供了扎实…

2026/7/12 6:47:31

C++项目用CLAUDE.md锁定编码标准与内存管理规范

Claude Code的「项目宪法」Claude Code 是 Anthropic 推出的终端内 AI 编程助手,而 CLAUDE.md 文件就是它的项目级配置入口。你可以把它理解为一份「项目宪法」——所有 Claude Code 在项目内的回答、生成代码、重构建议,都会遵循这份文件里的规则。对于…

2026/7/12 6:42:31

从Unity游戏提取Live2D模型:逆向解析AssetBundle与资源重组实战

1. 项目概述:为什么我们要提取碧蓝航线的Live2D?如果你玩过《碧蓝航线》,肯定对游戏里那些生动可爱的舰娘Live2D皮肤印象深刻。从眨眼的细微动作到华丽的技能特效,这些模型不仅仅是静态的立绘,而是充满生命力的可交互角…

2026/7/12 0:01:29

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/12 0:01:29

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/12 0:01:29

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/12 0:01:29

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/12 0:01:29

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/12 0:01:29

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/11 8:37:53

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…