python使用for...else跳出双层嵌套循环的方法实例


Posted in Python onMay 17, 2020

背景

周末在写一个爬虫时,遇到这样一种场景:从搜索结果中下载指定数量的文件

例如:搜索结果中共分为10页展示,加起来一共50条数据,现在要做的是从50条数据中下载指定数量的数据

为了实现这个功能,开始我是这样想的:

1、依次遍历10页数据,并且把每页的数据都追加到同一个列表中,这样的话,请求完10页数据后,这个列表中就包含了所有结果;

2、然后再从这个大列表中提取指定数量的数据进行下载即可

这种方法确实可行,但是在运行过程中发现一个问题:程序运行速度太慢了,原因是无论你想下载多少条数据,都会先把所有数据请求下来并追加到列表中,这个过程实在是太耗时了,而且也不合理

所以换一种思路:要下载n条数据,就只提取n条,不提前把所有数据请求下来

具体实现方法

上面举的例子,可以抽象为如下功能

首先有一个嵌套的列表

[[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]]

然后提取这个列表中的数据到一个新的列表中,例如取前3个数字、前5个数字或者前8个数字

可以通过双层for循环来实现,另外要注意设置条件来跳出循环,如下

source = [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]]
target = []

def get_data(source, count):
 for i in range(0, len(source)+1):
  temp = source[i]
  for j in temp:
   target.append(j)
   if len(target) >= count:
    break

  else:
   continue
  break

t = get_data(source, 6)
print(target)

source代表原列表;count代表提取数字的个数

根据菜鸟教程的提示, for ... else 的意思如下:

1、for 中的语句和普通的没有区别,else 中的语句会在循环正常执行完的情况下执行(即 for 不是通过 break 跳出而中断的);

2、如果for是由于break中断的,则不会执行else语句

来分析下count为不同值时的运行过程及结果

 1、count=3

当count=3时,得到如下结果

target = [1, 2, 3]

source中包含4个子列表,每个子列表包含5个数字;

先遍历外层for循环,当遍历到第一个子列表时,就能够满足内层for循环中断的条件了,即:当提取到第一个子列表的数字3时,target的长度等于3,满足len(target)>=count,跳出内层for循环

由于此时不是正常退出内层for循环,所以不会执行后面的else语句(ps:这里else语句下是执行continue指令,也就是继续遍历外层for循环),然后继续执行else后的berak语句,跳出外层for循环

综上,得到 target = [1, 2, 3] 的结果

2、count=8

当count=3时,得到如下结果

target = [1, 2, 3, 4, 5, 6, 7, 8]

同样,先取出外层for循环的第一个子列表,第一个子列表只有5个数字,当遍历完后,target的长度等于5,不满足len(target)>=count

此时内层for循环正常结束第一轮遍历,由于for循环正常结束,所以执行else下的语句,也就是执行continue指令,这里的continue是针对外层for循环的,也就是说继续取出外层for循环的第二个子列表

当第二个子列表遍历到第三个数字时,target的长度等于8,满足len(target)>=count,,跳出内层for循环

同理,由于此时不是正常退出内层for循环,所以不会执行后面的else语句,然后继续执行else后的berak语句,跳出外层for循环

综上,得到 target =[1, 2, 3, 4, 5, 6, 7, 8] 的结果

总结

到此这篇关于python使用for...else跳出双层嵌套循环的文章就介绍到这了,更多相关python for else跳出双层嵌套循环内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实现的RSS阅读器实例
Jul 25 Python
Python数据结构与算法之字典树实现方法示例
Dec 13 Python
python贪婪匹配以及多行匹配的实例讲解
Apr 19 Python
Python3多进程 multiprocessing 模块实例详解
Jun 11 Python
python批量图片处理简单示例
Aug 06 Python
python 字典 setdefault()和get()方法比较详解
Aug 07 Python
使用虚拟环境打包python为exe 文件的方法
Aug 29 Python
基于Python+Appium实现京东双十一自动领金币功能
Oct 31 Python
Anaconda 查看、创建、管理和使用python环境的方法
Dec 03 Python
jupyter notebook运行命令显示[*](解决办法)
May 18 Python
解决Keras中CNN输入维度报错问题
Jun 29 Python
python批量更改目录名/文件名的方法
Apr 18 Python
VSCode配合pipenv搞定虚拟环境的实现方法
May 17 #Python
Python Pandas 对列/行进行选择,增加,删除操作
May 17 #Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
May 17 #Python
Python键鼠操作自动化库PyAutoGUI简介(小结)
May 17 #Python
python 实现PIL模块在图片画线写字
May 16 #Python
在python image 中实现安装中文字体
May 16 #Python
Python 判断时间是否在时间区间内的实例
May 16 #Python
You might like
php连接mysql数据库代码
2009/03/10 PHP
PHP COOKIE设置为浏览器进程
2009/06/21 PHP
json的键名为数字时的调用方式(示例代码)
2013/11/15 PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
2014/08/21 PHP
ThinkPHP模板替换与系统常量及应用实例教程
2014/08/22 PHP
PHP使用Pear发送邮件(Windows环境)
2016/01/05 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
PHP Ajax跨域问题解决方案代码实例
2020/08/01 PHP
使用js实现按钮控制文本框加1减1应用于小时+分钟
2013/12/09 Javascript
jQuery实现自动滚动到页面顶端的方法
2015/05/22 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
详解JavaScript中的事件流和事件处理程序
2016/05/20 Javascript
基于Marquee.js插件实现的跑马灯效果示例
2017/01/25 Javascript
微信浏览器禁止页面下拉查看网址实例详解
2017/06/28 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
vue 的keep-alive缓存功能的实现
2018/03/22 Javascript
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
Python中字典(dict)合并的四种方法总结
2017/08/10 Python
python数据封装json格式数据
2018/03/04 Python
python3学习之Splash的安装与实例教程
2018/07/09 Python
python爬取酷狗音乐排行榜
2019/02/20 Python
Python装饰器限制函数运行时间超时则退出执行
2019/04/09 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
2019/08/19 Python
纯CSS3实现Material Design效果
2017/03/09 HTML / CSS
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
乐高西班牙官方商店:LEGO Shop ES
2019/12/01 全球购物
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
当当网软件测试笔试题
2015/11/24 面试题
大学生学习生活的自我评价
2013/11/01 职场文书
大学毕业通用个人的求职信
2013/12/08 职场文书
城管大队整治方案
2014/05/06 职场文书
授权委托书协议书
2014/10/16 职场文书
幼师自荐信范文
2015/03/06 职场文书
签订劳动合同通知书
2015/04/16 职场文书
2019最新校园运动会广播稿!
2019/06/28 职场文书
vue2实现provide inject传递响应式
2021/05/21 Vue.js