热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python高级条件语句与语法精讲:深入解析列表、字典、集合推导式及生成器表达式

思维导图导读Python是一门优雅的编程语言,总是用优美的方法地简化代码、执行高效。一、理解3个概念1、comprehension译作理解、理解力、࿰

思维导图导读

1538578-20181120164107865-448189324.png

Python是一门优雅的编程语言,总是用优美的方法地简化代码、执行高效。

一、理解3个概念

1、comprehension

译作 理解、理解力、(语言学习中的)理解联系(或训练)。根据维基百科解释:在编程语言(不限于Python)中,comprehension是一种语法结构,功能是基于已有的一个数据序列经过“过滤”(满足一定条件)生成一个新的数据序列。

其本质是一种遍历方式,但它执行速度比for循环、map快35-45%。工作方式类似于for循环。

2、Python 可变、不可变:

不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。

可变对象,该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变。

推导式操作的对象是 可变对象。

3、6种Python标准数据类型:

不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);

可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。

推导式操作的数据对象是 可变数据。

二、详述三种推导式、一种生成器表达式

1、列表推导式(list comprehension,LC)

将一个列表经过过滤后转换成另一个列表。语法:

[表达式 for 变量 in 列表] Or [表达式 for 变量 in 列表 if条件]Or

[表达式部分 列表生成部分 过滤部分(可选)] Or [满足条件的元素相关操作 for 元素 in 可迭代数据类型 if 元素相关的条件]

表达式部分:一般是一个表达式作用一个列表的元素;或 只是接受导出的元素,没有表达式;

列表生成部分:一般是一个for循环产生初始列表,并依次导出元素;

过滤部分:一般由一个if判断构成,条件为假的过滤掉。这部分可选。

举例1:生成一个由0-9的平方组成的列表

方案1、用for循环

>>> squares =[]>>> for x in range(10):

... squares.append(x**2)

...>>>squares

[0,1, 4, 9, 16, 25, 36, 49, 64, 81]

>>> x

9

这创建的名为x的变量,在循环结束后仍然存在。可以用“无副作用”的方式生成一个平方值的列表,如下:方案2

>>> squares = list(map(lambda x: x**2, range(10)))>>>squares

[0,1, 4, 9, 16, 25, 36, 49, 64, 81]>>>x

Traceback (most recent call last):

File"", line 1, in NameError: name'x' is not defined

方案3:list comprehesion

>>> squares = [x**2 for x in range(10)]>>>squares

[0,1, 4, 9, 16, 25, 36, 49, 64, 81]

>>> x # 也是有“副作用”的

9

其中方案3是最简洁、易读的。列表推导式由括号中的表达式+for子句(甚至嵌套列表推导式,它本质是个列表)组成,后边可以跟更多的for循环或if条件(过滤条件),结果是生成一个由表达式、for或if语句运算得出的新列表。

>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x!=y]

[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

若用for循环来做将是:

>>> combs =[]>>> for x in [1,2,3]:

...for y in [3,1,4]:

...if x !=y:

... combs.append((x,y))

...>>>combs

[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

这不符合Python优雅气质。

举例2:将一个3x4矩阵变成4x3矩阵

>>> matrix =[

... [1,2,3,4],

... [5,6,7,8],

... [9,10,11,12],

... ]>>> [[row[i] for row in matrix] for i in range(4)]

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

如果用for循环完成,将是多少行语句。LC是更简单有效的强力工具。LC总是返回一个结果,无论是否用到它。

2、生成器表达式

将列表推导式的 [] 改成 () 就得到生成器表达式。

生成器中的值只能按顺序调用一次,只能向前,不能后退。其工作方式是每次处理一个对象,而不是一次性处理和构造整个数据结构,优点是可以节省大量内存。因此,在处理大量数据时,建议使用生成器表达式,而不是列表推导式。生成器表达式结构:

生成器=(返回结构 执行对象 if 判断条件)

举例:得到30以内能被3整除的数。

>>> multiples = (i for i in range(30) if i%3 is0)>>>multiples at 0x7f2506c4d9b0>

>>>type(multiples)

>>> for i inmultiples:

...print(i)

...

03

6

9

12

15

18

21

24

27

3、字典推导式

字典推导式,跟列表推导式的使用方法是类似的。只是将中括号[] 改成了 花括号{}。

举例:快速更换key、value。

>>> d = {'a':1, 'b':2}>>> d = {v:k for k,v ind.items()}>>>d

{1: 'a', 2: 'b'}

4、集合推导式

集合推导式,跟列表推导式也是类似的。唯一的区别是使用花括号。

集合自带去重功能,如果计算得出的元素有重复值,在集合中一个值只会录入一个元素。

>>> s = {1,2,3,4,5,6}>>> s = {i**2 for i in s if i%2==0}>>> print(s)

set([16, 36, 4])

总结,这些推导式语法结构上的高度相似的、可举一反三,代码简洁、优雅、高效。



推荐阅读
  • 社交网络中的级联行为 ... [详细]
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • 本文介绍了如何在多线程环境中实现异步任务的事务控制,确保任务执行的一致性和可靠性。通过使用计数器和异常标记字段,系统能够准确判断所有异步线程的执行结果,并根据结果决定是否回滚或提交事务。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 本文介绍了SVD(奇异值分解)和QR分解的基本原理及其在Python中的实现方法。通过具体代码示例,展示了如何使用这两种矩阵分解技术处理图像数据和计算特征值。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • Python实现斐波那契数列的方法与优化
    本文详细介绍了如何在Python中编写斐波那契数列,并探讨了不同的实现方法及其性能优化。通过递归、迭代和公式法,读者可以了解每种方法的优缺点,并选择最适合自己的实现方式。 ... [详细]
  • 本文介绍了如何利用Python进行批量图片尺寸调整,包括放大和等比例缩放。文中提供了详细的代码示例,并解释了每个步骤的具体实现方法。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • C/C++ 指针操作解析:双向链表中元素的取消链接
    本文详细解释了在C语言中使用指针进行双向链表元素取消链接的操作,探讨了`next->prev`和`prev`之间的关系,并提供了代码示例和可视化辅助理解。 ... [详细]
  • Nginx 反向代理与负载均衡实验
    本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
  • 本文探讨了如何在 F# Interactive (FSI) 中通过 AddPrinter 和 AddPrintTransformer 方法自定义类型(尤其是集合类型)的输出格式,提供了详细的指南和示例代码。 ... [详细]
author-avatar
前前后后zzyyix
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有