python中序列类型和数组之间的区别_「Python」序列构成的数组

一、Python 标准库的序列类型分为:

容器序列:

能够存放不同类型数据的序列(list、tuple、collections.deque)。

扁平序列:

只能容纳一种类型的数据(str、bytes、bytearray 和 array.array)。

其中,容器序列存放的是它们所包含的任意类型的对象的引用,而扁平序列存放的是值而不是引用。换句话说,扁平序列是一段连续的内存空间,更加紧凑,但其内只能存放如数值、字符和字节等基础类型。

二、而依据序列能否被修改,还能分为:

可变序列:

list、bytearray、array.array、collections.deque等。

不可变序列:

tuple、str和bytes。

序列可不可变指的是序列的大小与其存储的值可不可变。如元组,虽然不可变,但其可变对象元素是可变的,因元组里存储的“值”是引用,即该元素指向哪个对象是不可变的,但指向的对象本身是允许改变的。

文章目录

一、列表推导与生成器表达式

1.列表推导

2.生成器表达式

3.区别

二、元组

1.元组拆包

2.处理多余值

3.嵌套元组拆包

4.具名元组

三、切片

1.多维切片

2.切片赋值

四、对序列使用+和*

1.增量赋值

五、序列排序

一、列表推导与生成器表达式

列表推导用于便捷地构建列表,生成器表达式可用于构建任何类型的序列。

1.列表推导

基本形式:[ obj for x1 in iter1 for x2 in iter2 for .... ],其中obj为使用x1、x2、…表示的对象,可以为元组、字典或可调用对象等,iter1、iter2、…为可迭代对象,用于产出值。最终的结果为由obj对象实例构成的数组。

列表推导只用于生成列表,若要构建其他类型的序列,则需要使用生成器表达式。

2.生成器表达式

生成器表达式可用于构建任意类型的序列(将生成器表达式传入对应的构造函数),生成器表达式的语法跟列表推导差不多,只不过将[]换为()。

dict((x,y) for x in range(3) for y in "ABC")

>> {1: 'C', 2: 'C', 3: 'C'}

且若生成器表达式为一个函数调用中的唯一参数,则不需要再额外使用括号。

3.区别

列表推导会一次性生成含有 n 个元素列表,受限于内存,列表推导存在内存不足的风险。

而生成器表达式只在每次for循环运行时才生成一个组合,省去运行时的内存开销。故在初始化除列表之外的序列,使用生成器表达式能够省去额外的内存占用。

句法提示:Python会忽略[]、{}、()中的换行,在其内可以省略续行符\。

二、元组

把元组用作记录:元组其实是对数据的记录,元组中元素的信息蕴含了一个字段的数据与该字段的位置。将元组当作字段的集合能够充分利用元组的数量与位置信息。

如:

city,year,pop,chg,area = ("Tokyo",2003,32450,0.66,8014)

以上将元组用作一条数据的记录,充分利用了元组的记录数据与记录位置功能。

1.元组拆包

应用:

平行赋值,将一个可迭代对象里的元素,一并赋值到由对应变量组成的元组;

字符串格式化时,一个占位符对应一个元组里的元素。

用例:

# 交换两个变量的值

a,b = b,a

使用元组拆包可以将可迭代对象拆开作为函数的多个参数:

t = (2,3)

add(*t)

>> 5

也可以借助元组拆包从函数中返回多个值:

# func为返回长度为3的元组的函数

a,b,c = func()

2.处理多余值

元组拆包可以用于任何可迭代对象上,前提是平行赋值时对应的元素数量一致,除非用*来收集多余元素。其中*前缀只能用于一个变量名前,但是该变量可以出现在赋值表达式的任意位置。

a,b,*rest = (1,2,3,4,5,6,7)

# a=1, b=2, rest=[3,4,5,6,7]

a,*rest,b = (1,2,3,4,5,6,7)

# a=1, rest=[2,3,4,5,6], b=7

同时也可以使用占位符_(本质上也是一个变量)来处理拆包时不需要的数据。

3.嵌套元组拆包

接收表达式的元组可以是嵌套式的,只要这个接收元组的嵌套结构符合表达式的嵌套结构,Python 就可做出正确对应:

(a,(b,c),d)=(1,(2,3),4)

# a=1, b=2, c=3, d=4

4.具名元组

collections.namedtuple是一个工厂函数,其返回一个类并构建一个带名字的元组:

from collections import namedtuple

City = namedtuple('city','name country population')

# 构建City类,该类的实例为一个名为city的元组,且元素中每个元素都有对应的名字

tokyo = City("Tokyo","JP","36,933")

tokyo

>> city("Tokyo","JP","36,933")

tokyo.country

>> "JP"

构建一个具名元组类需要两个参数:一个是元组名,另一个是类的各个对应字段的名字。后者可以是数个字符串组成的可迭代对象,也可以是由空格分开的字段名组成的字符串。然后其返回一个类,该类用以构造具名元组。

