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学习之用pygal画世界地图实例
Dec 07 Python
python按行读取文件,去掉每行的换行符\n的实例
Apr 19 Python
python实现对指定输入的字符串逆序输出的6种方法
Apr 26 Python
Python文件读写常见用法总结
Feb 22 Python
Python实现的读取文件内容并写入其他文件操作示例
Apr 09 Python
深入了解Python枚举类型的相关知识
Jul 09 Python
python+openCV调用摄像头拍摄和处理图片的实现
Aug 06 Python
使用Python的networkx绘制精美网络图教程
Nov 21 Python
使用Python实现分别输出每个数组
Dec 06 Python
AUC计算方法与Python实现代码
Feb 28 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
Dec 08 Python
Python绘画好看的星空图
Mar 17 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
php 网上商城促销设计实例代码
2012/02/17 PHP
php中常用的预定义变量小结
2012/05/09 PHP
PHP的autoload机制的实现解析
2012/09/15 PHP
PHP输出一个等腰三角形的方法
2015/05/12 PHP
php实现多维数组排序的方法示例
2017/03/23 PHP
JavaScript 比较时间大小的代码
2010/04/24 Javascript
为什么要在引入的css或者js文件后面加参数的详细讲解
2013/05/03 Javascript
取消选中单选框radio的三种方式示例介绍
2013/12/23 Javascript
addEventListener 的用法示例介绍
2014/05/07 Javascript
原生javascript实现图片按钮切换
2015/01/12 Javascript
JS设置下拉列表框当前所选值的方法
2015/12/22 Javascript
jQuery原理系列-css选择器的简单实现
2016/06/07 Javascript
jQuery实现点击弹出背景变暗遮罩效果实例代码
2016/06/24 Javascript
完美解决IE不支持Data.parse()的问题
2016/11/24 Javascript
浅谈Javascript事件对象
2017/02/05 Javascript
bootstrap 下拉多选框进行多选传值问题代码分析
2017/02/14 Javascript
js实现简单的二级联动效果
2017/03/09 Javascript
浅谈vue的踩坑路
2017/08/31 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
2018/12/09 Javascript
JS回调函数 callback的理解与使用案例分析
2019/09/09 Javascript
javascript 易错知识点实例小结
2020/04/25 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
2020/07/24 Javascript
跟老齐学Python之Import 模块
2014/10/13 Python
python3 实现的人人影视网站自动签到
2016/06/19 Python
python中利用队列asyncio.Queue进行通讯详解
2017/09/10 Python
Python中pygal绘制雷达图代码分享
2017/12/07 Python
分析Python中解析构建数据知识
2018/01/20 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
CSS3不透明度实例讲解
2016/04/26 HTML / CSS
使用phonegap检测网络状态的方法
2017/03/30 HTML / CSS
入党积极分子思想汇报范文
2014/01/05 职场文书
产品质量承诺书
2014/03/27 职场文书
小学生评语集锦
2014/04/18 职场文书
主持人演讲稿
2014/05/13 职场文书
Golang标准库syscall详解(什么是系统调用)
2021/05/25 Golang
浅谈为什么我的 z-index 又不生效了
2022/07/15 HTML / CSS