推导表达式其实就是简化一些循环判断操作等

生成一个数字1-10的列表,可以有多少种方法?

  1. >>> l = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
  2. >>> l
  3. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  4. >>>
  1. >>> l = []
  2. >>> for x in range( 1, 11 ):
  3. ... l.append( x )
  4. ...
  5. >>> l
  6. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  7. >>>
  1. >>> l = range( 1, 11 )
  2. >>> l
  3. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  4. >>>

现在看下推导表达式

  1. >>> a = [ x for x in range( 1, 11 ) ]
  2. >>> a
  3. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  4. >>>

有些人,可能会说,直接range( 1, 11 )就好了,多此一举,如果我们要筛选出奇数?

当然,range依然能够做到:

  1. >>> range( 1, 11, 2 )
  2. [1, 3, 5, 7, 9]
  3. >>>

那,如果要得到偶数,需要遍历每一项,判断

  1. >>> a = []
  2. >>> for x in range( 1, 11 ):
  3. ... if x % 2 == 0:
  4. ... a.append( x )
  5. ...
  6. >>>
  7. >>> a
  8. [2, 4, 6, 8, 10]
  9. >>>

他等价于如下的推导表达式:

  1. >>> b = [ x for x in range( 1, 11 ) if x % 2 == 0 ]
  2. >>> b
  3. [2, 4, 6, 8, 10]
  4. >>>

一句话搞定

