列表推导式并不是什么特别的技术,它只是一种创建列表的简洁方法,目的是为了让大家写程序时更方便更快捷,写出更简洁的代码

初识列表

现在请创建一个list,元素为1到9的整数,先用普通方法做

lst = []

for i in range(10):

lst.append(i)

用了3行代码完成了这个功能,现在用列表推导式来做

lst = [i for i in range(10)]

仅仅是一行代码哦,一行代码就能解决的问题,就没必要用三行代码去做

创建一个列表,元素为10以内的偶数,方法1

lst = [i for i in range(2,10,2)]

方法2

lst = [i for i in range(2,10) if i%2 == 0]

小做总结

讲到这里,我必须稍微的做一个总结了,for语句前面的表达式,经过计算,最终留在新建的list列表中,for循环是一个不断取值的过程,而满足if语句的元素才有资格参与for语句前面的表达式计算。

我这样讲,可能你还是不能够理解,换一个新的例子,创建一个列表,元素为10以内偶数的平方

lst = [i*i for i in range(2,10) if i%2 == 0]

程序解读

* for 语句前面的表达式是i*i

* i 的值从2变化到9,但不是每一个i的值都会参加i*i的计算,i的值必须满足if条件语句才行

配合函数

for语句前面的表达式在某些情况下,仍然不能够满足实际需要,比如下面的要求,创建一个list,元素为10以内的偶数的平方,如果元素的个位数是6,则该元素的值转为字符串。

根据要求,新创建的列表内容应当为[4, '16', '36', 64],你现在知道for语句前面的内容是表达式,更进一步,他们是lambda表达式,关于这个概念,我后续会介绍,想要用lambda表达式来完成这个功能,是比较困难的,这种情况下,可以配合函数来做,代码如下

def func(i):

res = i * i

if res % 10 == 6:

return str(res)

return res

lst = [func(i) for i in range(2,10) if i % 2 == 0]

print lst

列表推导式更快

列表推导式不仅仅是让程序更简洁,其速度也比普通方法快,下面是一段测试比较代码

#coding=utf-8

import time

#装饰器函数

def timefunc(func):

def newfunc(*args,**kwargs):

t1 = time.time()

lst = func(*args,**kwargs)

t2 = time.time()

diff = t2 - t1

print u'{func}用时{diff}'.format(diff=diff,

func=func.func_name)

return lst

return newfunc

@timefunc

def func1(count):

lst = []

for i in range(count):

lst.append(i)

return lst

@timefunc

def func2(count):

lst = [i for i in range(count)]

return lst

count = 1000000

func1(count)

func2(count)

这段代码里用到了装饰器,后续我也会讲,程序运行的结果如下:

func1用时0.144474029541

func2用时0.0513877868652

可以明显的看到,使用列表推导式,创建相同内容的列表,要比普通方法快接近3倍的速度

列表推导式总结优点

1. 简洁

2. 高效

缺点

如果使用不当,会造成阅读困难。

写出别人难以理解的代码是非常容易的,如果再用心些,写出一份几天后自己都看不懂的代码也不是什么难事,真正难的是写出别人看得懂的代码,列表推导式虽然简洁,但一味的简洁,在推导式里写上一堆的代码,就造成理解困难,比如下面的题目:

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

将这个嵌套列表转成一维列表,转换后,列表内容为

[1, 2, 3, 4, 5, 6, 7, 8, 9]

如果用列表推导式,则可以这样写

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

b = [j for i in a for j in i]

print(b)

上面的代码我已经不想去解释了,如果是用普通方法,则可以这样写

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

b = []

for i in a:

for j in i:

b.append(j)

print b

这两份代码,你更喜欢用哪一个呢?成长离不开与优秀的同伴共同交流,如果你需要好的学习环境,好的学习资源,这里欢迎每一位热爱Python的小伙伴,Python学习圈

