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编程过程中用单元测试法调试代码的介绍
Apr 02 Python
利用aardio给python编写图形界面
Aug 21 Python
python使用fork实现守护进程的方法
Nov 16 Python
python 实现返回一个列表中出现次数最多的元素方法
Jun 11 Python
Python 类方法和实例方法(@classmethod),静态方法(@staticmethod)原理与用法分析
Sep 20 Python
numpy按列连接两个维数不同的数组方式
Dec 06 Python
使用TensorFlow搭建一个全连接神经网络教程
Feb 06 Python
Django 设置多环境配置文件载入问题
Feb 25 Python
python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)
Mar 09 Python
基于Python实现视频的人脸融合功能
Jun 12 Python
如何用用Python将地址标记在地图上
Feb 07 Python
python切片作为占位符使用实例讲解
Feb 17 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简单命令代码集锦
2007/09/24 PHP
php str_pad 函数使用详解
2009/01/13 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
2014/07/22 PHP
PHP面向对象程序设计之类常量用法实例
2014/08/20 PHP
typecho插件编写教程(四):插件挂载
2015/05/28 PHP
thinkphp多层MVC用法分析
2015/12/30 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
php插件Xajax使用方法详解
2017/08/31 PHP
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
2012/07/31 Javascript
Three.js源码阅读笔记(基础的核心Core对象)
2012/12/27 Javascript
js控制的回到页面顶端goTop的代码实现
2013/03/20 Javascript
jQuery中:last-child选择器用法实例
2014/12/31 Javascript
Javascript中判断对象是否为空
2015/06/10 Javascript
js鼠标点击图片切换效果代码分享
2015/08/26 Javascript
微信小程序 生命周期函数详解
2017/05/24 Javascript
vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
2018/11/08 Javascript
js简单遍历获取对象中的属性值的方法示例
2019/06/19 Javascript
vue 实现购物车总价计算
2019/11/06 Javascript
python正则表达式修复网站文章字体不统一的解决方法
2013/02/21 Python
Python使用multiprocessing创建进程的方法
2015/06/04 Python
横向对比分析Python解析XML的四种方式
2016/03/30 Python
Python使用filetype精确判断文件类型
2017/07/02 Python
纯用NumPy实现神经网络的示例代码
2018/10/24 Python
Python数据报表之Excel操作模块用法分析
2019/03/11 Python
如何使用pyinstaller打包32位的exe程序
2019/05/26 Python
使用python 将图片复制到系统剪贴中
2019/12/13 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
2020/02/25 Python
Python while true实现爬虫定时任务
2020/06/08 Python
pycharm配置python 设置pip安装源为豆瓣源
2021/02/05 Python
Marriott中国:万豪国际酒店查询预订
2016/09/02 全球购物
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
凯伦·米莲女装网上商店:Karen Millen
2017/11/07 全球购物
龟牌英国商店:Turtle Wax Brand Store UK
2019/07/02 全球购物
物业管理专业个人的自我评价
2013/11/19 职场文书
《童年的发现》教学反思
2014/02/14 职场文书
vue使用echarts实现折线图
2022/03/21 Vue.js