python中从for循环延申到推导式的具体使用


Posted in Python onNovember 29, 2019

本文采用循序渐进的写法,逐步递进.

传统for循环:

#获取1到1000000的偶数
#采用传统写法(俗称普通解析)
for i in range(1,10**6+1):
 if(i%2==0):
 print(i)
#程序运行结果:
#2
#4
#.
#.
#.
#1000000

总结(从直观上对代码进行评价):能完成要求,但是代码不够简洁.

改进后的代码,采用列表推导式:

#获取1到1000000的偶数
#采用列表推导式(俗称列表解析)
print([i for i in range(1,10**6+1) if i%2==0])
#程序运行结果:
#2
#4
#.
#.
#.
#1000000

我们再来从代码运行速度上评价代码.

传统for循环的运行速度:

#采用clock()函数进行测量代码运行时间
#用以浮点数计算的秒数返回当前的CPU时间,用来衡量不同程序的耗时,比time.time()更精确
import time
cpu_start=time.clock()
for i in range(1,10**6+1):
 if(i%2==0):
 print(i)
cpu_end=time.clock()
print("程序运行时间:",cpu_end-cpu_start)
#程序运行结果:
#2
#4
#.
#.
#.
#1000000
#程序运行时间: 2.1866424
#注意:编译器在3.3-3.8之间的会报一个警告:DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead
#因为python3.3以后不被推荐使用,该方法依赖操作系统,建议使用per_counter(返回系统运行时间)或process_time(返回进程运行时间)代替

采用列表推导式的运行速度:

#采用clock()函数进行测量代码运行时间
#用以浮点数计算的秒数返回当前的CPU时间,用来衡量不同程序的耗时,比time.time()更精确
import time
cpu_start=time.clock()
print([i for i in range(1,10**6+1) if i%2==0])
cpu_end=time.clock()
print("程序运行时间:",cpu_end-cpu_start)
#程序运行结果:
#[2,4,6,8...1000000]
#程序运行时间: 0.005884400000000012
#注意:编译器在3.3-3.8之间的会报一个警告:DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead
#因为python3.3以后不被推荐使用,该方法依赖操作系统,建议使用per_counter(返回系统运行时间)或process_time(返回进程运行时间)代替

总结(从代码运行速度上进行评价):很明显采用列表推导式的代码,运行速度是更胜一筹的.

结论:

1.编译器会优化,不会因为简写而影响效率,反而因优化提高了效率.
2. 减少程序员工作量,减少出错.
3. 即简化了代码,又增强了代码的可读性.

那么存在列表解析式是否存在集合推导式,字典推导式,元组推导式,我们来一探究竟吧!这里就不再探究他们的运行速度了!

集合推导式:

#集合推导式
#获取1到1000000的偶数
x={i for i in range(1,10**6+1) if i%2==0}
type(x)
#输出结果:
#{2,4,6,8...1000000}
#<class 'set'>

字典推导式:

#获取值是偶数的所有键值对形成的字典
#采用传统方法
dict={'名字1': 1, '名字二': 2, '名字三': 3, '名字四': 4}
dict_x={}
for i,j in dict.items():
  if(j%2==0):
    dict_x[i]=j
print(dict_x)
print(type(dict_x))
#{'名字二': 2, '名字四': 4}
#<class 'dict'>
#获取值是偶数的所有键值对形成的字典
#字典推导式
#方法一
#采用zip函数与for循环将两个列表的值逐步遍历作为字典的键与值
x = {i : j for i, j in zip(["名字1", "名字二", "名字三", "名字四"], [1,2,3,4]) if j%2==0}
print(x)
print(type(x))
#运行结果:
#{'名字二': 2, '名字四': 4}
#<class 'dict'>

#方法二
#获取值是偶数的所有键值对形成的字典
#采用items()函数进行迭代遍历
dict={'名字1': 1, '名字二': 2, '名字三': 3, '名字四': 4}
x = {i : j for i, j in dict.items() if j%2==0}
print(x)
print(type(x))
#运行结果:
#{'名字二': 2, '名字四': 4}
#<class 'dict'>