列表推导式 python原理_Python进阶-列表推导式详解总结相关推荐

  1. 列表推导式 python原理_python之列表推导式

    1. 定义 用一行构建代码 例题 # 构建一个1-100的列表 l1 = [i for i in range(1,101)] print(l1) # 输出结果 [1,2,3,4,5,6,...100] ...

  2. python程序间通信_python进程间通信Queue工作过程详解

    Process之间有时需要通信,操作系统提供了很多机制来实现进程间的通信. 1. Queue的使用 可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个 ...

  3. python解释器的工作原理_Python GIL全局解释器锁详解(深度剖析)

    通过前面的学习,我们了解了 Pyton 并发编程的特性以及什么是多线程编程.其实除此之外,Python 多线程还有一个很重要的知识点,就是本节要讲的 GIL. GIL,中文译为全局解释器锁.在讲解 G ...

  4. python时间戳_Python时间戳使用和相互转换详解

    本文实例为大家分享了Python时间戳使用和相互转换的具体代码,供大家参考,具体内容如下 1.将字符串的时间转换为时间戳 方法: import time a = "2013-10-10 23 ...

  5. python fixture_python pytest进阶之xunit fixture详解

    前言 今天我们再说一下pytest框架和unittest框架相同的fixture的使用, 了解unittest的同学应该知道我们在初始化环境和销毁工作时,unittest使用的是setUp,tearD ...

  6. python 加锁_Python 共享变量加锁、释放详解

    一.共享变量 共享变量:当多个线程访问同一个变量的时候.会产生共享变量的问题. 例子: import threading sum = 0 loopSum = 1000000 def myAdd(): ...

  7. python复制列表元素_Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解...

    Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解 概述 在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值.复制.浅 ...

  8. python中zip的使用_浅谈Python中的zip()与*zip()函数详解

    前言 1.实验环境: Python 3.6: 2.示例代码地址:下载示例: 3.本文中元素是指列表.元组.字典等集合类数据类型中的下一级项目(可能是单个元素或嵌套列表). zip(*iterables ...

  9. python中文编码-python中文编码与json中文输出问题详解

    前言 python2.x版本的字符编码有时让人很头疼,遇到问题,网上方法可以解决错误,但对原理还是一知半解,本文主要介绍 python 中字符串处理的原理,附带解决 json 文件输出时,显示中文而非 ...

最新文章

  1. 安装H3C的各种问题
  2. ssh tunnel 上网
  3. 读取字符串的长度,一个汉字,为两个字节
  4. 第二课--字符串类型及操作
  5. python 总结_python总结
  6. 面试时如何回答购物车测试步骤?
  7. 计算机英语中motherboard,计算机英语--Motherboard.doc
  8. python中的isinstance()使用方法[探索2]
  9. PHP程序员40点陋习
  10. BP神经网络(BPNN)
  11. ansys模型导入matlab,ANSYS导入MATLAB
  12. 计算机专业学习规划,计算机专业学习计划.doc
  13. Amino——框架层
  14. 使用protractor操作页面元素
  15. 第023封“情书”: 草书 Point Advection点的平流染色线
  16. 2.基础语法:手指抽筋模拟器
  17. 第9章 慕课网日志实战
  18. 大数据技术与应用-D1
  19. Debian 二进制文件(华文宋体字体)打包解包
  20. java fx 轮播_javafx实现轮播图

热门文章

  1. (解释)单片机与各种外围设备(Flash、RAM、网络控制器、A/D、传感器、MCU等)进行直接串行通信通常采用( D)接口
  2. python有哪些关键字?让他自己“吐”出来!
  3. 你了解如何评估模型吗?
  4. 【从零学习OpenCV 4】安装过程中问题解决方案
  5. 第五篇:协调和协定之选举算法
  6. excel函数简要使用
  7. Java重写父类使用@Override时出现The method destroy() of type xxx must override a superclass method的问题解决...
  8. __proto__和prototype
  9. 设计模式入门之原型模式Prototype
  10. NSNotification先注册监听,再发送消息