热门标签 | 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])

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



推荐阅读
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文介绍如何使用 Python 编写程序,检查给定列表中的元素是否形成交替峰值模式。我们将探讨两种不同的方法来实现这一目标,并提供详细的代码示例。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
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社区 版权所有