字符串
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
:补0width
:位宽.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()
函数,然后再进行输出。