bytes数组转string指定编码_一篇文章弄懂Python中所有数组数据类型

前言

数组类型是各种编程语言中基本的数组结构了,本文来盘点下Python中各种“数组”类型的实现。

  • list
  • tuple
  • array.array
  • str
  • bytes
  • bytearray

其实把以上类型都说成是数组是不准确的。这里把数组当作一个广义的概念,即把列表、序列、数组都当作array-like数据类型来理解。

注意本文所有代码都是在Python3.7中跑的^_^

0x00 可变的动态列表list

list应该是Python最常用到的数组类型了。它的特点是可变的、能动态扩容,可存储Python中的一切对象,使用时不用指定存储的元素的类型。

使用非常简单

>>> 

0x01 不可变的tuple

tuple的操作与list类似。它的特点是不可变,不能扩容,可存储Python中的一切对象,使用时不用指定存储的元素的类型。

>>> t = 'one','two',3
>>> t
('one', 'two', 3)
>>> t.append(4)
AttributeError: 'tuple' object has no attribute 'append'
>>> del t[0]
TypeError: 'tuple' object doesn't support item deletion

tuple可以使用+运算符,这个运算将创建一个新的tuple对象用于存储数据。

>>> t+(1,)
('one', 'two', 3, 1)
>>> tcopy = t+(1,)
>>> tcopy
('one', 'two', 3, 1)
>>> id(tcopy)
4604415336
>>> id(t)
4605245696

可以看出tuple执行+运算符之后两个对象的地址是不一样

0x02 array.array

如果在Python中要用到其它语言中类似“数组”的数据结构,就需要用到array模块了。它的特点是可变的、存储相同类型的数值,不能存储对象。

因为array在使用的时候要指定元素数据类型,因此它比list和tuple都有比较高效空间性能。

# 使用时指定元素数据类型为`float`
>>> arr = array.array('f', (1.0, 1.5, 2.0, 2.5))
>>> arr
array('f', [1.0, 1.5, 2.0, 2.5])
# 修改一个元素
>>> arr[1]=12.45
>>> arr
array('f', [1.0, 12.449999809265137, 2.0, 2.5])
# 删除一个元素
>>> del arr[2]
>>> arr
array('f', [1.0, 12.449999809265137, 2.5])
# 增加一个元素
>>> arr.append(4.89)
>>> arr
array('f', [1.0, 12.449999809265137, 2.5, 4.889999866485596])
# 如果将一个字符串类型数据存储到一个浮点数的数组将会报错
>>> arr[0]='hello'
TypeError: must be real number, not str

array中元素的数据类型可以参考下表

83985daf5e5e12d1ae1ff9b8afab8f8d.png

0x03 字符串序列str

Python3中使用str对象来表示一个文本字符序列(看,这跟Java中的字符串String是多么相似呢)。它的特点不可变的Unicode字符序列。

在str中它的每一个元素都是字符串对象。

>>> s ='123abc'
>>> s
'123abc'
>>> s[0]
'1'
>>> s[2]
'3'
# 字符串是不可变的序列,不能删除其中的元素
>>> del s[1]
TypeError: 'str' object doesn't support item deletion 
# 要对字符串进行操作,可以转化成list 
>>> sn = list(s)
>>> sn
['1', '2', '3', 'a', 'b', 'c']
>>> sn.append(9)
>>> sn
['1', '2', '3', 'a', 'b', 'c', 9]
# 字符串中的元素也是字符串对象
>>> type(s[2])
<class 'str'>
>>> type(s)
<class 'str'>

str对象也可以执行+操作,它也会生成一个新对象用于存储。

>>> s2 = s+'33'
>>> s2
'123abc33'
>>> id(s2)
4605193648
>>> id(s)
4552640416

0x04 bytes

bytes对象用于存储字节序列,它的特点是不可变存储,可存储0-256的数值。

>>> b = bytes([0,2,4,8])
>>> b[2]
4
>>> b
b'x00x02x04x08'
>>> b[0]=33
TypeError: 'bytes' object does not support item assignment
>>> del b[0]
TypeError: 'bytes' object doesn't support item deletion 

0x05 bytearray

bytearray对象与bytes类似,用于存储字节序列。它的特点是可变的,能动态扩容的字节数组。

>>> ba = bytearray((1,3,5,7,9))
>>> ba
bytearray(b'x01x03x05x07t')
>>> ba[1]
3
# 删除一个元素
>>> del ba[1]
>>> ba
bytearray(b'x01x05x07t')
>>> ba[0]=2
>>> ba[0]
2
# 添加一个元素
>>> ba.append(6)
# 只能添加字节
>>> ba.append(s)
TypeError: 'str' object cannot be interpreted as an integer
>>> ba
bytearray(b'x02x05x07tx06')
# 字节的范围是0-256
>>> ba[2]=288
ValueError: byte must be in range(0, 256)

