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随机生成手机号、数字的方法详解
Jul 21 Python
python修改list中所有元素类型的三种方法
Apr 09 Python
基于python批量处理dat文件及科学计算方法详解
May 08 Python
基于DataFrame筛选数据与loc的用法详解
May 18 Python
Python pandas用法最全整理
Aug 04 Python
python super用法及原理详解
Jan 20 Python
python等差数列求和公式前 100 项的和实例
Feb 25 Python
Python多线程实现支付模拟请求过程解析
Apr 21 Python
Python调用shell命令常用方法(4种)
May 11 Python
Django Path转换器自定义及正则代码实例
May 29 Python
pytorch中的model=model.to(device)使用说明
May 24 Python
python字符串的多行输出的实例详解
Jun 08 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设置编码格式的方法
2013/03/05 PHP
yii实现图片上传及缩略图生成的方法
2014/12/04 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
php读取csc文件并输出
2015/05/21 PHP
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
基于javascript制作微信聊天面板
2020/08/09 Javascript
浅谈Javascript数组(推荐)
2016/05/17 Javascript
使用Ajax生成的Excel文件并下载的实例
2016/11/21 Javascript
JS数组搜索之折半搜索实现方法分析
2017/03/27 Javascript
JavaScript对象_动力节点Java学院整理
2017/06/23 Javascript
vue源码入口文件分析(推荐)
2018/01/30 Javascript
js中call()和apply()改变指针问题的讲解
2019/01/17 Javascript
vue中datepicker的使用教程实例代码详解
2019/07/08 Javascript
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
Python程序员开发中常犯的10个错误
2014/07/07 Python
Python聚类算法之凝聚层次聚类实例分析
2015/11/20 Python
python数据处理之如何选取csv文件中某几行的数据
2019/09/02 Python
pygame实现成语填空游戏
2019/10/29 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
2020/03/07 Python
Django QuerySet查询集原理及代码实例
2020/06/13 Python
python字符串的index和find的区别详解
2020/06/20 Python
神经网络训练采用gpu设置的方式
2021/03/03 Python
WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用?
2015/08/25 面试题
求职自荐书范文
2013/12/04 职场文书
人事助理自荐信
2014/02/02 职场文书
优秀研究生主要事迹
2014/06/03 职场文书
单位消防安全责任书
2014/07/23 职场文书
竞选班干部演讲稿600字
2014/08/20 职场文书
红领巾广播站广播稿
2014/10/19 职场文书
督导岗位职责范本
2015/04/10 职场文书
小兵张嘎观后感300字
2015/06/03 职场文书
酒店宣传语大全
2015/07/13 职场文书
MySQL中order by的执行过程
2022/06/05 MySQL
Android中的Launch Mode详情
2022/06/05 Java/Android
Python自动操作神器PyAutoGUI的使用教程
2022/06/16 Python
Win10多屏显示如何设置?Win10电脑多屏显示设置操作方法
2022/07/07 数码科技