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服务器与android客户端socket通信实例
Nov 12 Python
简单谈谈python中的语句和语法
Aug 10 Python
Python引用传值概念与用法实例小结
Oct 07 Python
浅析python协程相关概念
Jan 20 Python
基于Python中numpy数组的合并实例讲解
Apr 04 Python
基于python进行桶排序与基数排序的总结
May 29 Python
python如何基于redis实现ip代理池
Jan 17 Python
详解torch.Tensor的4种乘法
Sep 03 Python
Python编写万花尺图案实例
Jan 03 Python
matplotlib对象拾取事件处理的实现
Jan 14 Python
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
Jun 13 Python
python 中的jieba分词库
Nov 23 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设计模式 Delegation(委托模式)
2011/06/26 PHP
php实现json编码的方法
2015/07/30 PHP
php二维码生成以及下载实现
2017/09/28 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
Laravel 实现添加多语言提示信息
2019/10/25 PHP
img标签中onerror用法
2009/08/13 Javascript
打造基于jQuery的高性能TreeView(asp.net)
2011/02/23 Javascript
jQuery+css+html实现页面遮罩弹出框
2013/03/21 Javascript
iframe的父子窗口之间的对象相互调用基本用法
2013/09/03 Javascript
详解JS函数重载
2014/12/04 Javascript
AngularJS基础学习笔记之控制器
2015/05/10 Javascript
微信小程序引用公共js里的方法的实例详解
2017/08/17 Javascript
Vue-router路由判断页面未登录跳转到登录页面的实例
2017/10/26 Javascript
JS手机端touch事件计算滑动距离的方法示例
2017/10/26 Javascript
Python文件与文件夹常见基本操作总结
2016/09/19 Python
python递归打印某个目录的内容(实例讲解)
2017/08/30 Python
python取代netcat过程分析
2018/02/10 Python
Python利用正则表达式实现计算器算法思路解析
2018/04/25 Python
Tensorflow轻松实现XOR运算的方式
2020/02/03 Python
解决ROC曲线画出来只有一个点的问题
2020/02/28 Python
canvas实现有递增动画的环形进度条的实现方法
2019/07/10 HTML / CSS
html5移动端价格输入键盘的实现
2019/09/16 HTML / CSS
英国手工布艺沙发在线购买:Sofas & Stuff
2018/03/02 全球购物
美国渔具店:FishUSA
2019/08/07 全球购物
建筑毕业生自我鉴定
2013/10/18 职场文书
六五普法规划实施方案
2014/03/21 职场文书
拉拉队口号
2014/06/16 职场文书
招商引资工作汇报
2014/10/28 职场文书
就业推荐表自我评价范文
2015/03/02 职场文书
欧也妮葛朗台读书笔记
2015/06/30 职场文书
工程移交协议书
2016/03/24 职场文书
再读《皇帝的新衣》的读后感悟!
2019/08/07 职场文书
MySQL基础(一)
2021/04/05 MySQL
python实战之用emoji表情生成文字
2021/05/08 Python
十大最强岩石系宝可梦,怪颚龙实力最强,第七破坏力很强
2022/03/18 日漫
springboot 自定义配置 解决Boolean属性不生效
2022/03/18 Java/Android