bytearray可以转化成bytes对象,但效率不是很高。

# bytearray转成bytes将生成一个新对象
>>> bn = bytes(ba)
>>> id(bn)
4604114344
>>> id(ba)
4552473544

0x06 各个类型相互转化

tuple->list

>>> tuple(l)
('a', 'b', 'c')

list->tuple

>>> t
('a', 'b', 'c')
>>> list(t)
['a', 'b', 'c']

str->list

>>> l = list('abc')
>>> l
['a', 'b', 'c']

list->str

>>> l
['a', 'b', 'c']
>>> ''.join(l)
'abc'

str->bytes

>>> s = '123'
>>> bytes(s)
TypeError: string argument without an encoding
>>> bytes(s,encoding='utf-8')
b'123'
# 或者使用str的encode()方法
>>> s.encode()
b'123'

bytes->str

>>> b = b'124'
>>> b
b'124'
>>> type(b)
<class 'bytes'>
>>> str(b,encoding='utf-8')
'124'
# 或使用bytes的decode()
>>> b.decode()
'124'

0x07 总结

这些数据类型都是Python自带的,在实际开发中应该根据具体需求选择合适的数据类型。例如当要存储的元素类型是多种多样的,那么就应该使用list或者tuple。而array.array相对来说拥有较好的空间性能,但它只能存储单一类型。
我相信在很多业务场景中list或tuple是可以满足需求的,只是其它数据结构也要有所了解,在我们做一些基础组件时,会考虑数据结构的性能,或者阅读他人的代码时,能做到心中有数。

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

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

相关文章

怎么安装php模板,PHPWind八风格模板的安装及制作教程

PHPWind八风格模板的安装及制作教程 PHPWind 8风格模板的安装及制作教程一、PHPWind风格模板的安装&#xff1a;1、下载自己喜欢的PHPWind模板&#xff0c;由于PHPWind使用者众多&#xff0c;所以为了符合多种客户的需要&#xff0c;它的风格模板也是有万千种风格&#xff0c;大…

sklearn保存svm分类模型_【菜菜的sklearn】07 支持向量机(上)