生成一个坐标系?

  1. >>> dot = [(x,y) for x in range( 1, 10 ) for y in range( 1, 10 ) ]
  2. >>> dot
  3. [(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (5, 7), (5, 8), (5, 9), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6), (6, 7), (6, 8), (6, 9), (7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (7, 7), (7, 8), (7, 9), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (8, 8), (8, 9), (9, 1), (9, 2), (9, 3), (9, 4), (9, 5), (9, 6), (9, 7), (9, 8), (9, 9)]
  4. >>>

等价于,如下2重循环:

  1. >>> dot = []
  2. >>> for x in range( 1, 10 ):
  3. ... for y in range( 1, 10 ):
  4. ... dot.append( ( x, y ) )
  5. ...
  6. >>> dot
  7. [(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (5, 7), (5, 8), (5, 9), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6), (6, 7), (6, 8), (6, 9), (7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (7, 7), (7, 8), (7, 9), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (8, 8), (8, 9), (9, 1), (9, 2), (9, 3), (9, 4), (9, 5), (9, 6), (9, 7), (9, 8), (9, 9)]
  8. >>>

生成一个递增字符串列表:

  1. >>> ['the number:%s' % n for n in range( 1, 10 ) ]
  2. ['the number:1', 'the number:2', 'the number:3', 'the number:4', 'the number:5', 'the number:6', 'the number:7', 'the number:8', 'the number:9']

求1-9每个数的平方

  1. >>> [x ** 2 for x in range( 1, 10 ) ]
  2. [1, 4, 9, 16, 25, 36, 49, 64, 81]
  3. >>>

用字典打包一层,相同的键后面会覆盖前面的

  1. >>> dict( [( x, y ) for x in range( 1, 5 ) for y in range( 1, 5 )] )
  2. {1: 4, 2: 4, 3: 4, 4: 4}
  3. >>> [( x, y ) for x in range( 1, 5 ) for y in range( 1, 5 )]
  4. [(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4), (3, 1), (3, 2), (3, 3), (3, 4), (4, 1), (4, 2), (4, 3), (4, 4)]

列表的引用,跟javascript类型:

  1. >>> l = ['my', 'name', 'is', 'ghostwu' ]
  2. >>> l
  3. ['my', 'name', 'is', 'ghostwu']
  4. >>> a = l
  5. >>> a[3] = 'wukong'
  6. >>> l
  7. ['my', 'name', 'is', 'wukong']
  8. >>> del a
  9. >>> l
  10. ['my', 'name', 'is', 'wukong']
  11. >>> a
  12. Traceback (most recent call last):
  13. File "<stdin>", line 1, in <module>
  14. NameError: name 'a' is not defined
  15. >>>

del a,删除的是 列表的引用,跟php垃圾回收机制类似,两个变量指向一个列表,删除其中一个,但是另一个还是指向那个列表.

  1. >>> a = [10, 20, 30 ]
  2. >>> b = a
  3. >>> b
  4. [10, 20, 30]
  5. >>> del a
  6. >>> a
  7. Traceback (most recent call last):
  8. File "<stdin>", line 1, in <module>
  9. NameError: name 'a' is not defined
  10. >>> b
  11. [10, 20, 30]
  12. >>>

del a[], 这个指的是清空列表

  1. >>> a = [ 10, 20, 30 ]
  2. >>> b = a
  3. >>> del a[:]
  4. >>>
  5. >>> a
  6. []
  7. >>> b
  8. []
  9. >>>

python中强大优雅的列表推导表达式的更多相关文章

  1. python中字典排序,列表中的字典排序

    python中字典排序,列表中的字典排序 一.使用python模块:operator import operator #首先要导入模块operator x = {1:2, 3:4, 4:3, 2:1, ...

  2. Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数

    Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: ​ 就是迭代器 生成器产生的方式: ​ 1.生成器函数

  3. python全栈开发- day14列表推导式、生成器表达式、模块基础

    一.列表推导式 #1.示例 数据量小 egg_list=[] for i in range(10): egg_list.append('鸡蛋%s' %i) egg_list=['鸡蛋%s' %i fo ...

  4. python基础(14):生成器、列表推导式

    1. 生成器 什么是⽣成器?⽣成器实质就是迭代器. 在python中有三种⽅式来获取⽣成器: 1. 通过⽣成器函数 2. 通过各种推导式来实现⽣成器 3. 通过数据的转换也可以获取⽣成器 ⾸先,我们先 ...

  5. python序列(八)列表推导式实列

    1.列表推导式列表推导能非常简洁的构成一个新列表:只用一条简洁的表达式即可对得到的元素进行转换变形. 格式:[表达式 for 变量 in 列表]或[表达式 for 变量 in 列表 if 条件] 过滤 ...

  6. 《Python CookBook2》 第四章 Python技巧 对象拷贝 && 通过列表推导构建列表

    (先学第四章) 对象拷贝 任务: Python通常只是使用指向原对象的引用,并不是真正的拷贝. 解决方案: >>> a = [1,2,3] >>> import c ...

  7. python 学习笔记二 (列表推导式)

    2018年年初写了第一篇博客,说要做一个认真的技术人 https://www.cnblogs.com/yingchen/p/8455507.html 今天已经是11月19日了,这是第二篇博客,看来坚持 ...

  8. Python 中更优雅的日志记录方案

    在 Python 中,一般情况下我们可能直接用自带的 logging 模块来记录日志,包括我之前的时候也是一样.在使用时我们需要配置一些 Handler.Formatter 来进行一些处理,比如把日志 ...

  9. Python的高级特性2:列表推导式,生成器与迭代器

    一.列表推导式 1.列表推导式是颇具python风格的一种写法.这种写法除了高效,也更简短. In [23]: {i:el for i,el in enumerate(["one" ...

随机推荐

  1. springBoot2 基础语法

    请求响应 request对象 request 对象其实是HttpServletRequest 类型, 通过它可以获取请求相关的一切信息, 包含请求信息 . 以及请求参数 ,甚至可以当成往里面存储数据[ ...

  2. ProxySQL 部署 Single Writer Failover 读写分离 (PXC)

    主机信息: Proxysql: 如果你忽略了ProxySQL会报告主机组的变化,我建议把它设置为0,除非你试图调试"某些东西",否则你的日志将很快变得巨大.UPDATE globa ...

  3. 13-01 java StringBuffer类,StringBuilder类

    StringBuffer类的构造方法 package cn.itcast_01; /* * 线程安全(多线程讲解) * 安全 -- 同步 -- 数据是安全的 * 不安全 -- 不同步 -- 效率高一些 ...

  4. odoo开发笔记-- 按钮动作跳转到其他列表视图默认搜索

    按钮动作跳转到其他列表视图 按照默认指定的条件搜索显示. 效果: 实现方式:

  5. 课程二(Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization),第一周(Practical aspects of Deep Learning) —— 4.Programming assignments:Gradient Checking

    Gradient Checking Welcome to this week's third programming assignment! You will be implementing grad ...

  6. numpy.squeeze()的用法

    import numpy as np x = np.array([[[0], [1], [2]]]) print(x) """x= [[[0] [1] [2]]] &qu ...

  7. Zookeeper配置文件中的配置项解释和Zookeeper的安装

    zookeeper的默认配置文件为zookeeper/conf/zoo_sample.cfg,需要将其修改为zoo.cfg.其中各配置项的含义,解释如下: 1.tickTime:CS通信心跳时间Zoo ...

  8. iOS事件分发

    前段时间项目有一个需求,要在点击闪屏的时候做一些处理,刚接到这个需求觉得很简单啊,在原有的view上加个button或者手势识别啥的,后面实现的时候发现还是有点坑.无论我在闪屏上面加button还是手 ...

  9. NHibernate 有好几种数据库查询方式

    NHibernate 有好几种数据库查询方式 1.原生SQL var employeeQuery = Database.Session .CreateSQLQuery("select * f ...

  10. Apache运维中常用功能配置笔记梳理

    Apache 是一款使用量排名第一的 web 服务器,LAMP 中的 A 指的就是它.由于其开源.稳定.安全等特性而被广泛使用.下边记录了使用 Apache 以来经常用到的功能,做此梳理,作为日常运维 ...