Python字符串str类型

字符中在Python中表示为strstringString。字符串类型也是一种不可变的序列类型,许多序列类型的特性它有出有。Python3的字符串支持Unicode字符,更好的支持了中文。

字符串变量声明

您可以根据需要使用单引号(')、双引号(")或三引号('''""")声明字符串变量。

  • 单引号:'allows embedded "double" quotes'。
  • 双引号:"allows embedded 'single' quotes"
  • 三引号:'''Three single quotes''', """Three double quotes"""

使用单引号,不用转义字符串中包含的双引号。使用双引号不用转义字符串的单引号。

三引号用于引号当字符跨多行时,如下例所示;

str = '''Python is an easy to learn, powerful programming language. 
It has efficient high-level data structures and a simple but effective approach to object-oriented programming. 
Python’s elegant syntax and dynamic typing, together with its interpreted nature, make it an ideal language for scripting and rapid application development in many areas on most platforms.'''

print(str)

上面的程序将输出如下的结果:

Python is an easy to learn, powerful programming language. 
It has efficient high-level data structures and a simple but effective approach to object-oriented programming. 
Python’s elegant syntax and dynamic typing, together with its interpreted nature, make it an ideal language for scripting and rapid application development in many areas on most platforms.

字符串类型也是一种序列类型,序列类型共有的特性它也有

假设已经定义了一个字符串型的变量s

s = 'Python is an easy to learn, powerful programming language.'
t = ' It has efficient high-level data structures and a simple but effective approach to object-oriented programming.'

那么,可以使用以下序列类型共有的方法和表达式。

表达式 用法 结果
'language' in s 如果s包含'language',则返回True,否则返回False 返回True
'language' not in s 如果s包含'language',则返回False,否则返回True 返回Falsein类似
s + t 拼接字符串 返回'Python is an easy to learn, powerful programming language. It has efficient high-level data structures and a simple but effective approach to object-oriented programming.'
s * 2n * s ns加起来 返回''Python is an easy to learn, powerful programming language.Python is an easy to learn, powerful programming language.''
s[3] 字符串s的索引3处的值 h
s[13:17] 字符串s索引从1317(不包含)的切片 easy
s[13:17:2] 字符串s索引从1317(不包含)的切片每隔2个元素取一个 es
len(s) 字符串s的长度 58
min(s) 字符串s的最小元素 ' '
max(s) 字符串s的最大元素 'y'
s.index('at', 11, 58) 字符串s从索引11(可以省略此参数)到58(可以省略此参数))的第一个at的索引 50
s.count('an') 字符串中an出现的次数 2

字符串的方法

count str.count(sub[, start[, end]]),返回[start, end]范围内子字符串sub的非重叠出现次数。 可选参数startend被解释为切片符号。

>>> 'Python is an easy to learn, powerful programming language.'.count('an', 20, 58)
1

endswith str.endswith(suffix[, start[, end]]),如果字符串以指定的后缀结尾,则返回True,否则返回False。 可选的start表示从该位置开始查找。 可选的end表示在该位置停止比较。

>>> 'Python is an easy to learn, powerful programming language.'.endswith('language.')
True

startswith str.startswith(prefix[, start[, end]]),如果字符串以prefix开头,则返回True,否则返回False。 可选的start表示从该位置开始查找。 可选的end表示在该位置停止比较。

>>> 'Python is an easy to learn, powerful programming language.'.startswith('language.')
False

zfill str.zfill(width),返回用数字'0'补足位数的字符串。 在符号字符之后而不是之前插入填充来处理前导符号前缀 (+/-)。 如果宽度小于或等于len(s),则返回原始字符串。

>>> "42".zfill(5)
'00042'
>>> "-42".zfill(5)
'-0042'

strip str.strip([chars])返回删除前导和尾随字符的字符串副本。chars参数是一个字符串,指定要删除的字符集。 如果省略或None,则默认为删除空格。chars参数不是前缀或后缀,它的值的所有组合都被删除:

>>> '   spacious   '.strip()
'spacious'
>>> 'www.example.com'.strip('cmowz.')
'example'

类似的rstrip只匹配的尾随字符,lstrip只匹配的前导字符。

split str.split(sep=None, maxsplit=- 1) 返回字符串中单词的列表,使用sep作为分隔符字符串。 如果给出了maxsplit,则最多完成maxsplit次分割(因此,列表最多有maxsplit+1个元素)。 如果未指定maxsplit或为-1,则对拆分的数量没有限制(进行所有可能的拆分)。

>>> '1,2,3'.split(',')
['1', '2', '3']
>>> '1,2,3'.split(',', maxsplit=1)
['1', '2,3']
>>> '1,2,,3,'.split(',')
['1', '2', '', '3', '']

join str.join(iterable) 返回一个字符串,它是参数iterable的串联。 如果iterable对象中有任何非字符串值,包括字节对象,则会引发 TypeError。 元素之间的分隔符是在其上调用此方法的字符串。

>>> ",".join(['1','2','3','4','5'])
'1,2,3,4,5'

removeprefix str.removeprefix(prefix, /) 如果字符串以prefix字符串开头,则返回string[len(prefix):]。 否则,返回原始字符串的副本:

>>> 'TestHook'.removeprefix('Test')
'Hook'
>>> 'BaseTestCase'.removeprefix('Test')
'BaseTestCase'

与此类似removesuffix用于删除后辍

replace str.replace(old, new[, count]) 返回字符串的副本,其中所有出现的子字符串old都被new替换。 如果给出了可选参数count,则只替换count次。

>>> 'Python is an easy to learn, powerful programming language.'.replace('Python','Py')
'Py is an easy to learn, powerful programming language.'

find str.find(sub[, start[, end]]) 返回在切片s[start:end]中找到子字符串sub的字符串中的最小索引。 可选参数startend被解释为切片符号。 如果未找到sub则返回-1

格式化字符串

Python支持很多种字符串格式化方法,这里我们重点讲其中的两种

  • %——字符串格式化或插值运算符
  • 字符串的format方法

%字符串格式化或插值运算符

>>> print('云南省2020年的GDP总量为:%f万亿'%2.5)
云南省2020年的GDP总量为:2.500000万亿

如上例中字符串中显示了一个%f,表示这是为真实值的预留位置,它的类型是浮点数。字符串后跟随着一个%,它的后面是参数。

除了浮点数,还可以指定其它类型

符号 类型
%s 字符串 (采用str()的显示)
%r 字符串 (采用repr()的显示)
%c 单个字符
%b 二进制整数
%d 十进制整数
%i 十进制整数
%o 八进制整数
%x 十六进制整数
%e 指数 (基底写为e)
%E 指数 (基底写为E)
%f 浮点数
%F 浮点数,与上相同
%g 指数(e)或浮点数 (根据显示长度)
%G 指数(E)或浮点数 (根据显示长度)
%% 字符"%",显示百分号%

假如有多个位置需要插值,则需求使用元组(设置了名称时使用字典)来给它们传值

>>> print('云南省%d年的GDP总量为:%f万亿'%(2020,2.5))
云南省2020年的GDP总量为:2.500000万亿

%运算符可以用如下的方式,对格式进行进一步的控制,遵循以下的格式:

%[(name)][flags][width].[precision] typecode
  1. [(name)]表示为参数命名
>>> print('云南省%(year)d年的GDP总量为:%(total)f万亿'%{"year":2020,"total":2.5})
云南省2020年的GDP总量为:2.500000万亿
  1. [flags]取值范围为+-' '0。这个值与宽度[width]有密切的关系。如果设置了宽度则总是显示留出设置的宽度。+表示如果参数值为正数总是显示+并右对齐。-表示如果参数值为负数总是显示-并左对齐。' '为一个空格,表示在左侧填充空格以满足[width]设置的要求。0表示使用0填充以满足[width]设置的要求。
>>> print('云南省%(year)d年的GDP总量为:%(total)-010.2f万亿'%{"year":2020,"total":2.5})
云南省2020年的GDP总量为:2.50      万亿
>>> print('云南省%(year)d年的GDP总量为:%(total)+010.2f万亿'%{"year":2020,"total":2.5})
云南省2020年的GDP总量为:+000002.50万亿
>>> print('云南省%(year)d年的GDP总量为:%(total)+10.2f万亿'%{"year":2020,"total":2.5})
云南省2020年的GDP总量为:     +2.50万亿
>>> print('云南省%(year)d年的GDP总量为:%(total)+10.2f万亿'%{"year":2020,"total":-2.5})
云南省2020年的GDP总量为:     -2.50万亿
>>> print('云南省%(year)d年的GDP总量为:%(total)-10.2f万亿'%{"year":2020,"total":-2.5})
云南省2020年的GDP总量为:-2.50     万亿
>>>
>>> print('云南省%(year)d年的GDP总量为:%(total)-10.2f万亿'%{"year":2020,"total":2.5})
云南省2020年的GDP总量为:2.50      万亿
>>> print('云南省%(year)d年的GDP总量为:%(total) 10.2f万亿'%{"year":2020,"total":2.5})
云南省2020年的GDP总量为:      2.50万亿
>>> print('云南省%(year)d年的GDP总量为:%(total)010.2f万亿'%{"year":2020,"total":2.5})
云南省2020年的GDP总量为:0000002.50万亿
  1. [width]表示显示宽度,如果宽度不足,默认用空格填充,如果[flags]设置为0则用0填充。

  2. .[precision]表示参数的保留几位小数,我们在演示2项的时候已经将参数设置为保留两位小数。

  3. typecode 参数类型,前面已经讲过

使用str.format格式化字符串

<模板字符串>.format(<逗号分隔的参数>)

>>> '云南省{}年的GDP总量为:{}万亿'.format(2020, 2.5)
'云南省2020年的GDP总量为:2.5万亿'
>>> '云南省{0}年的GDP总量为:{1}万亿'.format(2020, 2.5)
'云南省2020年的GDP总量为:2.5万亿'

format()方法中<模板字符串>的槽除了包括参数序号,还可以包括格式控制信息。此时,槽的内部样式如下:

{<参数序号>: <格式控制标记>} # 中间使用了一个冒号哦!

其中,<格式控制标记>用来控制参数显示时的格式,包括:<填充><对齐><宽度><,><.精度><类型>6 个字段,这些字段都是可选的,可以组合使用,逐一介绍如下。

  • <填充><宽度>内除了参数外的字符采用什么字符填充,默认使用空格填充。
>>> '{0:20}'.format('python')
'python              '

设置填充的字符需要同时设置对齐方式。

  • <对齐> 在<宽度>内输出时的对齐方式,分别使用<>^三个符号表示左对齐、右对齐和居中对齐。
>>> '{0:-^20}'.format('python')
'-------python-------'
>>> '{0:*>20}'.format('python')
'**************python'
  • <宽度> 指当前参数显示的宽度,如果这里设置的宽度小于参数的实际宽度,则以参数的实际宽度显示。如果设置的宽度大于参数的实际宽度,则使用<填充>设置的字符来填充。
>>> '{0:-^5}'.format('python')
'python'
  • <,> 显示数字的千位分隔符
>>> '{0:-^20,}'.format('12345')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Cannot specify ',' with 's'.
>>> '{0:-^20,}'.format(12345)
'-------12,345-------'

指定非数值类型时,将引发异常

  • <.精度> 对于整数和浮点数,精度表示小数部分输出的有效位数。对于字符串,精度表示输出的最大长度。
>>> '{0:-^20.2f}'.format(12345.678)
'------12345.68------'
>>> '{0:-^20.4}'.format("python")
'--------pyth--------'
  • <类型> 整数和浮点数类型的格式规则。

整数类型,输出格式包括6种

b: 整数的二进制形式; c: 整数对应的Unicode字符; d: 整数的十进制形式; o: 整数的八进制形式; x: 整数的小写十六进制形式; X: 整数的大写十六进制形式;

>>> '{0:b}'.format(12345)
'11000000111001'
>>> '{0:c}'.format(12345)
'〹'
>>> '{0:d}'.format(12345)
'12345'
>>> '{0:o}'.format(12345)
'30071'
>>> '{0:x}'.format(54321)
'd431'
>>> '{0:X}'.format(54321)
'D431'

浮点数类型,输出格式包括4种

e: 浮点数对应的小写字母e的指数形式; E: 浮点数对应的大写字母E的指数形式; f: 浮点数的标准浮点形式; %: 浮点数的百分形式。

>>> '{0:.2e}'.format(54635343.08534)
'5.46e+07'
>>> '{0:.2E}'.format(54635343.08534)
'5.46e+07'
>>> '{0:.2f}'.format(54635343.08534)
'54635343.09'
>>> '{0:.2e}'.format(54635343.08534)
'0.55'
>>> '{0:.2%}'.format(54635343.08534)
'54.64%'