本笔记是基于《Python学习手册-原书第五版》第七章 字符串基础的个人理解。
Python字符串是一个有序的字符集合,用来存储和表示基于文本和字节的信息。
在Python3.X中有三种字符串类型——str用于Unicode文本;bytes用于二进制数据;bytearray是bytes的一个可修改的变体。
文件在两种模式下工作——文件,将内容表示为str类型并实现Unicode编码;二进制,以原始bytes的形式处理,不做任何数据转换。
与C语言不同的是,Python中的字符串有一套强大的处理工具集;但是Python没有为字符串留有不同的类型。
单引号和双引号
在Python中,单引号和双引号是可以互换的。支持这个的原因是可以不进行转义符就能输入单引号或双引号。
# 在字符串之间添加逗号会生成元组
>>> 'Python',"Python"
('Python', 'Python')
>>> 'Python"s',"Python's"
('Python"s', "Python's")
# 没有逗号则会执行拼接操作
>>> 'Python'"Java"
'PythonJava'
转义符
转义符能让我们在字符串中嵌入不容易通过键盘输入的字符。
# 换行符
>>> s = 'a\nb'
>>> print(s)
a
b
# 制表符
>>> s = '\tab'
>>> print(s)
ab
# 转义符会被认为是一个字节
>>> s
'\tab'
>>> len(s)
3
当我们输入的字符串可能带有转义符的字面量,但我们不需要转义的时候。
# 文件路径往往和转义符号有冲突
file = opem('C:\new\text.dat', 'w')
# 我们可以在字符串前加r来阻止转义
file = open(r'C:\new\text.dat', 'w')
# 也可以通过\\来表示反转义符
file = open('C:\\new\\text.dat', 'w')
?
三引号
三引号可以用来作为跨行输入来使用,也可以作为注释来使用。三引号会包围所有的文本,并且自动在换行出添加换行符。
常用在Python源文件中嵌入多行出错消息,或HTML、XML和JSON代码中。常用于文档字符串,当它出现在文件的特定地点是,会被当做注释。
# 三引号会自动在换行出添加换行符
>>> s = """aaa
bbb
ccc
"""
>>> s
'aaa\nbbb\nccc\n'
# 三引号会保留所有包围的文本
>>> s = ''' aaa #这段是注释
bbb
ccc
'''
>>> s
' aaa #这段是注释\nbbb\nccc\n'
# 三引号作为注释使用
>>> s = 'aaa'
>>> '''
bbb
ccc
'''
>>> s
'aaa'
字符串的一些常用操作
# 求字符串的长度
>>> len('abc')
3
# 字符串的拼接
>>> 'abc'+'def'
'abcdef'
# 字符串的重复
>>> 'a'*4
'aaaa'
# 使用for循环对字符串遍历
>>> for c in "Pyhon":print(c, end=' ')
P y h o n
# 判断子字符是否在字符串中
>>> 'on' in 'Python'
True
索引和切片
和C语言一样,Python的偏移量是从0开始的,以比字符串长度小1的偏移量结束。
和C语言不一样,Python还支持负偏移量。
负偏移量+len(字符串) =? 正偏移量
索引就是读取偏移量位置的字节;切片就是读取起始偏移量至末尾偏移量前的一段子字符串。
>>> s = 'Python'
#索引,读取偏移量为0的元素
>>> s[0]
'P'
#切片,读取偏移量为1~偏移量为(2-1)的元素
>>> s[1:2]
'y'
#切片,读取偏移量为1~偏移量为(3-1)的元素
>>> s[1:3]
'yt'
#切片,读取偏移量为-3~偏移量为(-1-1)的元素
>>> s[-3:-1]
'ho'
切片的完整形式为X[I:J:K],表示提取对象X中的全部元素,从偏移量I~偏移量(J-1),每隔K个元素提取一次。K的默认值为1.
>>> s = 'abcdefg'
# 从偏移量1~偏移量(5-1),间隔(2-1)个元素提取一次。
>>> s[1:5:2]
'bd'
# I的默认值是0,J的默认值是字符串的长度
>>> s[::2]
'aceg'
# 当K为-1时就是倒数
>>> s[::-1]
'gfedcba'
>>> s[::-2]
'geca'
字符串转换
在Python中,字符串是不能和数字做算术运算的。
# Python中不能进行混合运算
>>> '42'+1
TypeError: can only concatenate str (not "int") to str
# 将字符串转换成数字
>>> int('42')+1
43
# 将数字转换成字符串
>>> str(42)
'42'
# 返回可作为代码的字符串,在Python3.X被删除
>>> repr(42)
'42'
>>> repr('42')
"'42'"
# 字符串与ASCII码之间的转换
>>> ord('s')
115
>>> chr(115)
's'
字符串方法
Python提供了一系列实现复杂文本处理的方法。在Python中,表达式和内置函数可以在不同的类型之间工作,但是方法通常特定于对象类型。
方法的调用语法是object.attribute形式,可以理解为“获取对象object中attribute属性的值。”
函数调用的语法是function(arguments)形式,可以理解为“调用函数function的代码,想起传递参数argument对象,并且返回函数function的结果值”
合并两者就是object.method(arguments)。Python首先读取对象object的方法method,然后调用它,向这个方法传递参数。——使用参数调用方法来处理对象。
# 使用replace方法替换字符————生成新的字符
>>> s = 'Pythan'
>>> s = s.replace('a', 'o')
>>> s
'Python'
>>> 'Pythan'.replace('a', 'o')
'Python'
# replace可以传入参数来决定改变几个
>>> 'Pythooon'.replace('o', 'a', 2)
'Pythaaon'
# 拼接操作和replace方法都会生成一个新的字符串
# 有时候为了脚本的性能,可以将字符串转换为一个支持原位置修改的对象
# 对列表改变之后,在用join方法转变回字符串
>>> s = 'Pythan'
>>> l = list(s)
>>> l
['P', 'y', 't', 'h', 'a', 'n']
>>> l[4] = 'o'
>>> l
['P', 'y', 't', 'h', 'o', 'n']
>>> s = ''.join(l)
>>> s
'Python'
# join()方法还可以用来加符号或字符
>>> L = ['Java','Python','C++']
>>> s = ','.join(L)
>>> s
'Java,Python,C++'
# split()方法可以传入需要识别的符号或字符对字符串进行分割
>>> cols = s.split(',')
>>> cols
['Java', 'Python', 'C++']
# 其他常用的字符串方法
>>> s = 'I learn Python today!\n'
# rstrip()方法删除末尾指定的字符,默认值是空格。
>>> s.rstrip()
'I learn Python today!'
# upper()方法将字母转变为大写。
>>> s.upper()
'I LEARN PYTHON TODAY!\n'
# isalpha()方法判断字符串是否全部是字母
>>> s.isalpha()
False
# endswith()方法判断字符串是否以传入的子字符串结尾。
>>> s.endswith('today!\n')
True
# startswitch()方法判断字符串是否以传入的子字符串开头。
>>> s.startswith('I')
True
字符串格式化
Python中的格式化有表达式和方法调用两种方法。常用于格式化文本显示给程序用户的时候。
字符串格式化表达式的格式为
'...%s...'%(values)
# 格式化表达式
>>> 'I learn %s %f'%('Python', 3.9)
'I learn Python 3.900000'
# 常用的方法
>>> s = ('Python', 3.9)
>>> 'I learn %s %f'%s
'I learn Python 3.900000'
# 转换的目标结构为
# %[(keyname)[flag][width][.precision]]typecode
# (keyname) 可以为字典提供键名字
# [flag] 可以填入(-)左对齐;(+)数值符号,正数前的空白和负数前的(-)都可以表示空白,0
# [width] 可以填入需要的宽度
# [.precision] 可以填入需要的精度
# typecode 可以填入需要的类型码
# 宽度和填充
>>> x = 1111
>>> res = 'integers:...%d...%-6d...%06d'%(x,x,x)
>>> res
'integers:...1111...1111 ...001111'
# 精度
>>> 'I learn %s %.2f'%s
'I learn Python 3.90'
# 字典的格式化表达式
>>> '%(brand)s is %(color)s'%{'brand':'xiaomi', 'color':'pink'}
'xiaomi is pink'
字符串格式化方法调用的格式为
‘...{}...’.format(values)
# 格式化方法调用
>>> s = '{0}, {1} and {2}'
>>> s.format('Java','Python','C++')
'Java, Python and C++'
# 格式化方法调用
>>> s = '{brand} is {price}'
>>> s.format(brand = 'xiaomi', price = 2999)
'xiaomi is 2999'
# 格式化方法调用
>>> s = '{brand} {0} {price}'
>>> s.format('pink', brand = 'xiaomi', price=2999)
'xiaomi pink 2999'
# 格式化方法调用可以传入对象
# 格式化表达的格式
# 花括号内{filedname component !conversionflag : formatspec}
# filedname是辨识参数的一个可选的数字或关键字
# component是有着大于等于零个'.name'或[index]引用的字符串
# !conversionflag如果出现以!开始后面跟着r/s/a分别表示repr/str/ascii内置函数
# formatspec组件也有丰富的格式
# [[fill]align][sign][#][0][width][,][.precision][typecode]
# 可以填入除{}以外的任意填充字符
# align可以填入<、>、=或^分别表示左对齐,右对齐,符号字符后的填充,居中
# sign可以是+、-或空格
# ,号表示使用千分位分隔符
示例
>>> '{0:10} = {1:10}'.format('Python', 2999)
'Python = 2999'
示例
>>> '{0:>10} = {1:<10}'.format('Python', 2999)
' Python = 2999 '
|