Python数据类型之元组-字符串
1 元组概念
元组(类型为 tuple)和列表十分相似,但是元组和字符串一样是不可变的。
1.1 元祖的特点
元组可以存储一系列的值,使用小括号来定义,是一个有序的元素的集合。
元组内的元素是不可变的
当元组内嵌套列表这种引用类型时,元组的不可变表示的是执行这个列表的内存地址不会变,当直接操作元组嵌套的列表时,是可以进行修改的
1.2 元组的定义
格式

例子

1.3 元组的访问
元组和列表在内存中的格式是相同的,都是线性顺序结构,所以我们可以像列表一样,使用索引访问元组的元素,其中元组支持正索引和负索引,同样不支持索引超界,会提示IndexError。

需要注意的是在对元组进行修改的时候,元组本身是无法进行修改的,但当元组内嵌套的是列表这种引用类型时,元组的不可修改指的是元组中存储的嵌套列表的内存地址不可修改,但你可以对这快内存地址里的数据进行修改,因为这是列表的特性。

1.4 元组的查询
我们通过使用元组的index方法和count来获取和统计元组中的元素。

注意:t.index和t.count因为要遍历列表所有,时间复杂度都是O(n),随着列表的元素增加,而效率下降

2 命名元组
命名元组是元组的子类,所以它也是无法进行修改的,它的特点是可以针元组的对字段进行命名。
格式
namedtuple(typename, field_names, *, verbose=False, rename=False, module=None) --> 返回一个拥有命名字段的 新的元组的子类
常用参数含义
typename: 一般和命名元组的名称相同。
field_names: 可以是空白字符或逗号分隔的字段的字符串,可以是字段的列表
namedtuple 存放在 collections 包中,所以需要先进行导入

3 字符串
字符串是Python中比较重要的数据类型,是以单引号'或双引号"括起来的任意文本,比如'abc',"xyz"等等。请注意,''或""本身只是一种表示方式,不是字符串的一部分,因此,字符串'abc'只有a,b,c这3个字符。如果'本身也是一个字符,那就可以用""括起来,比如"I'm OK"包含的字符是I,',m,空格,O,K这6个字符。有三种方法定义字符串:单引号,双引号,三引号,需要注意的是字符串是不可变对象,并且从Python3起,字符串就是Unicode类型。
定义方式

3.1 字符串的基本操作
Python的字符串是一个有序序列,所以他可以和列表一样使用下标来访问元素,但是由于它是不可变类型,所以无法对字符串中的某个字符进行修改,下面介绍下字符串的基本操作。
Python中没有字符的概念,严格来讲,说字符是不准确的,字符串是由一个个字符串(字符)组成的,虽然听起来很别扭,但真的就是这样 - -!。
3.1.1 字符串的访问
字符串和列表是相似,都是顺序的线性结构,所以它可以被索引,也可以被遍历。字符串的索引类似数组的下标:

3.1.2 字符串的拼接
当我们需要把多个字符串连接在一起,那么就需要对字符串进行拼接,python提供了join方法,+号,以及*号,使我们方便的完成需求。
S.join(iterable) -> str --> 使用s对可迭代对象进行拼接,返回拼接后的字符串。
join: S可以为任意字符,包括空。可迭代对象中的元素必须是字符串类型
+: 把两个字符串直接进行连接,返回一个新的字符串
*: 把字符串重复复制N次,返回一个新的字符串

3.2 字符串分割
字符串中有关于字符分割功能的主要有两类,split类和partition类,他们分别适用于不用的场景。但用的比较多的是split。
split类:将字符串按照分割符分隔成若干字符串,并返回列表
partition类:将字符串按照分割符分割成2段,返回这2段和分隔符组成的三元组

例子

当然split类还包含了其他两个方法:

partition类和split相似,还有个rpartition函数,也是从右开始截取,需要注意的是,当分隔符无法对字符切分时,返回的是空,空,字符串,组成的三元组。
3.3 字符串大小写
upper:将字符串转换为大写字母
lower:将字符串转换为
swapcase: 大小写对调
capitalize:转换成首字母大写的单词格式
title: 转换成每个单词首字母大写的标题模式

3.4 字符串排版
center(width [,fillchar]): 居中显示,参数width表示整体宽度,fillchar表示填充字符,默认填充字符为空
zfill(width):居右显示,参数width表示整体宽度,使用0进行填充
ljust(width [, fillchar]):左对齐,width表示整体宽度,fillchar表示填充字符
rjust(width [, fillchar]):右对齐,width表示整体宽度,fillchar表示填充字符

3.5 字符串修改
what?你前面说字符串是不可变的吧,为什么这里又说字符串的修改?你在逗我吗。呵呵哒。
S.replace(old, new[, count]) -> str --> 对字符串S进行查找,将指定的old字符串转换为new字符串,count表示替换的次数,默认表示重复替换所有
S.strip([chars]) -> str --> 将字符串s进行处理,从字符串的两边删除掉匹配chars的字符串,chars可以是多个单字符,默认是所有空白字符(\n,\r\n,\r,\t等等都包含)
注意:replace的替换是生成一个新的字符串,而不是修改原字符串,这也是字符串修改的原理

3.6 字符串查找
我们有很多的时候要判断关键字是否存在一个字符串中,那么我们就需要在字符串中遍历查找,是否有匹配的字符串。python提供了find,rfind,index,count等函数用于完成需求

