影刀RPA 循环操作完全指南:遍历循环、次数循环、条件循环
影刀RPA 循环操作完全指南遍历循环、次数循环、条件循环作者林焱循环是RPA流程中最重要的控制结构。批量采集数据要循环、批量处理文件要循环、翻页采集要循环、重试操作要循环。但很多新手写循环时出各种问题——死循环停不下来、循环次数不对、循环体内变量混乱、遍历时修改列表导致跳过元素。这篇文章把影刀和Python中三种循环的正确写法和实战场景讲全。一、影刀的循环指令1.1 遍历循环影刀提供【遍历列表】指令遍历一个列表中的每个元素【遍历列表】 列表变量product_list → 当前元素product 【日志输出】处理{product} 【获取元素文本】获取商品价格 → price 【添加到列表】把price加入price_list 【结束遍历】1.2 次数循环【次数循环】 循环次数10 → 当前索引i 【日志输出】第{i1}次循环 # 执行操作 【结束循环】1.3 条件循环【条件循环】 条件has_next_page True 【获取元素列表】获取当前页数据 【添加到列表】数据追加到结果列表 【点击】点击下一页按钮 【检查元素】检查是否还有下一页 → has_next_page 【结束循环】二、Python中的循环2.1 for遍历循环# 遍历列表products[苹果,香蕉,橘子]forproductinproducts:print(product)# 遍历带索引foridx,productinenumerate(products):print(f第{idx1}个{product})# 遍历数字范围foriinrange(5):# 0, 1, 2, 3, 4print(i)foriinrange(1,6):# 1, 2, 3, 4, 5print(i)foriinrange(0,10,2):# 0, 2, 4, 6, 8print(i)# 遍历字典prices{苹果:5.0,香蕉:3.5}forname,priceinprices.items():print(f{name}: ¥{price})2.2 while条件循环# 基本whilepage1has_nextTruewhilehas_next:print(f处理第{page}页)# 采集数据# 检查是否有下一页# has_next check_next_page()[video(video-bGAtOyrK-1784061375140)(type-undefined)(url-undefined)(image-https://img-blog.csdnimg.cn/editor-video.png)(title-undefined)]page1# 安全阀最多100页ifpage100:print(达到最大页数限制)break坑while死循环# 忘记更新条件变量count0whilecount10:print(count)# 忘了count 1永远循环# 正确count0whilecount10:print(count)count1永远在while循环中加安全阀防止条件永远为True导致死循环。2.3 嵌套循环# 二维数据遍历matrix[[1,2,3],[4,5,6],[7,8,9],]forrowinmatrix:foriteminrow:print(item,end )print()# 1 2 3# 4 5 6# 7 8 9# 笛卡尔积colors[红,蓝]sizes[S,M,L]forcolorincolors:forsizeinsizes:print(f{color}-{size})坑嵌套循环性能嵌套循环的执行次数是外层×内层。如果外层100次、内层100次总共10000次。大数据量时注意性能。三、循环中的控制3.1 break跳出循环# 找到第一个满足条件的元素就停止foriteminitems:ifitem[price]100:print(f找到{item})break# 跳出循环3.2 continue跳过本次# 跳过空值foriteminitems:ifnotitemoritem:continue# 跳过空值进入下一次循环# 处理非空数据process(item)3.3 break和continue的区别# break直接跳出整个循环foriinrange(5):ifi3:breakprint(i)# 输出0 1 2# continue跳过本次继续下一次foriinrange(5):ifi3:continueprint(i)# 输出0 1 2 43.4 嵌套循环中的break# break只跳出最内层循环foriinrange(3):forjinrange(3):ifj1:break# 只跳出内层循环print(f({i},{j}))# (0,0) (1,0) (2,0)# 跳出所有循环的技巧foundFalseforiinrange(3):forjinrange(3):ifi1andj1:foundTruebreak# 跳出内层iffound:break# 跳出外层四、循环实战场景4.1 批量采集# 从Excel读取关键词列表逐个搜索采集importpandasaspd dfpd.read_excel(D:\\data\\keywords.xlsx)keywordsdf[关键词].tolist()results[]foridx,keywordinenumerate(keywords,1):print(f进度{idx}/{len(keywords)}- 正在搜索{keyword})try:# 采集逻辑在影刀中用网页操作指令# search_and_collect(keyword)result{keyword:keyword,count:50,status:success}results.append(result)exceptExceptionase:results.append({keyword:keyword,count:0,status:ferror:{e}})# 随机延时避免频率限制importtimeimportrandom time.sleep(random.uniform(1,3))set_variable(results,results)4.2 翻页采集page1all_data[]max_pages50# 安全阀whilepagemax_pages:print(f正在采集第{page}页)# 采集当前页数据在影刀中用网页指令# page_data collect_page(page)page_data[{page:page,item:i}foriinrange(10)]ifnotpage_data:print(f第{page}页无数据停止采集)breakall_data.extend(page_data)# 检查是否有下一页# has_next check_next_button()has_nextpage10# 模拟ifnothas_next:print(没有更多页了)breakpage1print(f共采集{len(all_data)}条数据)set_variable(all_data,all_data)4.3 重试循环importtimedefdo_with_retry(operation,max_retry3,delay5):带重试的操作forattemptinrange(1,max_retry1):try:resultoperation()returnresultexceptExceptionase:ifattemptmax_retry:print(f第{attempt}次失败{e}{delay}秒后重试...)time.sleep(delay)else:print(f重试{max_retry}次后仍失败{e})raise# 使用# result do_with_retry(lambda: click_element(submit_btn))4.4 分批处理defprocess_in_batches(data_list,batch_size100):分批处理大量数据totallen(data_list)foriinrange(0,total,batch_size):batchdata_list[i:ibatch_size]batch_numi//batch_size1print(f处理批次{batch_num}/{(total-1)//batch_size1}{len(batch)}条)# 处理这批数据foriteminbatch:process(item)# 批次间休息importtime time.sleep(1)# 使用datalist(range(1,1001))# 1000条数据process_in_batches(data,batch_size100)4.5 轮询等待importtimedefwait_for_condition(check_func,timeout60,interval2):轮询等待条件满足starttime.time()whiletime.time()-starttimeout:ifcheck_func():returnTruetime.sleep(interval)returnFalse# 超时# 使用等待元素出现# found wait_for_condition(lambda: check_element_exists(result), timeout30)4.6 并行遍历# 同时遍历两个列表names[商品A,商品B,商品C]prices[10.0,20.0,30.0]stocks[100,200,150]forname,price,stockinzip(names,prices,stocks):print(f{name}: ¥{price}, 库存{stock})# zip_longest处理不等长列表fromitertoolsimportzip_longest list1[1,2,3,4,5]list2[a,b,c]fornum,letterinzip_longest(list1,list2,fillvalueN/A):print(f{num}:{letter})# 1: a, 2: b, 3: c, 4: N/A, 5: N/A五、循环与列表推导式很多循环可以用列表推导式一行搞定# 用循环results[]foriteminitems:ifitem[price]100:results.append(item[name])# 用列表推导式results[item[name]foriteminitemsifitem[price]100]# 带条件转换labels[贵ifp100else便宜forpinprices]# 嵌套循环pairs[(x,y)forxinrange(3)foryinrange(3)ifx!y]什么时候用列表推导式简单的遍历过滤转换逻辑能用一行表达清楚什么时候用普通循环循环体内有多个操作需要break/continue逻辑复杂TEMU店群矩阵自动化运营核价报活动六、循环性能优化6.1 减少循环内的重复计算# 慢每次循环都计算lenforiinrange(len(data)):process(data[i],len(data))# 快提前计算totallen(data)foriinrange(total):process(data[i],total)6.2 用字典替代循环查找# 慢循环查找foriteminitems:ifitem[id]target_id:resultitembreak# 快用字典item_dict{item[id]:itemforiteminitems}resultitem_dict.get(target_id)6.3 避免在循环中修改列表# 慢循环中删除元素foriteminitems[:]:# 遍历副本ifitem0:items.remove(item)# 快用推导式items[itemforiteminitemsifitem0]6.4 批量操作代替逐个操作# 慢逐个写入Excelforitemindata:ws.append([item])# 快批量写入forrowindata:ws.append(row)# 或者用pandas一次性写入七、避坑清单坑1修改正在遍历的列表# 错误遍历时删除元素会跳过items[1,2,3,4,5]foriteminitems:ifitem%20:items.remove(item)# 结果[1, 3, 5]跳过了4# 正确遍历副本foriteminitems[:]:ifitem%20:items.remove(item)# 或者用推导式items[itemforiteminitemsifitem%2!0]坑2range不包含结束值foriinrange(1,5):# 1, 2, 3, 4不包含5print(i)foriinrange(5):# 0, 1, 2, 3, 4print(i)坑3enumerate的索引从0开始foridx,iteminenumerate(items):print(f第{idx}个)# 第0个、第1个...# 从1开始foridx,iteminenumerate(items,1):print(f第{idx}个)# 第1个、第2个...坑4while循环忘记更新变量# 死循环page1whilepage10:print(page)# 忘了 page 1坑5循环变量泄露# Python中循环变量在循环结束后仍然存在foriinrange(5):passprint(i)# 4仍然可访问# 如果后续代码误用i可能出bug坑6浮点数作为循环条件# 不要用浮点数做循环条件精度问题i0.0whilei1.0:i0.1# 0.10.1... 不精确等于1.0# 用整数代替foriinrange(10):valuei*0.1