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 struct模块解析
Jun 12 Python
Python本地与全局命名空间用法实例
Jun 16 Python
python机器学习理论与实战(六)支持向量机
Jan 19 Python
django中静态文件配置static的方法
May 20 Python
python多个模块py文件的数据共享实例
Jan 11 Python
解决Python3 被PHP程序调用执行返回乱码的问题
Feb 16 Python
python线程池如何使用
May 28 Python
浅谈python量化 双均线策略(金叉死叉)
Jun 03 Python
用python写爬虫简单吗
Jul 28 Python
python 绘制正态曲线的示例
Sep 24 Python
Python中os模块的简单使用及重命名操作
Apr 17 Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 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字符串函数学习之strstr()
2015/03/27 PHP
php中的抽象方法和抽象类
2017/02/14 PHP
php nginx 实时输出的简单实现方法
2018/01/21 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
js兼容的placeholder属性详解
2013/08/18 Javascript
jQuery使用andSelf()来包含之前的选择集
2014/05/19 Javascript
jQuery实现类似标签风格的导航菜单效果代码
2015/08/25 Javascript
JavaScript中的ParseInt(&quot;08&quot;)和“09”返回0的原因分析及解决办法
2016/05/19 Javascript
JS实现刷新父页面不弹出提示框的方法
2016/06/22 Javascript
vue.js实例对象+组件树的详细介绍
2017/10/20 Javascript
nodejs中安装ghost出错的原因及解决方法
2017/10/23 NodeJs
Vue iview-admin框架二级菜单改为三级菜单的方法
2018/07/03 Javascript
vue项目刷新当前页面的三种方法
2018/12/04 Javascript
微信小程序使用二次贝塞尔曲线画波浪
2018/12/25 Javascript
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
如何用JS模拟实现数组的map方法
2020/07/30 Javascript
python实现批量下载新浪博客的方法
2015/06/15 Python
详解Python的Django框架中的中间件
2015/07/24 Python
一步步解析Python斗牛游戏的概率
2016/02/12 Python
解决python3在anaconda下安装caffe失败的问题
2017/06/15 Python
python 正确保留多位小数的实例
2018/07/16 Python
Python3获取电脑IP、主机名、Mac地址的方法示例
2019/04/11 Python
python编写简单端口扫描器
2019/09/04 Python
Python第三方库的几种安装方式(小结)
2020/04/03 Python
python高级特性简介
2020/08/13 Python
教师师德教育的自我评价
2013/10/31 职场文书
医学院校毕业生自荐信范文
2014/01/01 职场文书
小学生国旗下演讲稿
2014/04/25 职场文书
学校课外活动总结
2014/05/08 职场文书
幼儿园家长安全责任书
2014/07/22 职场文书
新疆民族团结演讲稿
2014/08/27 职场文书
2014年护士个人工作总结
2014/11/11 职场文书
十佳少年事迹材料
2014/12/25 职场文书
节约用电通知
2015/04/25 职场文书
golang中字符串MD5生成方式总结
2021/07/04 Golang
Win10服务主机占用内存怎么办?Win10服务主机进程占用大量内存解决方法
2022/09/23 数码科技