python字符串类型
python中的字符串
python中的字符串类型为str,也是平时操作的类型。但除了str类型,还有⼀个专门的名为"string"的模块(导⼊即可知),是很早以前没有str类型的时候⽤的,现在⼏乎不⽤。
在python 3.x中,字符串的类型str是Unicode的。除此之外还有byte类型、bytearray类型。关于byte和bytearray,参考。
⼀些和字符相关的官⽅⼿册:
字符串常量
下⾯是⼏个字符串:
'malong'
'malong\'s girl friend' # 包含了单引号
'malong\n' # \n换⾏了
"malong\n" # 换⾏了
'malong
girl friend' # 换⾏了
'malong\\n' # 没换⾏
'''malong's girl''' # 包含了单引号
"""malong
shuai""" # 换⾏了
python中可以使⽤单引号、双引号、三引号包围字符串,并可以使⽤反斜线转义特殊字符:
单、双引号是完全⼀致的,不像其他语⾔⼀样有强、弱引⽤之分
三引号('''xxx'''或"""xxx""")包围的字符完全是字⾯符号,包围什么就得到什么,包括换⾏,且不会进⾏任何转义、替换等
使⽤这种块字符串的⽅式,在输⼊需要换⾏的字符串时⾮常⽅便
⽽且可以作为块注释符注释⼀段代码。这表⽰这段被包围的代码解释为字符串,但因为没有赋值给变量,所以直接丢弃了
反斜线\可以转义特殊字符,例如在字符串中保留单引号"a\'b"
但是python在输出字符串的时候,总是倾向于使⽤单引号,除⾮字符串中包含了单引号。对于那些⾮打印字符,将总是使⽤⼗六进制的⽅式输出。
例如:
unicode字符的种类有>>> "aaa",'aaa'
('aaa', 'aaa')
>>> print("aa\na")
aa
a
>>> print('aa\na')
aa
a
>>> '''aaaa
... aaa
... '''
'aaaa\naaa\n'
>>> '\001' # ⼆进制字符,⼗六进制格式输出
'\x01'
raw字符串
虽然可以通过反斜线\转义去调整字符串,但带上反斜线有时候会严重影响可读性。如果不想使⽤反斜线转义,可以考虑使⽤三引号包围,也可以使⽤r来声明后⾯的字符串是raw字符串,这⾥⾯的所有字符都是字⾯意义的,不会进⾏任何转义。
例如:
>>> 'abc\nd'
'abc\nd'
>>> len('abc\nd')
5
>>> r'abc\nd'
'abc\\nd'
>>> len(r'abc\nd')
6
经常在open()函数打开Windows⽂件的时候会使⽤raw字符串。例如下⾯三种⽅式:
open('d:\') # (1)
open('d:\\new\\') # (2)
open(r'd:\') # (3)
(1)中解释字符串的时候,发现⾥⾯有\n和\t,它们会分别解释为换⾏符和制表符,这显然不可能是想要打开的⽂件。所以,在(2)中,使⽤反斜线将反斜线⾃⾝进⾏了转义。⽽(3)中使⽤r声明这是⼀个raw字符串,⾥⾯的转义序列不会进⾏转义,⽽是作为普通字符,所以这⾥的\表⽰的是路径的分隔符号。
当然,考虑到可移植性的问题,open()函数中直接使⽤斜线也可以表⽰windows中的路径分隔符。所以下⾯是有效的:
open('d:/')
注意,raw字符串不能以反斜线结尾,除⾮对其转义。例如r'abc\ndef\'是错误语法,但r'abc\ndef\\'是正确的语法,它表⽰后⾯有两个反斜线字符。
>>> print(r'abc\nd\a\\')
abc\nd\a\\
>>> r'abc\nd\a\'
File "<stdin>", line 1
r'abc\nd\a\'
^
SyntaxError: EOL while scanning string literal
字符串转换
数值和字符串类型不能直接放在⼀起操作,例如9 + "9"是错误的。要将⼀个数值类型转换成字符串类型,可以使⽤str()⽅法或repr()⽅法。>>> str(8)
'8'
>>> repr(8)
'8'
它们都表⽰返回字符串类型的数据。
当使⽤print()输出str()或repr()转换的内容,它们的结果会不⼀样:
>>> print(str('a'))
a
>>> print(repr('a'))
'a'
⼀般来说使⽤str()即可,在学习到__str__()和__repr__()之前,没必要去区分str()和repr()。
操作字符串
在python中,操作字符串的⽅式有多种,⼤概概括有:
字符串是⼀个序列,且是不可变序列,所以序列的通⽤操作和不可变序列的操作都能应⽤在str上
string对象⾃⾝实现了很多⽅法,⽐如⼤⼩写转换、⼦串搜索、截断等等
字符串连接,如"abc" "def"或"abc" + "def"是等价的,都是"abcdef","a" * 3得到"aaa"
字符串格式化(本⽂不介绍,因为内容太长,见后⾯的⽂章)
例如:
>>> len("abc")
3
>>> 'abc' 'def'
'abcdef'
>>> 'abc' + 'def'
'abcdef'
>>> 'abc' * 3
'abcabcabc'
>>> 3 * 'abc'
'abcabcabc'
通过字符串的乘法"*"操作,可以轻松地重复给定数量的字符。例如:
>>> print("-" * 20)
--------------------
>>> print("-" * 20)
--------------------
轻松地就能得到长度⼀样的分割线。
注意,这两个符号不能操作数值、字符串的混合表达式,因为python不会⾃动转换隐式转换数据类型。
>>> "3" + 3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be str, not int
因为python中的字符串是⼀种序列类型,所以可以使⽤in来测试字符串中是否包含某个字符或⼦串。
>>> 'o' in "hello"
True
>>> 'a' in "hello"
False
>>> 'll' in "hello"
True
同样,因为是序列类型,可以使⽤for来遍历整个字符串:
>>> str = "longshuai"
>>> for i in str:
... print(i, end=",")
.
..
l,o,n,g,s,h,u,a,i,
在for遍历字符串的过程中,控制变量i会取得字符串中的每个字符。
字符串的索引和分⽚操作
字符串是⼀种序列,可以应⽤序列的⼀种⾮常⽅便的分⽚操作。关于序列的相关操作(包括分⽚),详细内容见,此处介绍⼀些基本的操作。必须注意,因为字符串是不可变对象,⽆法原处修改,所以⽆论是索引取值还是分⽚操作,都会创建新字符串对象。
索引取单个元素
例如,通过索引从字符串中取元素:
'm'
>>> str[1]
'a'
索引位可以是负数,表⽰从尾部开始取元素,-1表⽰倒数第⼀个元素,-2表⽰倒数第⼆个元素。
>>> str[-1]
'g'
>>> str[-2]
'n'
所以,-i的索引位等价于len() - i的索引位。
>>> str[-1]
'g'
>>> str[len(str) - 1]
'g'
分⽚取多个元素
分⽚的⽅式是使⽤[i:j]或[i:j:k]的⽅式,表⽰从索引位i开始取到索引位j(不包含j),i或j都可以省略。如果指定了k,则表⽰每隔k个元素取⼀次,也就是取⼀次元素之后跳过(k-1)⼀个元素。i、j、k都可以使⽤负数。
例如:
>>> str = 'malong'
>>> str[1:3]
'al'
[1:3]表⽰从索引位1取到索引位3,不包括3的元素。
可以使⽤负数的索引位。下⾯的表⽰从第3个元素取到倒数第2个元素,但不包含倒数第⼆个。
>>> str[2:-2]
'lo'
i和j都可以使⽤负数。
>>> str[-4:-2]
'lo'
可以省略i或j,或都省略。[:j]表⽰从头取到索引位为j的元素(不包含j),[i:]表⽰从索引位i开始取到结尾,[:]表⽰从头取到尾,也就是拷贝⼀份字符串。>>> str[:3]
'mal'
>>> str[:-1]
'malon'
>>> str[1:]
'along'
>>> str[-4:]
'long'
>>> str[:]
'malong'
指定k时,可以跳过指定间隔的元素。默认为1,表⽰每隔⼀个元素取⼀次,也就是不跳过任何元素。指定为2时表⽰取1次跳过⼀个元素。
>>> str
'malong'
>>> str[::1]
'malong'
>>> str[::2]
'mln'
所以,取奇数位的字符和偶数位的字符就很简单了。
>>> str[::2] # 取奇数位
'mln'
>>> str[1::2] # 取偶数位
'aog'
如果k为负数,则表⽰反序取元素。例如:
>>> 'abcde'[::-1]
'edcba'
>>> 'abcde'[::-2]
'eca'
再看下⾯反序输出的例⼦。
>>> 'abcdefgh'[5:0:-1]
'fedcb'
表⽰反序0-5的元素abcdef,但不包含0位,即得到fedcb。也就是说得到索引位1-5的反序结果。
所以:
>>> 'abcdefgh'[5:0:-2]
'fdb'
字符串⽅法
因为内容较多,本⼈已从官⽅⼿册翻译并整理成单独的⽂章,见
修改字符串
字符串是不可变数据类型,要修改字符串,只能通过分⽚新建字符串对象并进⾏合并,或者直接使⽤字符串⽅法。
例如:
>>> s = "hello"
>>> s[0] = "H"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
要修改第⼀个元素,可以从原始字符串中切⽚取出后⾯的字符,并结合修改的⽬标字符构建⼀个新的字符串,并赋值给原始变量。
>>> s = "H" + s[1:]
>>> s
'Hello'
再例如,将⼀个新字符串追加到源字符串的尾部:
>>> s = "hello"
>>> s = s + " world"
>>> s
'hello world'
>>> s = "hello world"
>>> s = s[:6] + "your " + s[6:]
>>> s
'hello your world'
>>> s = "hello world"
>>> where = s.find("world")
>>> where
6
>>> s = s[:where] + "your " + s[where:]
>>> s
'hello your world'
因为会创建新对象,所以会创建新内存空间。但这并不⼀定意味着效率会有多差,python对于不使⽤的内存空间会⾃动回收,在有可能的情况下python会⽴即重⽤这段空间。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论