index和count方法由于是遍历查找,所以时间复杂度都是O(n),会随着字符串序列的数据规模的增大,而效率下降,如果没要在字符串中进行查找,还是建议使用find函数。

3.7 字符串判断
Python的字符串对象提供了两个函数,用于对字符串的起始位和结尾位来进行匹配,它们是startswith和endswith。


除了判断开始和结尾,Python的字符串还提供了部分函数,用来判断字符串内的元素类型,比如判断字符串是否是纯数字组成?是否是纯字母组成等,这些函数的返回值统一都为bool型,可以作为if语句的条件表达式。

3.8 字符串格式化
字符串格式化是我们需要重点掌握的东西,在早期的Python中使用的是C语言风格的字符串替换,使用起来比较难看,不符合python的风格(当然是我的猜测,哈哈)。后来Python推荐使用内置的format函数来对字符串进行格式化。
字符串格式化是一种拼接字符串输出样式的手段,更灵活方便,之前我们使用join和+来对字符串进行拼接。
join:只能使用分隔符,且要求被拼接的是可迭代对象且元素必须是来字符串类型
+: 使用起来比较方便,但是非字符串需要先转换为字符串才可以进行拼接。
3.8.1 C语言格式化
在Python 2.5版本以前,只能使用printf style风格的print输出,这种风格来自于C语言的printf函数,它有如下格式要求。(不建议使用,了解即可,Pythoner还是理解format就好。)
占位符:使用%和格式字符串组成,例如%s,%d等。使用s时,内部其实会调用str()函数进行转换
占位符中还可以插入修饰字符,例如%03d表示打印3个位置,不够的话,前面补0
format % value 格式字符串和被格式字符串之间使用%分割
values只能是一个对象,或是一个与格式字符串占位符数量相等的元组,或一个字典

3.8.2 format格式化
Python中推崇使用format函数来对字符串进行格式化。
'{}{XXX}'.format(*args, **kwargs) -> str --> 函数的一般格式,{}表示占位符,使用format中的参数进行传递
format非常灵活,下面是基本使用方法说明:
args是可变的位置参数,是一个元组
kwargs是可变关键字参会苏,是一个字典
花括号表示占位符
{}表示按照顺序匹配位置参数,{n}表示取位置参数中索引为n的值
{xxx} 表示在关键字参数中搜索名称一致的值,kwargs必须放在位置参数的后面
{{}}表示打印花括号

3.8.3 对齐
当然字符串还提供了多种的对齐方式,便于我们对输出内容做一个简单的优化。
<:左对齐(默认)
>:右对齐
^: 居中显示
对齐方式需要在占位符内使用:号进行分割

当填充符为数字的时候,可以与宽度写在一起,比如 {:0<5} --> {:<05} , {:0^5} --> {:^05}
3.8.9 小数点与进制
虽然用的不多,还是这里还是举例说明一下进制和小数的使用方法

d: 表示十进制
x: 表示十六进制
o: 表示八进制
b: 表示二进制
F: 表示浮点型
#: 表示添加进制前缀
*[1,2,3]: 表示把列表中的元素结构出来:*[1,2,3] --> 1,2,3

4 切片
说到切片那么不得不提线性结构,为什么?因为线性结构都可以进行切片操作,除了切片,线性结构其他的特点还有
可迭代(for val i ...)
len()可以获取长度
可以通过下标进行访问(有序)
列表、元组、字符串、bytes、bytearray都属于线性结构,所以都可以被切片。
那什么是切片?我们说通过索引区间访问线性结构一段数据的方法就叫做切片,需要注意的是切片操作会引起内存复制,当对一个过于庞大的线性结构进行切片的时候,请慎重考虑内存使用率的问题。切片的表达方式和基本特点有:
格式:sequence[start:stop:[,step=1]] 返回[start, stop, step=1)的前闭后开子序列。
支持负索引。注意方向问题
当start为0或stop为0时,可以省略。[:]表示复制原线性结构数据(注意当对象为list时,属于浅copy)
超过上届(右),则取到末尾;超过下届(左),则取到开头。
start一定要在stop的左边

注意:
切片并不会对原数据进行修改,会返回新的数据
如果不是用变量接受,那么就会被标记为待回收
由于是新生成的数据,所以内存地址和原数据内存地址一定不相同。
4.1 切片赋值
既然可以进行切片,那么就会引申出来,是否可以进行切片赋值,什么是切片赋值?它该如何表示?下面以列表例进行说明。
切片操作写在等号的左边
被插入的可迭代对象在等号右边

仔细看上面示例代码会发现几个问题:
lst[1:3] = 1 表示切片赋值
切片赋值,赋的值必须是一个可迭代对象
切片赋值改变了原数据
字符串、元组这类不可变的元素,无法使用切片赋值(理由请看3)
当我们使用切片时,它会产生新的内存地址来存放生成的新列表,但是如果把切片操作放在赋值操作的左边时,那么就相当于引用了原列表的[start:stop]的索引,这种操作是不会生成新的内存空间的,换句话来讲就是直接对原列表进行了insert操作.

我们知道list在进行insert和remove时的时间复杂度都是O(1),在进行切片赋值时也容易让人难以理解,所以建议不要使用这种方法。
本文来自博客园,作者:I'm_江河湖海,转载请注明原文链接:https://www.cnblogs.com/jhhh/p/16765212.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)