一、介绍

    列表推导(list comprehensions)

    这是一种将for循环、if表达式以及赋值语句放到单一语句中的一种方法。换句话说,你能够通过一个表达式对一个列表做映射或过滤操作。

    一个列表推导式包含以下几个部分:

    1、一个输入序列

    2、一个表示输入序列成员的变量

    3、一个可选的断言表达式

    4、一个将输入序列中满足断言表达式的成员变换成输出列表成员的输出表达式

 二、举例

    假如需要从列表中将所有大于0的整数平方生成一个新的列表,你也许会这么写:

    

num_list = [11,2,-33,10,7,3,5,43]
squared_list = []
for num in num_list:
if num > 0:
squared_list.append(num**2)
print squared_list
# [121, 4, 100, 49, 9, 25, 1849]

    很简单是吧?但是这就会有4行代码,两层嵌套外加一个完全不必要的append操作。而如果使用filter、lambda和map函数,则能够将代码大大简化:

   

num_list = [11,2,-33,10,7,3,5,43]
squared_list = map(lambda x: x ** 2,filter(lambda x:x>0,num_list))
print squared_list
# [121, 4, 100, 49, 9, 25, 1849]

    下面使用列表推导

num_list = [11,2,-33,10,7,3,5,43]
squared_list = [x**2 for x in num_list if x >0]
print squared_list
# [121, 4, 100, 49, 9, 25, 1849]

  三、说明

    

    1、迭代器(iterator)遍历输入序列num的每个成员x

    2、断言式判断每个成员是否大于零

    3、如果成员大于零,则被交给输出表达式,平方之后成为输出列表的成员。

      列表推导式被封装在一个列表中,所以很明显它能够立即生成一个新列表。这里只有一个type函数调用而没有隐式调用lambda函数,列表推导式正是使用了一个常规的迭代器、一个表达式和一个if表达式来控制可选的参数。

    另一方面,列表推导也可能会有一些负面效应,那就是整个列表必须一次性加载于内存之中,这对上面举的例子而言不是问题,甚至扩大若干倍之后也都不是问题。但是总会达到极限,内存总会被用完。

    针对上面的问题,生成器(Generator)能够很好的解决。生成器表达式不会一次将整个列表加载到内存之中,而是生成一个生成器对象(Generator objector),所以一次只加载一个列表元素。

    生成器表达式同列表推导式有着几乎相同的语法结构,区别在于生成器表达式是被圆括号包围,而不是方括号,除非特殊的原因,应该经常在代码中使用生成器表达式。但除非是面对非常大的列表,否则是不会看出明显区别的。

num_list = [11,2,-33,10,7,3,5,43]
squared_list= list(x**2 for x in num_list if x >0)
print squared_list
# [121, 4, 100, 49, 9, 25, 1849]

    这比列表推导效率稍微提高一些,让我们再一次改造一下代码:

num_list = [11,2,-33,10,7,3,5,43]
def square_generator(p):
return list(x ** 2 for x in num_list if x > p) print square_generator(0)
# [121, 4, 100, 49, 9, 25, 1849]
print square_generator(10)
# [121, 1849]

python 推导式(Comprehensions)的更多相关文章

  1. python推导式pythonic必备【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  2. python推导式pythonic必备

    编程规范 今天公司新出了一套Python编程规范2.0,一直觉得自己写代码路子有点野,所以仔细的看了下. 多数的内容在网上都能搜到,但有几点需要说说 让我觉得羞愧的注释率 公司要求代码注释行,占代码总 ...

  3. Python推导式详解,带你写出比较精简酷炫的代码

    Python推导式详解,带你写出比较精简酷炫的代码 前言 1.推导式分类与用法 1.1 列表推导 1.2 集合推导 1.3 字典推导 1.4 元组推导?不存在的 2.推导式的性能 2.1 列表推导式与 ...

  4. Python推导式

    Python推导式 推导式:是Python中提供的一个非常方便的功能,可以通过一行代码实现创建 list.dict.tuple.set的同时初始化一些值. 1.列表推到式 # -*- coding: ...

  5. python推导式与海象运算符

    背景:介绍两种python用于语句优化的用法 一.推导式 1.推导式简介: Python 推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体. 支持:列表(list).元 ...

  6. Python—推导式

    推导式 推导式:comprehensions(又称解析式),是Python的一种独有特性,相当于语法糖的存在,推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 共有三种推导,在Python2 ...

  7. python 推导式和迭代器、生成器

    1.常用推导式 推导式是从一个或者多个迭代器快速简洁创建数据结构的一种方法. 1.1 _ 列表推导式 最简单的形式:  [exprssion for item in iterable] 示例:  nu ...

  8. python 推导式

    推导式又称解析式,是Python的一种独有特性.目的是可以从一个数据序列推导出另一个数据序列,适用于python 的list ,dict 和集合 list中的推导式: _list=[i for i i ...

  9. Python 推导式、迭代器、生成器、模块和包

    一.推导式 (一).列表推导式(集合推导式也同理于此) 利用列表推导式,取出1-20内所有偶数 li = [i for i in range(1, 21) if i % 2 == 0] # 如果只有一 ...

随机推荐

  1. 正则表达式 re模块 collections模块

    根据手机号码一共11位并且是只以13.14.15.18开头的数字这些特点,我们用python写了如下代码: while True: phone_number = input('please input ...

  2. 【转】使用者角度看bionic pthread_mutex和linux futex实现

    使用者角度看bionic pthread_mutex和linux futex实现 本文所大篇幅引用的参考文章主要描述针对glibc和pthread实现:而本文的考察代码主要是android的bioni ...

  3. mac air 装ubuntu16.04

    前言 我的mac air购于14年,128GB款.最开始我只是在OS X系统里留出了70GB给ubuntu,然后通过u盘装了ubuntu 14.04,后来又陆续将系统升级到15.04.16.04.各方 ...

  4. python基础===取txt文件的若干行到另一个文件

    #取txt文件 的若干行到另一个txt f1 = open(r'F:\movie.txt','rb') f2= open(r'F:\movie2.txt','ab') i=0 while True: ...

  5. 白话TCP三次握手

    在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握 ...

  6. [ Python - 7 ] 简单的省份查询系统

    主要是练习while 循环和 if 条件判断的使用 #!_*_coding:utf-8_*_ # Author: hkey def options(list): for i, v in enumera ...

  7. hdu 5748(LIS)

    Bellovin Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  8. (十一)mysql备份之物理备份xtrabackup

    (1)备份介绍 (2)下载安装xtrabackup 官网:https://www.percona.com/downloads/XtraBackup/LATEST/ 我选择yum安装,centos版本7 ...

  9. 安装Team Services Agent Win7

    现状:项目现时使用的是Team Services,使用Team Services可以控制其中的一台Build Server,从Github提取代码,并在Build Server进入编译打包处理(son ...

  10. LaTeX需要renewcommand的地方

    发现了两篇关于\renewcommand的文章,希望大家有更好的建议,请多多指教! 文章来源:http://blog.csdn.net/loveaborn/article/details/915205 ...