山地人

Python 字符串(String)

山地人
山地人
2021-07-02

创建字符串

字符串是一串连续的字符,我们有四种创建字符串的方法: 单引号,双引号和三引号(三单引号/三双引号)。

三种创建方式的区别

三引号和其他两种(单、双引号)在创建字符串上还有一些不同,单引号和双引号创建的字符串换如果字符串里要换行,必须使用换行符来创建\n,但三引号创建的字符串除了支持\n换行,还支持显式的换行方式创建。

因此,在写文档注释的时候,用三引号的方式来编写文档注释会更加普遍。

字符串实际上是str类型的对象。我们可以用type()函数来测试字符串示例的类型就能发现这点。

不可变的字符串

字符串是不可变数据,也就是所字符串一旦创建时不能再次修改的。比如一个变量被赋值为一个字符串后,这个字符串的内容是不能被修改的,你能做的只是重新对变量赋值一个新的字符串。即使str提供了类似join这样的函数,但使用这个函数得到的是一个新的字符串,而不是对原来字符串进行修改。

上面的实验中,我们用id()函数来打印msg的id,发现经过join()操作后得到的新的msg和原来的msg的id并不相同。

获取部分字符串

Python支持通过索引的方式来获取一个字符串中的部分字符,下面让我们看看一些常见的部分字符串获取的场景。

如何单个字符

对于一个字符串,我们可以通过字符串[索引]的方式来获取这个字符串中指定索引的字符,索引的起始值为0。

字符串[0]获取的是字符串中的第一个字符。因为Python没有单独的字符的概念,所以获取出的单个字符也是一个字符串。

Python也支持负值索引,比如使用[-1]获取最后一个元素。[-2]获取倒数第二个元素。

获取部分字符串

我们还可以通过[a:b]的方式获取从a索引到b索引之间的字符串,右侧的b所对应的字符不包括在内,所以用数学区间表示[a,b) 是一个左闭右开区间。

拼接字符串

使用+连接操作符,将两个字符串拼接生成一个新字符串。

生成重复字符串

对于生成重复字符串,Python提供了一种非常便捷的操作符*字符串 * 5就会生成一个重复5次的新字符串。

相邻的字面量字符串可以自动连接。下面这个例子将三个使用了不同字符串定界符创建的字符串拼接生成了一个新的字符串。对于这种几个连续的字符串字面量 中间通过空格隔开的字符串,解释器会自动将他们合并成一个字符串。

遍历字符串

对于一个字符串,可以使用for循环来遍历字符串中的每一个字符。

检查字符串中是否存在指定字符

对于想要判断字符串中是否存在某个指定的字符,可以用in关键词,反之使用not in

查询字符的长度

格式化字符串

如果想动态格式化一些带数据的字符串,这里有几种格式化的方法。

  • % 格式化
  • format函数 格式化
  • f-string 格式化

% 格式化

如果你熟悉C语言,你应该会知道C语言里的printf函数。Python也支持类似printf的格式化方式。

print("%s 得分 %f" % ("Python", 95.5))

格式化符号:

符号说明
%c格式化单个字符
%s格式化字符串
%d格式化整数
%u格式化无符号整数
%o格式化无符号八进制数
%x格式化无符号十六进制数
%X格式化无符号十六进制数(大写)
%f格式化浮点数
%e使用科学计数法格式化(小写e)
%E使用科学计数法格式化(大写E)
%g使用科学计数法格式化(小写e)
%G使用科学计数法格式化(大写E)
%p以十六进制格式化变量地址

format格式化

对于字符串,我们可以使用字符串的format格式化函数来对字符串进行格式化。

str.format()

上面的{}是占位符,format函数会用对应位置的参数去格式化{}。如果占位符内指定了参数索引(0表示第一个参数),那么format函数会用指定位置的参数来格式化。

"{1}对于{0}来说很有趣,{0}会努力学好{1}的。".format(name, course)
  • {0} 代表 第一个参数:name
  • {1} 代表 第二个参数:course

另外,我们还可以使用关键词参数来进行格式话。

"{course}对于{name}来说很有趣,{name}会努力学好{course}的。".format(name=name, course=course)

格式化数字

对于占位符{},也支持很多更精确的控制。

符号说明例子
0数字前方填充0而非默认的空格"{0:05d}".format(123)
>填充左边"{:0>5d}".format(123)
<填充右边"{:0<5d}".format(123)
,以逗号分隔"{:,d}".format(123)
%显示百分号"{:.2%}".format(12.3)
+显示正负号"{:+.2f}".format(12.3)
b以二进制显示 101"{:b}".format(256)
d以十进制显示 129"{:d}".format(256)
o以八进制显示 17"{:o}".format(256)
x以十六进制显示(小写) ff"{:x}".format(256)
#x以十六进制显示(小写) 0xff"{:#x}".format(256)
#X以十六进制显示(大写) 0XFF"{:#X}".format(256)

以不同进制显示

f-string 格式化

这是Python3推出的新的格式化方案,在使用上,比前两种格式化方案更为方便。

f-string的格式化的字符串中如果出现{name}这种格式的内容,会自动到上下文环境中查找name变量所对应的值,然后应用。如果{}括号内有需要计算的表达式,会先计算好。

name="包子"
price=1.5
count=2
f"购买{name}:{count}只,单价:¥{price},小计:¥{price*count}"

启动,查看运行结果。

和普通字符串一样,f-string也是支持多个字符的合并的。

如果要在f-string中使用大括号,可以使用{{}}双括号,这样就可以显示出内层括号了。如果要显示双括号,那就得使用四层括号{{{{}}}}。这样依次类推,要显示n层括号就得使用2n层括号。这种方式显示的括号内部的元素是不会被计算的。

如果你真要显示这么多括号,那不如是用其他显示方法。

f-string也支持更为精确的格式化控制,我们在格式化数字这一小节学到的控制方法,在f-string格式化中依然有效。