获取字段信息可以通过索引,也可以以属性的形式通过字段名访问。

具名元组独有的属性:

_fields类属性:一个包含该类所有字段名称的元组;

_make(iterable)类方法:接收可迭代对象生成类的实例,作用相当于City(*iterable);

_asdict()实例方法:将具名元组以collections.OrderdDict的形式返回。

namedtuple构建的类的实例所消耗的内存与元组一样,因为字段名都被存在对应的类里(类属性)。

三、切片

切片的基本形式:[a:b[:c]],表示在a和b之间以c为间隔取值,其中c可选,也可为负,若为负则表示反向取值。

而Python 中切片其实是一个slice切片对象的实例。类似[a:b:c]返回一个切片对象:slice(a,b,c)。

1.多维切片

[]里还可以使用逗号分开的索引或切片。要正确地处理这种关系,需要自定义特殊方法__geiitem__、__setitem__以元组的形式接收a[i,j]中的索引。即要得到a[i,j]的值,Python会调用a.__getitem__(i,j)。

a[i,j]!=a[i][j],即前者需要自定义特殊方法实现,后者是用来处理多维序列的。

多维索引与多维切片的做法主要是为了支持自定义拓展,标准库中并没有相关用法。

2.切片赋值

切片不止可以用于提取序列内容,对于可变序列,若将切片放在赋值语句左边,或作为del的操作对象,就可以对序列进行就地修改操作。

示例:

l = list(range(10))

l[2:5] = [20,30]

l

>> [0,1,20,30,5,6,7,8,9]

del l[5:7]

l

>> [0,1,20,30,5,8,9]

如果赋值的对象是一个切片,则赋值语句的右侧必须是个可迭代对象。即便是由单独一个值,也要把它转换成可迭代对象。

四、对序列使用+和*

对于序列可以使用+进行拼接、使用*进行重复,这两个运算符是产生一个新的序列而不修改原有对象。

对a*n,若a含有对其他对象的引用,则需要特别注意,产生的结果中多个元素可能会共享引用。

1.增量赋值

增量赋值运算符+=与*=的表现取决于它们的第一个操作对象。 对于表达式a += b:

如果a实现了__iadd__(就地加法),则会调用这个方法;

若没有__iadd__,则会调用__add__,此时表达式的效果等于a = a + b,首先运算a+b,再将结果赋值给a。

即表达式中变量名会不会被关联到新对象取决于该类型有没有实现__iadd__方法,对应到序列中就是可变序列与不可变序列。即对于内置序列类型而言,使用+=增量赋值虽然表现出来无差别,但实际上实现的方法不同。

同样以上也适应于*=,但后者对应的是__imul__与__mul__。

对不可变序列进行重复增量拼接的话,效率会很低,因为每次都会产生新的对象,解释器需要将原对象拷贝到新对象,再在新对象上进行追加操作。

五、序列排序

一般使用list.sort方法与内置函数sorted进行排序。这两个方法都使用Timsort算法,该算法为稳定的算法。两种的方法的区别为:

使用list.sort()方法对列表进行就地排序,返回None值,只能在列表示例上调用。

而使用内置函数sorted()会新建一个已排序列表作为返回值。这个方法可以接收任何形式的可迭代对象作参数,包括不可变对象和生成器;但不管接收何种参数,其始终返回一个列表。

而不管是list.sort()还是sorted(),都接收两个参数:

reverse:若为True,则使用降序排序;默认为False;

key:一个只接收一个参数的函数,该函数会在序列的每个元素上调用,产生的结果作为排序算法比较的关键字。默认为恒等函数。

* 数组(array):

若我们需要一个只包含数字的列表,那么array.array将比list更高效,因为数组背后存的并不是float对象,而是数字的字节表述。数组支持所有可变序列有关的操作,还提供文件更快的I/O方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394122.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用EF Core在Blazor中创建级联的DropDownList

介绍 (Introduction) In this article, we are going to create a cascading dropdown list in Blazor using Entity Framework Core database first approach. We will create two dropdown lists — Country and City. Upon selecting the value from the country dropdown, …

gcc/g++命令

参考:http://www.cnblogs.com/cryinstall/archive/2011/09/27/2280824.html 注意:gcc和g是linux系统下的编程常用指令,C语言文件用gcc,cpp文件用g。 1.预处理 g -E filename.cpp > filename.i 功能:输出预处理后的…

计算机存储