元组推导式:

#获取1到1000000的偶数
x=(i for i in range(1,10**6+1) if i%2==0)
print(x)
type(x)
#输出结果:
#<generator object <genexpr> at 0x00000241FFAB2750>
#<class 'generator'>

咦!前面都返回数组或者集合或字典,这个怎么返回了生成器(genexpr),这是因为元组是不可变的。我们来访问一下里面的元素把!

#获取值是偶数的所有键值对形成的字典
x=(i for i in range(1,10**6+1) if i%2==0)
for i in x:
 print(i)
#输出结果:
#2
#4
#.
#.
#.
#1000000

 总结:推导式虽然有很多优点,但是唯一不足的就是局部变量的可读性不高.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python生成器(Generator)详解
Apr 13 Python
Python实现的RSS阅读器实例
Jul 25 Python
Python中list初始化方法示例
Sep 18 Python
Python操作SQLite数据库的方法详解
Jun 16 Python
TensorFlow实现MLP多层感知机模型
Mar 09 Python
python 获取图片分辨率的方法
Jan 08 Python
Python适配器模式代码实现解析
Aug 02 Python
Pycharm中import torch报错的快速解决方法
Mar 05 Python
Django多层嵌套ManyToMany字段ORM操作详解
May 19 Python
Python request中文乱码问题解决方案
Sep 17 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
Feb 25 Python
基于PyQT5制作一个桌面摸鱼工具
Feb 15 Python
python 实现矩阵按对角线打印
Nov 29 #Python
python之列表推导式的用法
Nov 29 #Python
python 实现方阵的对角线遍历示例
Nov 29 #Python
python 实现一个反向单位矩阵示例
Nov 29 #Python
python 实现矩阵填充0的例子
Nov 29 #Python
python循环嵌套的多种使用方法解析
Nov 29 #Python
python写一个随机点名软件的实例
Nov 28 #Python
You might like
CI框架中数据库操作函数$this-&gt;db-&gt;where()相关用法总结
2016/05/17 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
2020/01/26 PHP
Javascript计算时间差的函数分享
2011/07/04 Javascript
使用Jquery打造最佳用户体验的登录页面的实现代码
2011/07/08 Javascript
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
2014/06/26 Javascript
Javascript中的arguments与重载介绍
2015/03/15 Javascript
jQuery仅用3行代码实现的显示与隐藏功能完整实例
2015/10/08 Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
2016/01/22 Javascript
JavaScript实现自动跳转文本功能
2017/05/25 Javascript
React应用中使用Bootstrap的方法
2017/08/15 Javascript
详解js获取video任意时间的画面截图
2019/04/17 Javascript
编写更好的JavaScript条件式和匹配条件的技巧(小结)
2019/06/27 Javascript
基于layui轮播图满屏是高度自适应的解决方法
2019/09/16 Javascript
使用typescript改造koa开发框架的实现
2020/02/04 Javascript
微信浏览器左上角返回按钮监听的实现
2020/03/04 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
2020/11/18 Vue.js
Python 连连看连接算法
2008/11/22 Python
Python进行数据科学工作的简单入门教程
2015/04/01 Python
wxpython中Textctrl回车事件无效的解决方法
2016/07/21 Python
python中 logging的使用详解
2017/10/25 Python
Python利用itchat对微信中好友数据实现简单分析的方法
2017/11/21 Python
对python插入数据库和生成插入sql的示例讲解
2018/11/14 Python
一篇文章搞定Python操作文件与目录
2019/08/13 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
2019/11/08 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
2020/02/05 Python
python标准库OS模块详解
2020/03/10 Python
几个MySql的面试题
2013/04/22 面试题
动员大会主持词
2014/03/20 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
表扬稿范文
2015/01/17 职场文书
2015年会计年终工作总结
2015/05/26 职场文书
自书遗嘱范文
2015/08/07 职场文书
2016年师德师风学习心得体会
2016/01/12 职场文书
2016师德师风学习心得体会
2016/01/12 职场文书
小程序实现悬浮按钮的全过程记录
2021/10/16 HTML / CSS