字符串
# 字符串
1.Python 的字符串是一种不可变序列,它包含的字符存在从左到右的位置顺序。
不可变是指:字符串创建以后无法修改它的内容。
序列包括:字符串、列表、元组
- 字符串由一对双引号或者单引号包围,二者无任何区别
如果希望字符串中包含引号,则有两种办法:
- 最外围的引号和字符串中的引号使用不同的格式。如
"who's name is Tex?" - 采用转义字符。如
who\'s name is Tex?'
- 最外围的引号和字符串中的引号使用不同的格式。如
- 空字符串是一对引号之间不包含内容:
"" - Python 自动在任意的表达式中合并相邻的字符串常量
- 在字符串中反斜杠代表转义序列,每个转义序列代表一个字符(不一定能够打印出来):
\\转义反斜杠本身\n为换行符\0为\0x00(不是字符串结尾)\xhh为十六进制值\o00为八进制值\uhhhh为 16 位 Unicode 的十六进制值\Uhhhhhhhh为 32 位 Unicode 的十六进制值
- Python 中
\0并不去结束一个字符串,Python 会在内存中保持整个字符串的长度和文本 - Python 会以十六进制显示非打印的字符
- 若无合法的转义编码识别
\以及之后的字符,则 Python 会在最终的字符串中保留\
2.raw 字符串是一种特殊的字符串。当r出现在字符串起始引号之前时,为 raw 字符串。这种字符串会关闭转义机制。
raw 字符串不能以\结尾。
3.字符串块:以三重引号包围的字符串(引号为一对单引号或者一对双引号均可)。
三重引号之间的文本会被收集到一个单独的多行字符串中,并且将换行以\n代替。
4.字符串可以有以下操作:
- 加:两个字符串相加,返回一个新的字符串
- 乘:字符串与整数
N相乘,返回一个新的字符串,该字符串是原字符串重复N次 len():返回字符串长度- 迭代:字符串对象是一个可迭代对象
5.字符串支持索引,其中S[i]获取的是偏移为i处的字符(偏移i从 0 开始,
小于等于len(S)-1)。
若偏移
i大于len(S)-1则 Python 会抛出IndexError异常, 提示string index out of range
你也可以提供一个负的偏移,其中-1为最后一个字符,-n为len(S)-n处的字符。
6.字符串支持分片,语法为S[m:n],它返回从m开始到n(不包含n)的一个新字符串。
- 未给出上界时,该分片默认上界为
len(S) - 未给出下界时,该分片默认下界为 0
- 如果是
S[:],则返回字符串S的一个全新拷贝
如果增加步进参数,则语法为S[m:n:k],它返回从m开始到n(不包含n)且每隔k个元素选取一次的一个全新字符串,默认k为 1。
- 若
k为正数则从左到右步进;若k为负数,则从右向左步进 S[::-1]返回 S 的翻转字符串- 负步进时,默认的上下界极限有所不同。
- 上界极限可以为空或者为
len(S)或者为len(S)-1 - 下界极限必须为空,否则 0 号元素会被排除掉
- 上界极限可以为空或者为
7.可以通过str()函数与repr()函数将数字转成字符串。
str()函数的效果类似print()的效果repr()函数产生的结果可以由解释器解释。eval(repr(x))会返回x。
8.可以在单个字符与它对应的 ASCII 码值之间转换:
ord(char):返回单个字符的 ASCII 值chr(ascii_int): 返回 ASCII 值对应的字符
9.字符串是不可变序列,因此不能原地修改一个字符串,只能够生成新的字符串并赋值给原变量。
10.字符串格式化表达式是基于 C 语言的 printf 格式化表达式。其格式为:
"%d %s apples" % (3,'bad')
它返回一个新的字符串。
占位符有多种:
%s:字符串;%r:也是字符串,但用repr()得到的而不是str();
%c:字符;%d:十进制整数;%i:整数;%e:浮点指数;
%f: 浮点十进制;%%:百分号%,%g:自动转成浮点%e或者%f
转换通用目标结构为:
%[(key_name)][flags][width][.precision]type_key_name:用于从右边字典中取对应键的值(此时右边的是字典对象,而不是元组) 如:"%(n)%d %(x)%s" %{"n":3,"x":"apples"}_flags:如果为-则左对齐;如果为+则为正负号;如果为0:则补零 _width: 指定位宽(包括小数点在内),至少为width字符宽度 _precision:指定小数点后几位 >width和precision可以为*,表示它们从输入的下一项中取值 (即从元组中取得) *type为类型,如d,r,f,e等
11.格式化字符串除了使用字符串格式化表达式之外,还可以通过字符串的
.format()方法达到同样的效果。.format()方法支持位置参数、关键字参数、以及二者的混合。- 位置参数:
"{0},{1},{2}".format('abc','def','ghi') - 关键字参数:
"{k1},{k2},{k3}".format(k1='abc',k2='def',k3='ghi') - 混合使用:
"{0},{1},{k}".format('abc','def',k='ghi')
- 位置参数:
格式化字符串中可以指定对象的属性、字典键、序列的索引:
- 指定字典的键:
"{0[a]}".format({'a':'value'}), 注意这里的键a并没有引号包围 - 指定对象的属性:
"{0.platform}".format(sys),也可以用关键字参数:"{obj.platform}".format(obj=sys) - 指定序列的索引:
"{0[2]}".format("abcd"),这里只能进行正索引值,且不能分片
- 指定字典的键:
通用目标结构为:
{fieldname!conversionflag:formatspec}_fieldname为位置数字 0,1,2,... 或者为关键字,它后面可选地跟随 _.name:则指定对象的属性 _[index]:指定了索引 _[key]:指定了字典的键 _conversionflag为转换标记,可以为: _r:在该值上调用一次repr()函数 _s:在该值上调用一次str()函数 _a:在该值上调用一次ascii()函数 _formatspec为格式,其结构为:[[fill] align] [sign] [#] [0] [width] [.precision] [type]_fill一般与align为=时配合 _align为对齐: _<:左对齐 _>:右对齐 _=:必须指定fill(单个字符),此时用这个字符填充 _^:居中对齐 _sign:为正负号标记 _#:作用未知 _0:补 0 _width:位宽 _.precision:精度 _type:为类型,如d,r,f,e等, 但与格式化字符串表达式相比,多了b(二进制格式输出)
_ 某些值可以从
.format()的参数中获取,如"{0:+0{1}d}".format(128,8), 其指定精度信息从format()的参数中取(参数 8)12.格式化单个值比较简单,可以有以下方法:
"%s" % 1.23"%s" % (1.23,),这里(1.23,)是一个单元素元组, 而(1.23)是一个表达式"{0}".format(1.23)13.由于 Python 内部会暂存并重复使用短字符串来进行优化,因此该短字符串在内存中只有一份。
14.浮点数格式化时,采用
%s说明符与%f说明符,其结果不同:
因为按照%f格式化输出时,浮点数有精度和位宽的设定(虽然这里没有显式指定,但是它们有默认值)。而%s格式化输出时,首先调用了str()函数,然后再进行输出。