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查询sqlite数据表的方法
May 08 Python
python用10行代码实现对黄色图片的检测功能
Aug 10 Python
python版本的读写锁操作方法
Apr 25 Python
python3爬取数据至mysql的方法
Jun 26 Python
python中PS 图像调整算法原理之亮度调整
Jun 28 Python
Django使用模板后无法找到静态资源文件问题解决
Jul 19 Python
python中的Elasticsearch操作汇总
Oct 30 Python
Python通过递归获取目录下指定文件代码实例
Nov 07 Python
python 安装移动复制第三方库操作
Jul 13 Python
Python 如何创建一个简单的REST接口
Jul 30 Python
Python djanjo之csrf防跨站攻击实验过程
May 14 Python
什么是Python装饰器?如何定义和使用?
Apr 11 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
mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法
2007/03/15 PHP
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
2011/03/19 PHP
深入解析PHP中的(伪)多线程与多进程
2013/07/01 PHP
谈谈PHP连接Access数据库的注意事项
2016/08/12 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2006/11/24 Javascript
js异常捕获方法介绍
2013/04/10 Javascript
关于onchange事件在IE和FF下的表现及解决方法
2014/03/08 Javascript
Ext修改GridPanel数据和字体颜色、css属性等
2014/06/13 Javascript
Node.js中使用事件发射器模式实现事件绑定详解
2014/08/15 Javascript
a标签跳转到指定div,jquery添加和移除class属性的实现方法
2016/10/10 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
微信小程序block的使用教程
2018/04/01 Javascript
koa上传excel文件并解析的实现方法
2018/08/09 Javascript
Koa 使用小技巧(小结)
2018/10/22 Javascript
Vue.js的复用组件开发流程完整记录
2018/11/29 Javascript
Bootstrap实现模态框效果
2019/09/30 Javascript
vue配置多代理服务接口地址操作
2020/09/08 Javascript
基于JS实现操作成功之后自动跳转页面
2020/09/25 Javascript
Python多线程编程(七):使用Condition实现复杂同步
2015/04/05 Python
介绍Python的@property装饰器的用法
2015/04/28 Python
Python中类的初始化特殊方法
2017/12/01 Python
解决Python二维数组赋值问题
2019/11/28 Python
python实现在线翻译功能
2020/03/03 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
2020/05/26 Python
基于python实现操作redis及消息队列
2020/08/27 Python
HTML5 video播放器全屏(fullScreen)方法实例
2015/04/24 HTML / CSS
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
销售找工作求职信
2013/12/20 职场文书
敬老文明号事迹材料
2014/01/16 职场文书
公司晚会策划方案
2014/05/17 职场文书
质量标语大全
2014/06/12 职场文书
护士年终考核评语
2014/12/31 职场文书
道歉信范文
2015/05/12 职场文书
建筑工程催款函
2015/06/24 职场文书
MySQL脏读,幻读和不可重复读
2022/05/11 MySQL