小伙伴们大家好~o(&#xffe3;▽&#xffe3;)ブ&#xff0c;我是菜菜&#xff0c;这里是我的sklearn课堂第7期&#xff0c;今天分享的内容是支持向量机&#xff08;上&#xff09;&#xff0c;下周还有下篇哦~我的开发环境是Jupyter lab&#xff0c;所用的库和版本大家参考&a…

cef在android中使用_关于富文本在Android中的应用以及遇到的坑

富文本可以为用户提供更加多样化的文本展示形式&#xff0c;但由于其使用了H5标签的特殊性&#xff0c;一般都需要第三方框架的支持。这里推荐一款合适的第三方富文本框架&#xff0c;richeditor。首先我们要使用该功能需要引入相关jar包&#xff0c;引入方法如下compile jp.wa…

thinkphp中如何使用PHP函数,如何在ThinkPHP中使用函数进行回调

如何在ThinkPHP中使用函数进行回调发布时间&#xff1a;2020-12-23 15:11:45来源&#xff1a;亿速云阅读&#xff1a;85作者&#xff1a;Leah本篇文章为大家展示了如何在ThinkPHP中使用函数进行回调&#xff0c;内容简明扼要并且容易理解&#xff0c;绝对能使你眼前一亮&#x…

unity 敌人自动攻击和寻路_Unity暑期萌新入门:环境篇

大家好&#xff0c;新一期又跟大家见面了。上一节我们完成了角色的移动控制&#xff0c;然而John只能在空白的场景中移动。因此接下来这一节我们将添加关卡、调节光照&#xff0c;让John来到阴森的鬼屋。然后设置NavMesh(导航网格&#xff0c;现在先听个概念就好)&#xff0c;为…

layui tree 加载慢_图片太多,加载慢,我用了layui里的方式,放在服务器后还是太慢!怎么解决???有没有什么优化的技巧???...

怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;layui.use([layer,flow], function(){v…

oracle 存储中文 u码,Oracle 汉字 占位

遇到了一个数据插入长度过长问题,记得大学时候,还说过oracle的不同编码下的的大小分配不是一样的,具体也忘记了,补上,以防下次犯二1 step先查看自己的oracle是什么字符集select userenv(language) from dual比如: SIMPLIFIED CHINESE_CHINA.ZHS16GBK 、 SIMPLIFIED CHINESE_CH…

element 表格宽度自适应_Java 设置Word中的表格自适应的3种方式

概述在Word创建表格时&#xff0c;可设置表格“自动调整”&#xff0c;有3种情况&#xff0c;通过Java程序设置可调用相应的方法来实现&#xff0c;即&#xff1a;根据内容调整表格AutoFitBehaviorType.Auto_Fit_To_Contents根据窗口调整表格AutoFitBehaviorType.Auto_Fit_To_W…

python实现决策树数据直接赋值导入_Python3.0 实现决策树算法的流程

决策树的一般流程检测数据集中的每个子项是否属于同一个分类if so return 类标签Else寻找划分数据集的最好特征划分数据集创建分支 节点from math import logimport operator#生成样本数据集def createDataSet():dataSet [[1,1,yes],[1,1,yes],[1,0,no],[0,1,no],[0,1,no]]lab…

linux oracle em使用,Linux平台下启动oracle 11g EM控制台

http://blog.csdn.net/webajax/article/details/6702233配置EM具体步骤一、配置EM dbconsole的步骤信息emca -config dbcontrol db -repos recreateEMCA 开始于 2007-10-12 11:16:40EM Configuration Assistant 10.2.0.1.0 正式版版权所有 (c) 2003, 2005, Oracle。保留所有权利…

源码里没有configure_深入源码理解.NET Core中Startup的注册及运行

开发.NET Core应用&#xff0c;直接映入眼帘的就是Startup类和Program类&#xff0c;它们是.NET Core应用程序的起点。通过使用Startup&#xff0c;可以配置化处理所有向应用程序所做的请求的管道&#xff0c;同时也可以减少.NET应用程序对单一服务器的依赖性&#xff0c;使我们…

天龙源码框架分析_天龙八部源码描述【转】

天龙八部(武侠世界)的源码很可能是天龙八部代码流出后改写的&#xff0c;因为在看了代码中可以找到一些证据&#xff0c;整个客户端分为&#xff1a;一个是编辑器&#xff0c;一个是客户端&#xff0c;采用OGREcegui自写的简单的物理碰撞检测FMOD自写的网络库。服务器端代码目前…

oracle查询慢怎么优化,Oracle查询优化-怎样建立索引优化下面的查询语句啊

下面是转换出来的查询语句SELECT *FROM (SELECT "Project1"."C1" AS "C1","Project1"."ID" AS "ID","Project1"."NVC_ORDERBY" AS "NVC_ORDERBY","Project1"."I_ST…

复试情报准备

英语自我介绍&#xff0c;介绍完老师会根据你的回答用英语问你问题&#xff0c;比如介绍一下你的本科学校&#xff0c;或者家乡什么的。计网过一遍&#xff0c;会问两道题。接下来是重点&#xff0c;我当时是根据我成绩单&#xff0c;问了我本科学过的科目&#xff0c;比如pyth…

chrome切换前端模式_Chrome调试工具developer tool技巧 - 轩枫阁

Chrome这个浏览器赞的不能再赞了&#xff0c;给前端的开发调试工作带来了极大的效率提升。Chrome的简洁、快速吸引了无数人&#xff0c;它的启动速度、页面解析速度都很快&#xff0c;同时得益于Google V8的快速&#xff0c;Javascript执行速度也飞快。而且它对HTML5和CSS3的支…

oracle创建索引01652,建立数据表快照导致ora-01652异常

建立数据表快照导致ora-01652错误由于源表过大&#xff0c;数据查询速度较慢&#xff0c;在做后台的相关查询的时候较慢&#xff0c;于是决定创建数据快照&#xff0c;提高查询速度&#xff0c;快照创建语句如下&#xff1a;CREATE SNAPSHOT sn_ydmobilebankREFRESH COMPLETE S…

linux上安装python2.6.9_在Linux CentOS 6.6上安装Python 2.7.9

CentOS 6.6自带的是Python 2.6.6&#xff0c;而编译llvm需要Python 2.7以上。checking for python... /usr/bin/pythonchecking for python > 2.7... not foundconfigure: error: found python 2.6.6 (/usr/bin/python); required > 2.7yum中最新的也是Python 2.6.6&…

用python批量下载网络图片_python 批量下载网页里的图片

import requests import sys,re #设置提取图片url 的正则表达式 imgre re.compile(r" #存放找到的 图片url的列表 all_img_urls [] #图片下载后存放位置 save_path r‘/root‘ #获取指定网页中的图片url def get_img_url(tmpurl,tmpre,allimgurl,timeout10): headers …

php中cnum函数,PHP vprintf() 函数

更多实例例子 1使用格式值 %f&#xff1a;<?php $num1 123;$num2 456;vprintf("%f%f",array($num1,$num2));?>例子 2使用占位符&#xff1a;<?php $number 123;vprintf("有两位小数&#xff1a;%1\$.2f没有小数&#xff1a;%1\$u",array($n…

alter table add column多个字段_利用Python将多个excel合并到一个文件中

数据岗位的小伙伴可能经常会遇到这样一个问题&#xff1a;多个来源返回的数据怎么整合到一个文件中&#xff1f;手动经常会出错&#xff0c;下面介绍一种利用Python处理的方式&#xff1a;前期准备&#xff1a;1、多个excel需要进行数据整理&#xff0c;保证文件的结构一致&…