五:python 对象类型详解二:字符串(上)
一:常量字符串
常量字符串用起来相对简单,也许最复杂的事情就是在代码中有如此多的方法来编写它们。
eg:单引号:'spam"m' , 双引号: “spa'm” , 三引号:‘’‘... spam ...'''或者 “”“... spam ..."""。
转义字符:”s\tp\na\0m“
Raw字符串:r"C:\new\test.spm"
Python3.0 中的Byte字符串:b'so\x01am'
python2.6 中的Unicode字符串: u'eggs\u0020spam'
Note:在python中,单引号和双引号是可以互换的。之所以这样做,是因为我们可以不使用反斜杠转义字符就可以实现一个字符串中包含其余种类的引号。当然也可以使用反斜杠转义字符去嵌套引号。
>>>'knight"s',"knight's" #不用转义字符的引号的相互使用 (knight"s,knight's)
另外,python 自动在任意的表达式中合并相邻的字符串常量,尽管可以用‘+’操作符来明确表示这是一个合并操作。
>>>title = "Meaning " 'of' "Life" #Implicit concatenation >>>title 'Meaning of Life'
Note:这些字符串之间增加逗号会创建一个元祖,而不是一个字符串。并且python 倾向于打印单引号,除非字符串内已经有了单引号了。
1,用转义字符序列代表特殊字节:反斜杠用来引入特殊的字节编码,是转义序列。在交互模式下是以转义字符的形式回显的,但是print会将其解释出来:
>>>s 'a\nb\tc' >>>print(s) a b c
需要注意的是在用转义字符时,\xhh 表示16进制数字,即\x之后只能跟两个数字(0-F);\ooo 表示八进制数字,即之后可以跟三个数字(0-7);在看一个字符串长度时有用。
Note:python 中,空字符不会像C语言那样去结束一个字符串。相反,Python 在内存中保持了整个字符串的长度和文本。事实上,python 没有字符会结束一个字符串。另外,python 以十六进制显示非打印的字符。
>>>s = '\001\002\0x03' >>>s '\x01\x02\x03' #十六进制显示 >>>len(s) 3
如果Python 没有作为一个合法的转义编码识别出在‘\’ 后的字符,它就直接在最终的字符串中保留反斜杠。
>>>x = "C:\py\code" >>>x 'C:\\py\\code' #显示结果为\\,避免字符转义情况的发生 >>>len(x) 10
Note:除非你能记住所有的转义字符列表,才不会出现这种现象。如果希望编写明确的常量反斜杠,重复两个"\\" 或者使用raw 字符串是个不错的选择。
2,raw 字符串抑制转义:
Python 新手有时会像下面这样打开一个文件: myfile = open('C:\new\text.dat','w') 但是这里有些问题,“\n”,"\t" 在字符串中会被当作转义字符处理,这也是使用 raw 所要解决的问题。如果r(大小写均可以)出现在字符串的第一个引号的前面,它将会关闭字符转义机制。因此为了避免这种文件名的错误,记得在windows中增加字母r:
一种解决方法:myfile = open(r'C:\new\text.dat','w'')
另一种解决方法: myfile = open('C:\\new\\text.dat','w')
3,三重引号编写多行字符串块:
这是一种对编写多行文本数据来说很便捷的语法。但是在特定的地方会起到注释作用,即注释多行代码。
二:实际应用中的字符串:
1,基本操作:
字符串可以通过“+”进行合并并且可以通过“ * ”进行重复。
2,索引和分片:
字符串定义为字符的有序集合,所以我们能够通过其位置获得他们的元素。在pyhton 中,字符串中的元素是通过索引来提取的。并且python 和C语言一样,字符的偏移量是从0开始的,上界比字符串的长度小1.并且支持负偏移。偏移值为-1表示为这个字符串的最后一个元素的位置。从技术上讲,一个负偏移与这个字符串的长度相加后得到这个字符串的正偏移。所谓分片,其实是索引的一个扩展,即返回的不是一个字符串元素,而死一个子字符串。分片可以用于提取部分数据,分离出前后缀等。
在分片时,左边的偏移量作为下边界(包含下边界在内),而右边的偏移作为上边界(不包含上边界在内)。并返回一个包含了所获取元素的新的对象。二哥:
--s[i : j] 提取对应的部分作为一个序列:
--分界的边界默认为0和序列的长度,如果没有明确给出的话
--s[ : ] 获取了从偏移0到末尾之间的元素,这有效地实现了顶层 s 的拷贝。Note:一个有相同值,但是是不同内存片区的对象。
--s[ : -1] 不包括最后一个元素
3,扩展分片:第三个限制值
python 分片表达式增加了一个可选的第三个索引,用作步进。所以分片的形式变成:X[I : J : K],即每隔K个元素索引一次。K 默认为1。可以使用负数作为步进,步进-1表示分片将会从右到左进行而不是通常的从左到右。实际效果就是将序列进行反转:
>>>s = 'hello' >>>s[ : : -1] 'olleh' >>> >>> >>>s = 'abcedfg' >>>s[5:1:-1] #以反转的顺序获得从2到5的元素 'fdec'
通过一个负数步进,两个边界的意义实际上进行了反转。之外,其实分片等同于用一个分片对象进行索引。
>>>'spam'[1 : 3] 'pa' >>>'spam'[slice(1,3)] 'pa' >>> >>>'spam'[ : :-1] 'maps' >>>'spam'[slice(None,None,-1)] 'maps'
Note:为了去掉换行字符常常推荐采用line.rstrip()方法,因为这个调用将会留下没有换行字符那行的最后一个字符。
4,字符串转换工具:
int 函数将字符串转换为数字,而str 函数将数字转换为字符串表达形式。这两个也是通用的指定转换工具。类似的,float 函数也可以将字符串转换成浮点数(类似于 int 函数)。
5,字符串代码转换:
同样是转换,单个字符也可以通过将其传递给内置函数ord(),转换成对应的ASCII码,而chr()函数将会执行相反的操作。这些工具也可以用来执行一种基于字符串的数学运算:
>>>s = '5' #字符串的数字运算 >>>s = chr(ord(s) + 1) >>>s '6' >>>ord('5') - ord('0') #字符串转换为整数 5
6,修改字符串:
字符串为不可变序列,不能原地修改一个字符串,如果需要改变一个字符串,则需要对进行变化的原字符串赋值给一个新的字符串,并用原字符串的名字来命名。
>>>s = 'spam' >>>s[0] = 'x' TypeError: 'str' object does not support item assignment