位(bit):一个数字0或一个数字1,代表一位 字节(Byte):每逢8位是一个字节,是数据存储的最小单位 1Byte 8 bit 平时所说的网速: 100Mbps实际上是以位(b&#xf…

leetcode113. 路径总和 II(dfs)

给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。说明: 叶子节点是指没有子节点的节点。示例: 给定如下二叉树,以及目标和 sum 22,5/ \4 8/ / \11 13 4/ \ / \7 2 5 1 返回:[[5,4,11,…

java forward 修改请求参数_聊聊springboot session timeout参数设置

序本文主要介绍下spring boot中对session timeout参数值的设置过程。ServerPropertiesspring-boot-autoconfigure-1.5.8.RELEASE-sources.jar!/org/springframework/boot/autoconfigure/web/ServerProperties.javaOverridepublic void customize(ConfigurableEmbeddedServletCo…

javascript控制台_如何使用JavaScript控制台改善工作流程

javascript控制台by Riccardo Canella里卡多卡内拉(Riccardo Canella) 如何使用JavaScript控制台改善工作流程 (How you can improve your workflow using the JavaScript console) As a web developer, you know very well the need to debug your code. We often use extern…

appium===setup/setupclass的区别,以及@classmathod的使用方法

一、装饰器 1.用setUp与setUpClass区别 setup():每个测试case运行前运行 teardown():每个测试case运行完后执行 setUpClass():必须使用classmethod 装饰器,所有case运行前只运行一次 tearDownClass():必须使用classmethod装饰器,所有case运行完后只运行一次 2.是修饰符&#xf…

cache failed module status_Flutter混编之路——iOS踩坑记录

一、运行Xcode编译或者flutter run/build 过程中报错:"x86_64" is not an allowed value for option "ios-arch".解决方案在Debug.xcconfig中指定 “FLUTTER_BUILD_MODEdebug”,Release.xcconfig中指定“FLUTTER_BUILD_MODErelease”…

【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?...

简介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特…

java object类的常用子类_Java中Object类常用的12个方法,你用过几个?

前言Java 中的 Object 方法在面试中是一个非常高频的点,毕竟 Object 是所有类的“老祖宗”。Java 中所有的类都有一个共同的祖先 Object 类,子类都会继承所有 Object 类中的 public 方法。先看下 Object 的类结构(快捷键:alt7):1.…

leetcode面试题 04.12. 求和路径(dfs)

给定一棵二叉树,其中每个节点都含有一个整数数值(该值或正或负)。设计一个算法,打印节点数值总和等于某个给定值的所有路径的数量。注意,路径不一定非得从二叉树的根节点或叶节点开始或结束,但是其方向必须向下(只能从父节点指向子…

javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册

一、ServletJSPJavaBean开发模式(MVC)介绍 ServletJSPJavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据。 ServletJSPJavaBean模式程序各个模块之间层次清晰&…

2018黄河奖设计大赛获奖_宣布我们的freeCodeCamp 2018杰出贡献者奖获奖者

2018黄河奖设计大赛获奖by Quincy Larson昆西拉尔森(Quincy Larson) 宣布我们的freeCodeCamp 2018杰出贡献者奖获奖者 (Announcing Our freeCodeCamp 2018 Top Contributor Award Winners) Over the past 3 years, freeCodeCamp.org has grown from a small open source proje…

Log4j配置详解

来自: http://www.blogjava.net/zJun/archive/2006/06/28/55511.html Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接keyvalue格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。1. 配置文件 …

cors数据类型_如何根据RTK的差分格式选择千寻cors账号的源节点进行设置?

千寻cors账号的设置中源节点是根据使用的品牌RTK是为双星仪器还是三星仪器选择,但问题就在于我们看到的RTK的技术参数中一般很少见到标注仪器的卫星系统,更多的是差分格式。其实千寻cors账号的源节点也可以根据RTK的差分格式进行选择,不过这两…

java swing 串口_ComTest 接收串口数据,并显示在文本框内,通过JavaSwing实现 Develop 265万源代码下载- www.pudn.com...

文件名称: ComTest下载 收藏√ [5 4 3 2 1 ]开发工具: Java文件大小: 3157 KB上传时间: 2016-09-21下载次数: 0提 供 者: 韩坤详细说明:接收串口数据,并显示在文本框内,通过JavaSwing实现-Receive serial data, and displayed in the t…

leetcode329. 矩阵中的最长递增路径(dfs)

给定一个整数矩阵,找出最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。示例 1:输入: nums [[9,9,4],[6,6,8…

SQL大圣之路笔记——PowerDesigner之新建table、view、proc

1. 新建table、view、proc 转载于:https://www.cnblogs.com/allenzhang/p/6305564.html

用python绘制一条直线_python绘制直线的方法

本文实例为大家分享了python绘制直线的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下#!/usr/bin/env pythonimport vtk# 绘制通用方法def myshow(linepolydata):# Now well look at it.lineMapper vtk.vtkPolyDataMapper()if vtk.VTK_MAJOR_VERSION < 5:lineMap…

测试驱动开发 测试前移_我如何以及为什么认为测试驱动开发值得我花时间

测试驱动开发 测试前移by Ronauli Silva通过罗纳利席尔瓦(Ronauli Silva) I first read about test driven development (TDD) in some technical reviews blog, but I barely read it (or thought about it). Why would people write tests first when they already knew the…