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 Web开发框架Django
Jun 30 Python
Python实现的ini文件操作类分享
Nov 20 Python
黑科技 Python脚本帮你找出微信上删除你好友的人
Jan 07 Python
Python工程师面试题 与Python Web相关
Jan 14 Python
Python中的迭代器与生成器高级用法解析
Jun 28 Python
pycharm+django创建一个搜索网页实例代码
Jan 24 Python
使用python将图片格式转换为ico格式的示例
Oct 22 Python
Python Numpy:找到list中的np.nan值方法
Oct 30 Python
python实现在cmd窗口显示彩色文字
Jun 24 Python
django 快速启动数据库客户端程序的方法示例
Aug 16 Python
python的等深分箱实例
Nov 22 Python
python中sort sorted reverse reversed函数的区别说明
May 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
不用mod_rewrite直接用php实现伪静态化页面代码
2008/10/04 PHP
解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别
2013/06/24 PHP
PHP使用GIFEncoder类处理gif图片实例
2014/07/01 PHP
php判断输入是否是纯数字,英文,汉字的方法
2015/03/05 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
PHP获取二叉树镜像的方法
2018/01/17 PHP
getElementByIdx_x js自定义getElementById函数
2012/01/24 Javascript
中国地区三级联动下拉菜单效果分析
2012/11/15 Javascript
JavaScript控制图片加载完成后调用回调函数的方法
2015/03/20 Javascript
javascript中createElement的两种创建方式
2015/05/14 Javascript
jQuery 自定义下拉框(DropDown)附源码下载
2016/07/22 Javascript
Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法
2016/12/31 Javascript
微信小程序 生命周期和页面的生命周期详细介绍
2017/01/19 Javascript
关于不同页面之间实现参数传递的几种方式讨论
2017/02/13 Javascript
Nginx 配置多站点vhost 的方法
2018/01/07 Javascript
Vue实现摇一摇功能(兼容ios13.3以上)
2021/01/26 Vue.js
python一键升级所有pip package的方法
2017/01/16 Python
Python中shape计算矩阵的方法示例
2017/04/21 Python
微信跳一跳python自动代码解读1.0
2018/01/12 Python
Python动刷新抢12306火车票的代码(附源码)
2018/01/24 Python
Python3实现的判断环形链表算法示例
2019/03/07 Python
python中matplotlib条件背景颜色的实现
2019/09/02 Python
基于python的BP神经网络及异或实现过程解析
2019/09/30 Python
tensorflow 模型权重导出实例
2020/01/24 Python
Python批量启动多线程代码实例
2020/02/18 Python
selenium与xpath之获取指定位置的元素的实现
2021/01/26 Python
浅析移动设备HTML5页面布局
2015/12/01 HTML / CSS
金牌葡萄酒俱乐部:Gold Medal Wine Club
2017/11/02 全球购物
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
高校毕业生自我鉴定
2013/10/27 职场文书
日语系毕业生推荐信
2013/11/11 职场文书
应届毕业生自我评价分享
2013/12/15 职场文书
小型女装店的创业计划书
2014/01/09 职场文书
工作态度恶劣检讨书
2015/05/06 职场文书
开会迟到检讨书范文
2015/05/06 职场文书
jQuery ajax - getScript() 方法和getJSON方法
2021/05/14 jQuery