字符串基础
本章范围
探索Python的str字符串类型,它处理ASCII文本,不管使用哪个版本的python它都同样工作。对于Unicode的大部分内容本章不会涉及太多,地37章你会再次遇到的。
Unicode简介
ASCII是Unicode文本的一种简单形式,但只是众多可能的编码和字母表中的一种。
在Python3.X中,有三种字符串类型,str用于Unicode文本(包括ASCII),bytes用于二进制数据(包括已编码的文本),而bytearray是bytes的一个可修改的变体。文件在两种模式下工作,文本,它将内容表示为str类型并实现Unicode编码,二进制,它以原始bytes的形式处理,且不做数据转换。
大多数程序员不需要掌握最前沿的Unicode细节,所以关于Unicode的大部分内容放在37章。
字符串基础
从实际的角度来看,字符串可以用来表示能够编码的文本或字节的任何事物。这样的文本包包含符号和词语、载入到内存中的文本文件的内容。Internet网址和Python源代码等。字符可以用来保持用于媒体文件和网络传输的原始字节,还有国际化程序使用的代码和编码形式的非ASCII Unicode文本。
Python的字符串被划分为不可变序列这一类别,意味着字符串所包含的字符操作从左到右的位置顺序,并且他们不可用在原位置修改。
下面将介绍常见的字符串字面量和操作
操作 解释
S = ' ' 空字符串
S = "spam's" 双引号和单引号相同
S = 's\np\ta\x00m' 转义序列
S = """....MULITILINE...""" 三引号快字符串
S = r'\temp\spam' 原始字符串(不转义)
B = b'sp\xc4m' python2.6,2.7和Python3.X中的字节串
U = u'sp\u00c4m' Python2.X和3.3+中的Unicode字符串
S1 + S2 拼接
S * 3 重复
S[i] 索引
S[i:j] 分片
len(S) 长度
“a{0} parrot”.format(kind) 字符串格式化方法
S.find('pa') 字符串方法:搜索
S.rstrip() 移除右侧空格
S.replace('pa','xx') 替换
S.split(',') 用分隔符分组,这里的分隔符是 ,
S.isdight() 内容测试
S.lower() 大小写转换
S.endwith('spam') 尾部测试
S.encode('latin-1') Unicode编码
B.decode('utf8') Unicode解码
for x in S: print(x) 迭代
'spam' in S 成员关系
[c ** 2 for c in S] 成员关系
map(ord,S) ord返回单个字符的ASCII序号
re.match('sp(.*)am',line) 模式匹配,库模块
除了这些操作外,Python还支持更高级的基于模式的字符串处理过程,可使用标准库re模式实现。Python还支持更高级的文本处理工具,如XML解释器。
字符串字面量
单引号: 'spa"m'
双引号 "spa'm"
三引号 '''....spam...''',"""...spam..."""
转义序列: "s\tp\na\0m"
原始字符串 r"F:\01010\beautif"
字节字面量 b'sp\x01am'
Unicode字面量 u'eggs\u0020spam'
单引号和双引号的形式是目前最常见的,其他的形式都是非谓语特定功能的,对于最后两种的讨论将在第37章。
单引号和双引号是一样的
在Python字符串周围,单引号和双引号字符是可以互换的。也就是说,字符串字面量可以包围在两个单引号或两个双引号之中,两种形式同样有效
你不进行反斜杠转义就可以在一种引号的字符串中包含另一种引号。
如果没有逗号,Python会在表达式中自动拼接相邻的字符串字面量
在这些字符串之间添加逗号会创建一个元组,而不是一个字符串。
你可以通过反斜杠转义来嵌入引号字符
转义序列代表特殊字符
是一个劣质通过在引号前增加员工反斜杠的方式,在字符串内部嵌入一个引号。这代表了字符串中的一种通用模式:反斜杠用来引入特殊的字符编码,称为转义序列。
转义序列能够让我们在字符串中嵌入不容易通过键盘输入的字符。字符\以及字符串字面量中在在它后边的一个或多个字符,在生成的字符串对象中会被单个字符所代替。这个字符拥有用过转义序列定义的二进制值。
这里是一个无辜字符的字符串,其中嵌入了一个换行符和一个制表符。
其中两个字符\n表示单个字符,在字符串中换行字符的二进制值,类似的,序列\t替换为制表符。
我们可以查看一下这个字符串的长度,为4,一个ASCII a字符,一个换行字符,一个制表符,一个ASCII b字符。
Python提供了一套转义字符序列
转义 意义
\newline 被省略(行的延续)
\\ 反斜杠(保留一个\)
\' 单引号(保留一个')
\" 双引号(保留一个")
\a 响铃
\b 退格
\f 换页
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\xhh 十六进制值 hh的字符(准确为2个数位)
\ooo 八进制 ooo 的字符(可达3个数位)
\0 空字符:二进制的0字符(表示字符串结尾)
\N{ id } Unicode数据库ID
\uhhhh 16位十六进制的Unicode字符
\Uhhhhhhhh 32位十六进制的Unicode字符
\other 不转义(保留\和other)
一些转义序列运行在字符串的字符之间嵌入绝对二进制数字。
这里嵌入了两个值为二进制0的字符。
在Python中,这样的零(空)字符不会像C语言空字节那样去结束一个字符串。Python在内存中保存整个字符串的长度和文本。事实上,Python中没有任何字符会结束一个字符串。下面是一个完全由绝对二进制字符组成的字符串
注意,不管任何指定不可打印字符,Python都以16进制显示,我们可以自由地组合绝对数值转义和更多的符号转义类型。
当在Python中处理二进制数据文件时,了解这些知识显得格外重要。由于他们的内容在脚本中是以字符串的形式出现的,因此处理包含各种二进制字节值的二进制文件也是完全可行的。,当使用二进制模式打开时,文件对象从外部文件返回原始字符串。
关于最后一条,\other保留\和other。如果Python认为\后的字符不是有效的转义编码,那么它会直接在生成的字符串中保留反斜杠。
然而,除非你能够记住所有的转义序列,否则你不应该依赖于这种方式。如果你想玩在字符串中明确的编写\,应该使用\\,或者使用原始字符串。
原始字符阻止转义
一个简单的例子,这里简单看是一个打开文件的命令,注意一下其中内容,有\n,有\t。这让Python很难理解这是一个文件路径。
这正是原始字符串需要解决的问题。如果字母r(大写或小写)出现在字符串的第一个引号前面,它将会关闭转义机制。结果节Python将会将反斜杠作为字面量来保持,完全就像输入的那样。尤其是Windows系统的文件路径前面加上r才能更好的工作。
实际上,但Python打印了一个嵌入反斜杠的字符串时,它直线也会使用这种双反斜杠
的方案。
和数字的表示相同,交互提示打印结果的默认格式就像代码一样,而且在输入中有转义的反斜杠。打印语句提供了一种对用户更友好的格式,而在每处仅有一个反斜杠。
换了一个短的例子,通过len函数检查,发现每个反斜杠只占一个字符。
注意:
尽管r能阻止转义,但即便一个原始字符串也不能够以单个反斜杠借我,因为,反斜杠会转义后面的引号字符,你必须转义包围的引号字符一将其嵌入到字符串中,也就是说,r'...\'表示一个有效的字符串字面量,因此一个也原始字符串不能以奇数个反斜杠结尾。如果需要用单个反斜杠结束一个原始字符串,可以使用两个反斜杠并切片切掉第二个
手动添加一个反斜杠
或者忽略原始字符串原并在普通字符串中把反斜杠改为双反斜杠
但是这样对于前面的字符串如果有内容需要不转义就会出现问题,
就像这样,所以推荐前两种方法。
三引号编写多行块字符串
关于字符串还有一种三引号的字符串的字面量格式,有时候称为块字符串,这是一种对于编写多行文本数据来说很便捷的语法,这种形式以是三个引号开始,单引号双引号都行,但是不能混着用,并紧跟任意行数的文本,并且以与开始相同的三个引号结束。
这个字符串横跨三行。Python会把所有再三行之内的文本收集到一个单独的多行字符串中,并在代码转折处嵌入换行字符。
实际上,三引号字符串会保留所有包围的文本,包括位于代码最右边,你认为是注释的文本。
这一定很蠢。
三引号字符串在程序输入多行文本的任何时候都是很有用的。三引号字符串最常用于文档字符串,当它出现在文件的特定地点时,会被当作注释。
实际应用中的字符串
基本操作
首先是一些简单的,创建字符串,拼接,重复
重复最初看起来有些令人费解,然而它在相当的的场合用起来十分顺手。
例如你想要一行星号作为分隔线
注意运算符重载已经发挥了作用,这里正在使用运算符+和*。它们与应用于数字时的加法和乘法运算符+和*是相同的。Python执行了正确的操作,因为它知道被加和被乘的对象类型。但是小心,这个规则并不和你预期的那样随意。例如。Python吧允许你在 + 表达式中混合数字和字符串。例如‘asdw' + 777
你也可以使用for语句在循环中对字符串进行迭代。for语句重复动作,并使用in表达式运算符对字符和子字符串进行成员关系的测试。这本质上是一种搜索。对于子字符串,in很像是str.find()方法,但是它的返回是一个布尔类型,而不是子字符串的位置
for 循环指派一个变量去获取一个序列,这里是一个字符串,中的连续元素,并对每一个元素执行一条或多条语句。
索引和分片
字符串是字符的有序集合,所以我们能够通过位置访问它的元素。在Python中,字符串的字符是通过索引来获取的,在字符串后面的方括号中提供所需要的元素的偏移量。你就会得到在指定位置上的单字符字符串。
Python的偏移量是从0开始的,并且以比字符串的长度小1的偏移量结束。Python还支持负偏移量。一个负偏移量会与字符串的长度相加从而得到一个正偏移量。可以吧正偏移量看做从结尾处反向计数。
偏移和分片,正偏移量从左到右,0为第一个元素,负偏移量从右到左,-1为最后一个偏移量。
上边的例子中最后一行对分片进行了演示,它是索引的一种扩展形式,返回的是一个完整片段
这里讲的分片也指的是切片,是同一个东西的不同叫法。分片可以用来提取数据列,丢掉前缀和后缀文本等待。
分片的基础知识很简单,当你使用以一对冒号分隔的偏移量对字符串这样的序列对象进行索引时,Python将会返回一个新的对象,其中包含了由这对偏移量表示的连续内容,左边的偏移量作为下边界(包括下边界),而右边的偏移量作为上边界(不包括上边界)。即Python将获取从下边界自动但是不包括上边界的所有元素,并返回一个包含所有获取元素的新的对象,如果省略这两个偏移量,上下边界的默认值为0的被分片对象的长度。
索引获取特定偏移量处的元素: S[i]
第一个元素的偏移量是0
负偏移量意味着从结尾或右端反向进行计数
S[0]获取第一个元素
S[-2]获取倒数第二个元素
分片提取序列的类型部分: S[i:j]
上边界并不包含在内
分片的下边界和上边界,在缺省时默认为0和序列长度
S[1:3]获取从偏移量为1知道但是不包括偏移量为3之间的所有元素
S[1:]获取从偏移量为1直到末尾(序列长度)之间的所有元素
S[:3]获取从偏移量为0直到但是不包括偏移量为3之间的所有元素
S[:-1]获取从偏移量为0但是不包括最后一个元素之间的所有元素
S[:]获取从偏移量为0直到末尾之间的所有元素,实现了对S的顶层复制。
扩展的分片(S[i:j:k])接收一个步长k,其默认值为+1。允许跳过元素和反转序列
上面列出的倒数第二项是一个非常常见的技巧,它实行了对一个序列对象的完全顶层复制,一个有着相同的值,但是不同内存片区的对象。
扩展分片:第三个限制值和分片对象
分片的完整形式现在变成了S[I:J:K],它表示提取对象S中的全部元素,从偏移量I直到偏移量J-1,每隔K个元素索引因此。第三个限制K的默认值为正数1,这就是通常在一个分片中从左至右提取每一个元素的原因。
通过设置步长K来指定步长,因此A[::3]会取出序列中从头到尾每三个元素取出一个
也可以使用负数作为步长以相反的顺序收集元素。
使用应该负数步长,前两个边界的意义实际上进行了反转。
步长为负数时,从右向左,也就是上下边界默认值发生调换。从左到右步长变成从右到左。
字符串转换工具
python的座右铭之一就是拒绝猜测。作为一个基本的例子,在Python中不能够相加数字和字符串,即使这个字符串是全数字的。
这是有意设计的,因为+既能够进行家访运算也能够进行拼接操作,这种转换的选择会变得模棱两可。如果你一定想要这个字符串和数字做加法操作应该使用转换工具进行预先处理,把字符串转换为数字。
int函数将字符串转换为数值,而相应的str函数可以将数字转换为字符串,尽管你不能再+这样的运算符两侧混用字符串和数字类型,但是你能够在进行这样的操作之前手动转换。
类似的内置函数可以在浮点数和字符串之间相互转换
字符串代码转换
关于字符串转换这个主题,还可以将单个字符转换为其底层的整数码(它的ASCII字节值),可将其传递给内置的ord函数来实现,它返回用来表示内存中相应字符的实际二进制值,而chr函数会执行相反的操作,它获取整数码并将其转换为对应的字符:
从技术上讲,这两者都可以在字符和它们的Unicode序数或“码点”之间相互转换。Unicode序数只是它们在底层字符集中的识别数字。对于ASCII文本,码点是熟悉的7位整数。可用内存中的单个字节存储,但是对于其他种类的Unicode文本,码点的范围可能更加广阔。
至少对于但字符串来说,这提供了一种使用内置函数int将字符串转换为整数的代替方案。
修改字符串
字符串是不可变序列,就是不能在原位置修改一个字符串。
如果想要改变一个字符串,通常需要利用分片这样的工具来创建并赋值一个新字符串。
倘若必要的话,可以将结果赋值回字符串最初的名称
第一个例子通过在s后面拼接一个字符串,并赋值为原来的名字、第二个类中通过分片,使用,拼接将8个字符变成11个字符。
每次操作都是生成新的字符串,字符串方法也都是生成新的字符串对象。如果愿意保留那些对象,你可以将他们赋值为新的变量名。每一次修改字符串都生成一个字符串并不像听起来那么效率低下,就像以前讲到的,Python在运行的过程中对不在使用的字符串对象进行垃圾回收,所以新的对象重用了之前所占用的空间。
最后,可以通过字符串各耍表达式来创建新的文本值。
尽管看起来像是替换,但格式化的结果是一个新的字符串对象,而不是修改后的对象。
字符串方法
除了表达式运算符外,字符串还有个了一系列实现更复杂的文本处理任务的方法。在Python中,表达式和内置函数可以在不同的类型之间工作,但是方法通常特定于对象类型,例如字符串方法。只在字符串对象上起作用。尽管一些类型的方法集在Python3.X中有交集,例如,许多类型都有count和copy方法,但是比起其他工具,它们与类型的相关程度仍然更大一些
方法调用语法
方法是与特定对象相关联,并作用特定对象的简单函数。从技术的角度来讲,它们是属于对象的属性,而这些属性碰巧引用了可调用函数罢了,这些函数总有一个隐含的主体。从更精细的角度看,函数就是代码包,而方法调用同时结合了两种操作:因此属性获取和一次函数调用:
属性获取:
具有object.attribute形式的表达式可以理解为,获取对象object中的attribute属性的值
调用表达式:
具有functiom(orguments)形式的表达式可以理解为:调用函数function的代码,向其传递零个或多个逗号分隔为的参数argument对象,并返回函数function的结果值。
合并二者可以调用一个方法对象,方法调用表达式
object.method(arguments)
从左至右进行求值,Python实现读取对象object的方法method,然后调用它,传递仅对象object和参数argument。或者深入浅出的说,方法调用用表达式意味着:使用参数调用方法处理对象。
如果方法计算出一个结果,它还会作为这个方法调用表达式的结果返回。
这一映射对于内置类型以及我们之后要小心的用户定义的类都是有效的,绝大多数对象都拥有可调用的方法,而且所有对象都可以通过这一同样的方法调用语法来访问。为了调用对象的方法,必须确保这个对象是存在的,如果缺少主题,则方法不能够运行(而且几乎没有任何意义)。
字符串方法
我在这里先创建了一个简单的字符串s,然后使用dir()函数查看一下这个字符串的方法
如你所见,使用len()查看一下这个列表的长度,78.我们没有足够的精力用大篇幅介绍全部内容。你可以查阅Python的库手册或参考文献了解所有的细节。为了帮助你的入门,后面将会介绍一部分内容。
字符串方法示例:修改字符串
抛去bytesarray,它支持原位置文本修改,但只适用于简单的8位类型。
字符串是不可变的,所以不能再原位置进行修改。
通常,为了从一原有字符串中创建新的文本值,可以通过分片和拼接这样的操作来建立新的字符串。例如,为了替换字符串中的两个字符,可以使用如下的代码完成。
replace方法比这第一段代码表现的更有普遍性。它的参数是最初子串(任意长度)和替换最初子串的字符串(任意长度),之后进行全局搜索,有多少就替换多少。
注意一下大小写,Python是严格区分大小写的,还有记住符号要切换英文,这都是常见错误。
鉴于这样的角色,replace可以当作工具来私信啊替换模板。如果西药替换可能实在任意偏移量出现的一个固定长度的字符串,可以在做一个替换,或者使用字符串方法find搜索子串,之后使用分片。
find方法返回子串出现处的偏移量,默认从前向后搜索,或者未找到时返回-1。
拼接操作和replace方法每次运行都会生成新的字符串对象。如果你不得不对一个超长的字符串进行多处修改,为了优化程序的性能,你可以将字符串转换为一个支持原位置修改的对象。然后再修改回去。
内置的t函数从任意序列的元素中创建一个新的列表,在这个例子中,它将字符串的字符打散成一个列表。修改只有,如果你需要将其转换回一个字符串,可以使用字符串的jion方法将列表合并为字符串。记住不要用str函数。
join是字符串的方法,通过给定的风符来调用。join将列表或者其他可迭代对象中的字符串连接在一起,并在元素中间用分隔符分开,上面的例子中分隔符为空。你也可以使用一些其他的分隔。
字符串方法示例:解析文本
字符串方法的另一个常规角色是以简单的文本解析的形式出现的,分析结果并提取子串,为了提取位于固定偏移量出的子串,我们可以使用分片技术。
这组数据出现在规定的偏移量处,因此可以通过分片从最初的字符串中提取出来。只要你所需要的数据组件有固定的位置,这一技术就被当作解析,相反,如果是通过某种分隔符分隔开了数据组件,可以通过分隔拿出这些组件。即便数据出现在字符串中的任意位置。
字符串的split方法将一个字符串从分隔符处切成一系列子串,在上一个例子中。我们没有给出分隔符参数,使用默认的分隔符是空白,这个字符串被一个或多个的空格,指标符或或者换行符分隔,之后我们得到所生成的子串列表。
这里我们使用逗号当作分隔符,这个分隔符也可以比单字符更长。
尽管使用分片或分隔方法做数据解析的潜力有限,但是这两种方法运行都很快,而且能够胜任日常的基本文本提取操作。
实际应用中的其他常见字符串方法
其他字符串方法都有着更为转义的角色,例如去除每行没的空白,执行大小写转换,测试内容,以及检测,为或起始的子字符串:
替代的技巧有时也能够取得与字符串方法相同的结果,例如成员关系运算符in能够用来检测一个子串是否存在,而长度和分片操作则能够用来模拟endswith方法
字符串格式化表达式
字符串格式化允许在单个步骤中对一个字符串执行对个特定类型的替换。严格来讲,它不是必须的,但是很实用。
字符串格式化表达式: '....%s...'%(values)
字符串格式化方法调用 '...{}...'.format(value)
关于字符串格式化表达式现在基本已经弃用,所以这里只讲字符串格式化方法调用。截止Python3.7.3还未被弃用,但是官方也表示十分不推荐,在Python只讲标准库中%的身影影响了它的弃用,但是应该快了。
字符串格式化方法基础
字符串对象的format方法,是基于支持的函数调用语法,而不是表达式语法,特别的,它使用主题字符串作为模板,并且接受任意多个参数,哦用来表示将要根据模板替换的值。
它的使用要求具备函数和调用的知识。但其使用多半是浅显易懂的。在主题字符中,花括号通过为止来指定替换目标以及将要插入的参数。花括号利用是数字,或者关键字。如{1},{food}
本质上,格式阿虎方法调用红章的主题字符串也可以是创建一个临时字符串的字面量,并且任意的对象类型对可以在目标上替换。反正结果是字符串,
添加键、属性和偏移量
格式化字符串可以指定对象属性和字典键,就像在常规的Python语法中一样,方括号指定字典的键,而点表示通过位置或关键字所引用的对象属性。
第一个例子,索引字典上的键‘kind',然后从已经导入的sys模块对象获取‘platform‘属性。第二个例子做同样的事情,但是,通过关键字而不是位置指定对象。
格式化字符串中的方括号可以指定列表及其他序列的偏移量来执行索引,但是,只有单个正偏移量才能在格式化字符串的语法中有效。因此,这一功能并不像是你想象的那样通用。要指定负的偏移量或者使用任意表达式的结果,必须在格式化字符串自身之外运行表达式。
对于最后的要求,可能时代变了,特异尝试一下,表达式,负偏移现在在格式化字符串方法中好使了,我用的是Python3.7.3
高级格式化方法语法
你可以在格式化字符串中添加额外的语法来实现更具体的测试集,对于格式化方法,我们在可能为空的替换目标的标识码中还是用一个冒号,后面紧跟着可以指定字段大小,对齐方式和特定类型编码的格式化说明符。
如下是可以在一个格式字符串中作为替代目标出现的形式化结果,替代四个部分都是可选的,中间必须有空格。
{filedname component ! conversionflag:formatspec}
在这个替代目标语法中:fieldname是便是参数的一个可选的数字或关键字。在python2.7,3.1和后续版本中可以将其省略以使用相对参数编号
component是有着大于等于两个“name”或“[index]”引用的字符串,它们可以被省略以是能用完整的参数值。其中的引用用来获取参数的数学或索引值
coversionfalg如果出现以!开始,后面跟着r,s,或者a,在这个值上分别调用repr,str,ascii内置函数。
formatspec如果出现则以:开始,后面跟着文本,指定了如何表示该值,包括字段宽度,对齐方式,补零,小数精度等细节,并且以一个可选的数据类型码结束。
冒号后面的formatspec组件本身也有丰富的格式,形式上的描述如下。
[[fill]align][sign][#][0][width][,][.precision][typecode]
其中fill可以是除{或}之外的任意填充字符;
align可以是<、>、=或……,分别表示左对齐右对齐,符号字符后的填充,或居中对齐,
sign可以是+、-或空格;
而,逗号选项请求表示千分位分隔符,
width和precision与在%表达式中相同,
formatspec也可以包含嵌套的只有字段名称的{}格式化字符串,它从参数列表动态地获取值
高级格式化方法举例
{0:10}意味着一个10字符宽的字段中第一个位置的参数,出现的:10表示10字符宽度。
用<>表示左对齐右对齐,
浮点数支持格式化声明。
s 字符串
r 与s相同,但使用repr,而不是str
c 字符(int或str)
d 10进制数字(以10为底的整数)
i 整数
o 8进制整数(以8为底)
x 16进制整数(以16为底)
X 与x相同,但是使用大写字母
e 带有指数的浮点数,小写
E 与额相同,但是使用大写字母
f 十进制浮点数
F 与f相同,但是使用大写字母
g 浮点数e或f
G 浮点数E或F
这里将3.14159变成以带有指数的浮点数,第一个没有限制,第二个限制小数点保留3位,第三个变成浮点数
还是3.14159,第一个变成浮点数,第二个浮点数小数点保留二位,第三个规定了六位数,而且用0填充,所以是06,如果只是6就用空格填充
fornat方法支持进制转换,
x16进制,o八进制,b2进制。
由于%字符串格式化表达式官方已经不建议使用,所以二者的比较以及延伸的优点这里不做讨论。
通用性分类
同一分类中的类型共享同一个操作集
字符串是·不可变序列:它们不能在原位置上修改,并且它们是按照位置顺序的排序的集合,可以通过偏移量访问。序列类型可执行的操作包括------拼接,索引,迭代等。
更正式来讲,Python中有三大类型分类拥有这一般性。
数字(整数,浮点数,小数,分数等)
支持加法和乘法等
序列(字符串,列表,元组)
支持索引,分片,拼接等
映射(字典)
支持按照键名称的索引等
我们遇到的很多的其他类型都与数字和字符串类似。例如,对于任意的序列对象X和Y
X+Y会创建一个包含了两个操作对象内容的新的序列对象
X*N会创建一个包含操作对象X内容N份副本的新的序列对象。
换句话说,这些操作运行起来对于任意一种序列对象都一样,包括字符串,列表,元组以及用户定义的对象类型。唯一的区别就是,你最终得到的新对象是根据操作对象X和Y的类型决定的,如果你拼接的列表,那么你将得到一个新的列表而不是字符串、索引,分片,以及其他的序列操作。在所有类型的序列上执行的效果都是一样的,对象的类型将会告诉Python去执行什么样的操作。
可变类型能够在原位置修改
不可变的分类是需要特别注意的约束,尽管对于新用户来说,还是有可能在这里犯糊涂的,如果一个对象类型是不可变的,你就不能在原位置修改它的值;如果你这么做的话,将会报错。替代的办法就是,你必须运行代码来创建一个新对象,包含这个新的值。Python中的主要核心类型划分为如下两类:
不可变类型(数字,字符串,元组。不可变集合)
不可变类表中的对象类型都不支持原位置修改,尽管我们总是可以运行表达式来创建新对象,并将返回的结果分配给变量
可变对象
相反,可变类型总是可以通过不断生成新对象的操作在原位修改,而不用创建新的东西。尽管这样的对象可以复制,但是它们也支持在原位置处直接修改。
一般来说,不可变类型能够保证用过对象不会被重新的其他部分改变,因而具有一定程度的完整性。详情空间第六章关于共享对象引用的讨论。
本章小结
在本章中,我们深入学习了字符串对象类型,我们学习如何编写支持字面量,探索了字符串的操作,包括序列表达式,字符串方法调用,以及表达式和方法调用这两种字符串格式化方法,在这个过程中,我们深入讨论了各种概念,例如分片,方法调用和三种块字符串。我们也定义了一些在不同类型这种普遍适用的核心思想。例如,序列类别中的所有类型都共享一套完整的操作集。
自己总结一下
首先一些字符串基础,字面量和基本操作,单引号,双引号的使用,重要的转义字符,以及三引号括起来的多行字符串,可以当注释使用,字符串的索引,分片;字符串转换工具,字符串常见方法,字符串格式化方法format
下面背诵并默写本章习题
本章习题
1.字符串的find方法可以用来搜索到列表吗?
不可用。因为方法是特定于类型的,也就是说,它们只能够用于单元数据类型上。然而,像X+Y这样的表达式和len(X)这样的内置函数是具有一般性的,它们可以用于多种类型上。在本例中,in成员关系表达式和字符串的find方法具有类似的效果,但它不仅可以用来查找字符串,还可以查找列表。在Python3.X中,人们尝试按照类别对方法进行分组(例如,可变序列类型list和bytearrart具有类似是方法集合),但是方法仍然比其他的操作集更加特定于类型。
2.字符串分片表达式可以用于列表吗?
可以。与方法不同,表达式具有一般性,可用于多种类型。在本例中,分片表达式其实是一个操作序列,它可在任何类型的序列对象上使用,包括字符串,列表,以及元组。唯一的差别就是,当你对列表进行分片时,你得到一个新的列表,而这里你得到的是一个新的字符串。
3.如果将一个字符串转换为ASCII整数码?任何进行反向转换,将一个整数转换为字符?
内置的ord(S)函数可以将单字符的字符串转换为整数字符编码;chr(I)可以将一个整数码转化回字符串。但是,请牢记,这些整数只用于文本的ASCII编码,它们的字符只能从ASCII字符集中获取。在Unicode模型中,文本字符串实际上是用来识别整数的Unicode码点醒了,它们可能超过ASCII保留的7位(比特)数字范围。
4.在Python中,如何修改一个字符串?
字符串无法被修改,它们是不可变对象,尽管如此,你可以通过拼接,分片,执行格式化表达式,调用replace这样的方法创建新的字符串,在将结果赋值给最初的变量名,从而达到类似的效果。
5.已知字符串S的值为's,pa,m',说出两种取出中间两个字符的方式。
可以使用S[2:4]对字符串进行分片,或者使用S.split(',')[1]用逗号分隔字符串,再进行索引。
6.字符串‘’a\nb\x1f\000d‘’有多少个字符?
6个。字符串“a\nb”\x1f\000d'中包含字符a,换行符(\n),b,二进制的31(十六进制转义为\x1f),二进制0(八进制转义为\000)以及d。把字符串传给内置的len函数可以验证这一点,打印出每个字符的ord结果,可查看实际的码点(识别整数)值。