我们在上一章中讲解了文字,数字的基本概念,因为文字的处理在Python中式非常重要的,所以我们在详细的了解一下 Python 中如何处理字符串。
目录
4-1 写一个字符串文字
4-2 使用转义序列
4-3 使用三重引号编写多行字符串
4-4 使用原始字符串
4-5 字符串连接和重复
4-6 将数字转换为字符串并与字符串连接
4-7 获取字符串的长度(字符数)
4-8 获取字符串中指定索引处的字符(元素)
4-9 使用切片获取字符串的一系列子字符串
4-10 使用格式化运算符 % 的字符串格式化(printf 样式格式化)
4-11 使用 format 方法格式化字符串
4-12 使用格式化字符串文字 (f strings) 的字符串格式化
这节课的内容主要式说明如何使用 Python, 在程序中编写字符串文字。字符串文字是由多个字符组成的常量。
写字符串
在 Python 程序中编写字符串时,用双引号(”)或单引号(’)将一组字符括起来。
"字符串"
'字符串'
组成字符串的字符可以是字母、数字、空格和汉语等双字节字符。
"Hello, Python"
"myname"
"你好"
"2019"
双引号和单引号没有区别。
例如,如果您只写 myname 而不是 “myname”,而没有用双引号或单引号括起来,它就会变成一个名为 myname 的变量。另外,如果您写的是 2019 而不是“2019”,它将是一个数字。
字符串可以存储在变量中或通过将它们作为参数传递给打印函数来打印到屏幕上。看看下面的示例。
print("Hello")
>> Hello
print('你好')
>> 你好
print("2019")
>> 2019
print 函数将参数中指定的字符串文字输出到屏幕。
在字符串中使用双引号和单引号的区别
字符串是通过用双引号或单引号,括起一组字符来定义的。是必需的。
例如,当编写像 Tom’s toy 这样包含单引号的字符串文字时,请尝试通过将其括在单引号中来定义它。
'Tom's toy'
本例中第一个单引号和第二个单引号括起来的[‘Tom’]被判断为字符串字面量,后面的[s toy’]部分语法不正确,会出现错。
print('Tom's toy')
>> File "<stdin>", line 1
>> print('Tom's toy')
>> ^
>> SyntaxError: invalid syntax
如果要在这样的字符串中使用单引号作为字符,请用双引号将字符串括起来
"Tom's toy"
在这种情况下,第一个双引号和第二个双引号括起来的部分被识别为字符串文字,因此即使包含单引号也没有问题。相反,如果要将双引号用作字符串文字中的字符,请将字符串括在单引号中。
'他对她说"请相信我"'
还有一种使用转义序列的方法。转义序列在“使用转义序列”会进行解释。
示例代码
请看下面的示例。
print("Tom's toy")
>> Tom's toy
print('他对她说"请相信我。"')
>> 他对她说"请相信我。"
您可以使用双引号和单引号作为字符串中的字符。
如果要在字符串中写入特殊字符,例如换行符和制表符,请使用转义序列。下面介绍如何在 Python 字符串中使用转义序列。
什么是转义序列
例如,如果要定义跨多行的字符串,则必须在字符串中输入换行符。转义序列用于表示此类特殊字符。
[ \ ]和一个字母的组合代表一个转义序列(Windows环境下使用反斜杠)。Python 提供的转义序列是:
转义序列 | 意思 |
\newline | 在字符串中间插入一个换行符 |
\\ | 反斜杠 (\) |
\’ | 单引号 (‘) |
\” | 双引号 (”) |
\a | ASCII 终端铃 (BEL) |
\b | ASCII 退格键 (BS) |
\f | ASCII 换页 (FF) |
\n | ASCII 换行 (LF) |
\r | ASCII 回车 (CR) |
\t | ASCII 水平制表符 (TAB) |
\v | ASCII 垂直制表符 (VT) |
\ooo | 八进制 ooo 的 ASCII 字符 |
\xhh | 带十六进制的 ASCII 字符 hh |
\N{name} | Unicode 数据库中名称为 name 的字符 |
\uxxxx | 具有 16 位十六进制值 xxxx 的 Unicode 字符 |
\Uxxxxxxxx | 具有 32 位十六进制值 xxxxxxxx 的 Unicode 字符 |
其中,[ \n ]代表换行符,[ \” \代表双引号,[ \’ ]代表单引号。
在字符串中使用转义序列
现在让我们实际在字符串中使用转义序列。在字符串中使用转义序列时,只需将其写在您想要的位置即可。例如,让我们像这样定义一个字符串文字:
"你好。\n认识您很高兴。\n非常幸运能够遇见你。"
该字符串包含两个换行的 \n 转义序列。例如,如果此字符串被指定为 print 函数的参数,则转义序列的部分将被替换为换行符并输出。
示例代码
请看下面的示例。
"你好。\n认识您很高兴。\n非常幸运能够遇见你。"
>> 你好。\
>> 认识您很高兴。
>> 非常幸运能够遇见你。
写在字符串中的\n被替换为换行符并输出到屏幕。结果,字符串作为多行字符串输出到屏幕,在 \n 出现的位置有一个换行符。
接下来,让我们尝试使用双引号(”)和单引号(’)作为字符串中的字符。在“在字符串中使用双引号和单引号”中解释可以这样写,但是您可以使用转义序列来编写它如下:
'Yuhua\'s boyfrient'
通过使用转义序列,单引号也可以写成用单引号括起来的字符串中的字符。
示例代码
请看下面的示例。
print('Yuhua\'s boyfrient')
>> Yuhua's boyfrient
写在字符串中的 [ \’ ]被替换为 ‘ 作为字符并输出到屏幕。
输入一个长字符串,中间换行
Python 使用换行符作为句子分隔符,因此在定义长字符串时不能输入换行符。例如,您不能像这样在字符串中间换行:
"I will go to the Qingdao my hometown with
my children tomorrow"
如果要在中间打断一个长字符串,在换行前写\。如果 \ 后跟一个换行符,则将其视为字符串尚未结束并连接到下一行写入的部分。例如:
"I will go to the Qingdao my hometown with \
my children tomorrow"
这与像这样在一行中写入字符串是一样的:
"I will go to the Qingdao my hometown with my children tomorrow"
示例代码
请看下面的示例。
print("I will go to the Qingdao my hometown \
my children tomorrow")
>> I will go to the Qingdao my hometown with my children tomorrow
这样就能够输出中间有换行符的字符串。
我们将解释如何使用三重引号(triple quotation marks)作为输入跨越多行的字符串的方法。
使用三重引号定义字符串
在 Python 中,有两种方法可以定义跨多行的字符串,除了在字符串中编写表示换行符的转义序列外,还可以使用三重引号。
三引号是用三个连续的双引号或单引号将字符串括起来的方法。例如,如果使用双引号,则编写如下。
"""您好,
认识你真的很高兴,
我感到很幸福。"""
从第一个“””到第二个“””是一个字符串。如果以这种方式定义字符串,则字符串中的换行符将被视为文字换行符。
这与编写相同:
"您好,\n认识你真的很高兴,\n我感到很幸福。"
使用三引号定义字符串时,双引号和单引号可以写在字符串内部而不需要转义。当然您可以通过转义来编写,没有问题。
"""您好,
认识你真的很高兴,你是我"一生的幸福"。
请相信我会给你带来幸福。"""
注意,当使用三重引号时,字符串被视为紧跟在第一个“”之后的字符串,所以如果你在第一个“””之后换行,开头就会有一个换行符。
"""
您好,
认识你真的很高兴,你是我一生的幸福。
请相信我会给你带来幸福。"""
如果想在写入前在第一个“””之后放一个换行符,但又不想让换行符包含在字符串的开头,那么就在“”之后紧接着写一个\。
"""\
您好,
认识你真的很高兴,你是我"一生的幸福"。
请相信我会给你带来幸福。"""
示例代码
请看下面的示例。
msg = """\
您好,
认识你真的很高兴,你是我一生的幸福。
请相信我会给你带来幸福。"""
print(msg)
>> 您好,
>> 认识你真的很高兴,你是我"一生的幸福"。
>> 请相信我会给你带来幸福
通过以上内容的学习,相信您可以使用三重引号来定义跨越多行的字符串。
原始字符串将反斜杠(Windows 上的反斜杠)视为字符,而不是转义字符。本节介绍如何使用原始字符串。
使用原始字符串
反斜杠(\)(Windows环境下的反斜杠)用于描述普通字符串中的特殊值。因此,当将 \ 作为单个字符使用时,\ 本身必须使用转义序列写为 \\。
对于 Python 转义序列,请参阅 “使用转义序列”。
使用原始字符串将 \ 视为单个字符。因此,你不需要这样写[ \\ ]。要使用原始字符串,请在字符串前写上 r 或 R。
r"字符串"
R"字符串"
[ \ ]在原始字符串中没有特殊含义。所以即使写成\n,也不代表转义序列换行,只是代表“\”和“n”两个字符。原始字符串很方便,因为它们不需要每次在使用大量 \ 作为字符的字符串中使用时进行转义。
示例代码
请看下面的示例。
print("下载到: c:\\code\\python\\bin")
>> 下载到: c:\code\python\bin
print(r"下载到: c:\code\python\bin")
>> 下载到: c:\code\python\bin
所以原始字符串可以按原样编写而无需转义反斜杠。
使用原始字符串的注意事项
即使是原始字符串,将字符串用双引号括起来并将双引号作为字符串中的字符写入时,也需要使用 \”。通过括起来写入字符串时,以相同的方式使用 \’单引号在字符串中被写为字符。
需要注意的是,如果输出字符串,双引号或单引号前写的\将原样输出。
print(R"我的名字是\"ABC\"。")
>> 我的名字是\"ABC\"。
如果不想显示 \ 进行转义,则将包含双引号的字符串用单引号括起来。
print(R'我的名字是"ABC"。')
>> 我的名字是"ABC"。
如果将字符串用单引号引起来,则可以将双引号按原样写入字符串中。
另外需要注意的是,\” 和 \’ 在原始字符串中有特殊含义,所以在原始字符串的最后写一个 \ 符号会导致错误。
print(R"年龄是46\")
>> File "", line 1
>> print(R"年龄是46\")
>> ^
>> SyntaxError: EOL while scanning string literal
这是因为字符串末尾的 \” 部分被当成了 ” 的转义,所以判断该字符串没有闭合。
如果它是原始字符串并且您想在字符串末尾写 \,则只写 \ 作为普通字符串并连接。。
print(R"年年龄是46" + "\\")
>> 年龄是46\
我将解释如何连接多个字符串以及如何重复相同的字符串作为对字符串的操作。要通过连接列表等可迭代对象中包含的字符串来获得新字符串。
连接字符串
如何连接多个字符串并将它们作为一个字符串。使用 + 运算符。
"字符串1" + "字符串2"
串联的字符串变成单个字符串,中间没有任何分隔符。
"ABC" + "DEFG"
--> ABCDEFG
可以连接两个或多个字符串。在这种情况下,请使用 + 运算符进行连接。
"ABC" + "DEF" + "GHI" + "JKL"
--> ABCDEFGHIJKL
请注意,只能使用 + 运算符连接字符串。如果要连接数字,则需要先将它们转换为字符串。
示例代码
请看下面的示例。
print("ABC" + "DEF" + "GHI"+ "DPD")
>> ABCDEFGHIDPD
str1 = "Hello,"
str2 = "Python"
print(str1 + str2)
>> Hello,Python
我使用 + 运算符连接两个字符串,然后将它们打印到屏幕上。
重复一个字符串
如何将字符串重复指定次数并将其作为新字符串。请使用 * 运算符。。
"字符串" * 次数
一个字符串,其中相同的字符串在没有中间分隔符的情况下重复指定的次数。
"AB" * 4
--> ABABABAB
示例代码
请看下面的示例。
print("AB" * 4)
>> ABABABAB
str = "Hello!"
n = 3
print(str * 4)
>> Hello!Hello!Hello!Hello!
我能够得到一个重复字符串指定次数的新字符串。
如果要将数字连接到字符串,必须先将数字转换为字符串。在这里,我们将解释如何使用内置的 str 函数将数值转换为字符串,然后将其与字符串连接。
连接字符串和数字
Python 允许您使用 + 运算符将多个字符串连接成一个字符串,但您不能将数字连接到字符串。例如,在交互模式下,尝试按如下方式连接字符串和数字。
>>> "My age is " + 18
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
>>>
我得到这样的 TypeError。
要将数字连接到字符串,必须先将数字转换为字符串。使用内置的 str 函数将数字转换为字符串。
有关字符串连接的详细信息,请参阅 “字符串连接和重复(乘法) ”。
str函数的使用方法请参考 《使用str函数(转字符串) 》。
具体写如下。
num = 18
print("My age is " + str(num))
通过像这样将数字转换为字符串,您可以连接字符串和数字。
示例代码
请看下面的示例。
num1 = 8
num2 = 6
print(str(num1) + "+" + str(num2) + "=" + str(num1 + num2))
>> 8+6=14
这样我们就能够将一个字符串和一个数字连接成一个字符串。
我将解释如何使用内置的 len 函数获取字符串的长度(字符数)。
获取字符串的长度
内置的 len 函数可以获取作为参数指定的对象的长度和元素个数。如果您指定一个字符串作为参数,您可以获得该字符串中的字符数。格式如下。
len(字符串)
获取参数中指定的字符串中的字符数。因为是字符数,而不是字节数,所以不仅是半角字符,对于中文等字符串也可以得到字符数。
len("Hello")
--> 5
len("青岛市")
--> 3
示例代码
请看下面的示例
print("Hello 的文字数是 " + str(len("Hello")))
>> Hello 的文字数是 5
print("青岛市的文字数是 " + str(len("青岛市")))
>> 青岛市的文字数是3
这样我们就能够得到字符串的长度(字符数)。
字符串是有序的字符序列。这些字符中的每一个都是一个元素。在这里,我们将说明如何通过指定元素位置的索引来提取字符串中的元素。
获取指定索引处的元素
一个字符串由多个字符组成,每个字符称为一个元素。元素从0、1、2、……开始依次编号,这个编号称为索引。您可以通过指定其索引来指定字符串中的元素。
要获取字符串中指定索引处的元素,请使用以下格式:
文字列[index]
获取具有参数中指定索引的元素。请注意,索引从 0 开始。索引也可以指定为负值。在这种情况下,最后一个元素的索引是 -1 和 -1、-2、-3,… 向前移动。
H E L L O
---------------
0 1 2 3 4
-5 -4 -3 -2 -1
对于字符串 HELLO,索引 0 和索引 -5 处的元素相同。
具体写如下。
str1 = "Hello"
print(str1[1]) # e
print(str1[-1]) # o
str2 = "青岛市"
print(str2[2]) # 市
示例代码
请看下面的示例。
str1 = "Hello"
print(str1[0])
>> H
print(str1[1])
>> e
print(str1[2])
>> l
print(str1[3])
>> l
print(str1[4])
>> 0
str2 = "青岛市"
print(str2[-3])
>> 青
print(str2[-2])
>> 岛
print(str2[-1])
>> 市
我能够在指定的索引位置获取字符。
可以对字符串进行切片,得到一个从起始索引到结束索引的子字符串。在这里,我们将解释如何使用slice函数从字符串中获取指定范围的子字符串。
切片機能的使用方法
可以通过在字符串中指定索引来获取指定位置的字符,但是可以通过切片函数获取从起始位置到结束位置的指定范围内的子字符串。格式如下。
字符串 [开始索引:结束索引]
指定范围的方法,指定范围内第一个字符的索引为起始索引,指定范围最后一个字符的索引加1为结束索引。请参见下面的示例。
S T U D E N T E R
-----------------
0 1 2 3 4 5 6 7 8
要从字符串 FLOWER 中获取子字符串 TUD,请指定起始索引为 1,结束索引为 4。我认为如果您通过如下稍微移动索引的位置来考虑它,这将更容易理解。。
S T U D E N T E R
------------------
01 2 3 4 5 6 7 8 9
要获得子字符串 TUD,您可以在 T之前指定 1,在 D 之后指定 4。
示例代码
请看下面的示例。
str = "Student"
print(str[1:4])
>> tud
print(str[2:6])
>> uden
这样我们就能够从字符串中获取指定范围内的字符串。
省略开始或结束索引
使用 slice 函数获取子字符串时,可以省略开始或结束索引。
如果省略起始索引,则假定为 0。0是字符串中第一个字符的索引,所以省略起始索引意味着从字符的开头获取子字符串。
print("Student"[:3])
--> "Stu"
如果省略结束索引,则假定 len (string) 的值。如果将字符串指定为 len 函数的参数,它会返回字符串中的字符数,因此如果省略结束索引,则会得到字符串的结尾。
print("Student"[4:])
--> "ent"
如果您同时省略起始索引和结束索引,您将得到与原始字符串相同的字符串,因为它是从字符串的开头到字符串的结尾。
print("Student"[:])
--> "Student"
※有关在 len 函数中将字符串指定为参数的详细信息,请参阅 “获取字符串的长度(字符数) ”。
示例代码
请看下面的示例。
str = "Student"
print(str[:3])
>> Stu
print(str[3:])
>> dent
print(str[:])
>> Student
这样我们就可以,在使用切片时通过省略开始或结束索引得到了一个子字符串。
指定获取子串时的步数
当使用 slice 函数获取子字符串时,我获取了从起始索引到结束索引的所有字符。如果您希望它从第一个字符开始并获取您指定的每个字符,您可以指定步数。格式如下。
string [开始索引:结束索引:步数]
例如,如果将字符串“山东省青岛市市南区”的起始索引设置为 1,将结束索引设置为 8,则可以得到以下子字符串。
"山东省青岛市市南区"[1:8]
--> 山东省青岛市市南
如果您想获取范围内的每个第二个字符而不是每个字符,您可以执行以下操作:
"山东省青岛市市南区"[1:8:2]
--> 东青市南
如果省略步数,则假定为 1(获取范围内的所有字符)。
示例代码
请看下面的示例。
str = "山东省青岛市市南区"
print(str[1:8])
>> 山东省青岛市市南
print(str[1:8:2])
>> 东青市南
print(str[1:12:3])
>> 省市区
使用步数,我能够指定从指定的字符串范围中获取多少个字符。
您可以使用 % 格式化运算符格式化数字和字符串以创建新字符串。(它将以其他编程语言中使用的 printf 样式进行格式化)。本节介绍如何使用 % 格式化运算符格式化字符串。
※ 使用格式化操作符%的方法在以前被常用,但是目前主流的是使用字符串类型的 format的方法,以及使用格用式之后的字符串。有关详细信息,请参阅 “使用格式方法格式化字符串”和“使用格式化字符串文字 (f strings) 格式化字符串”。
使用格式化运算符 % 进行格式化
首先,让我们看看我们可以用格式化做什么。
首先,一个数字格式化的例子。
num1 = 30
result = "10十进制是 %d ,16进制是 %x。" % (num1, num1)
print(result)
>> 10十进制是 30 ,16进制是 1e。
本示例将包含数字的变量分别转换为十进制和十六进制,并通过将转换后的值插入到基字符串的指定位置来创建一个新字符串。
下面是一个字符串格式的例子。
def mypoint(str1, num1):
result = "My name is %-10s, point is %5d." % (str1, num1)
print(result)
mypoint("Yuhua", 65)
>> My name is Yuhua , point is 65.
mypoint("Jiangming",999)
>> My name is Jiangming , point is 999.
在这个例子中,我们分别指定字符串和数字的位数,并创建一个新的字符串,字符串左对齐,数字右对齐。
在这两个例子中,为了清楚起见,创建了一个新的字符串,然后用print函数打印出来,但是格式化字符串往往只在用print函数输出的时候用到,一般写在print函数中。
num1 = 30
print("10十进制是 %d 、16进制是 %x 。" % (num1, num1))
>> 10十进制是 30 、16进制是 1e 。
如何编写转换说明符和要转换的值
要创建具有格式的新字符串,格式为:
包含转换说明符的字符串 % 値
包含转换说明符的字符串 % (値1, 値2, ...)
首先,对于包含转换说明符的字符串。例如,考虑以下字符串。
“我叫xx,今年yy岁。”
如果我想在这个字符串的名字部分(xx)和年龄部分(yy)中创建一个带有格式化值的新字符串,我们该如何格式化这个xx和yy部分中的值呢?这次,我们分别指定了 %-8s 和 %03d来代替(xx)(yy)。
"名字是%-8s。年龄是%03d。"
然后指定要格式化的值。由于我们这次在字符串中写了两个转换说明符,所以我们还需要写两个要转换的值。在字符串后写入 % 后,将值指定为元组对象,如 (value1, value2)。值按照转换说明符的写入顺序作为元素添加到元组中。
"名字是%-8s。年龄是%03d。" % ("Yuhua", 26)
请注意,如果有一个转换说明符,那么也会有一个值。在这种情况下,您只能写入值,而不能写入元组。
"名字是%-8s。" % "Yuhua"
现在,第一个值“Yuhua”由转换说明符 %-8s 转换并插入到字符串中,下一个值 26 被插入到由转换说明符 %03d 转换的字符串中。
请看下面的示例。
name = "Yuhua"
old = 26
print("名字是%-8s。年龄是%03d" % (name, old))
>> 名字是Yuhua 。年龄是026歳です。
では変換指定子の指定方法について詳しくみていきます。
変換指定子の指定方法
让我们仔细看看如何指定转换说明符。
% (map key) 转换标志 最小字段 精度 精度长度转换器 转换类型
转换说明符以 % 开头并指定 (1) map key、(2) 转换标志、(3) 最小字段宽度、(4) 精度、(5) 精度长度转换器(6) 转换类型。这里面唯一必填项是(6)转换类型,(1)到(5)是可选的。
変換型
让我们从转换类型开始,这是一个必填项。转换类型具有以下值。
"d" 有符号十进制整数
"i" 有符号十进制整数
"o" 有符号八进制数
"u" 旧类型 -- 与 'd' 相同
"x" 有符号十六进制数(小写)
"X" 有符号十六进制数(大写)
"e " 指数表示法的浮点数(小写)
"E" 指数表示法的浮点数(大写)
"f" 十进制浮点数
"F" 十进制浮点数
"g" 浮点数。如果指数大于或等于 -4 或小于或等于精度,则使用小写科学记数法,否则使用十进制记数法
“G”浮点数。 如果指数
"c" 单个字符(接受整数或单个字符串)大于或等于 -4 或小于精度,则使用大写指数表示法,否则使用十进制表示法 object with str()) "a" String (Convert Python object with ascii()) "%"
例如,写 %d 将数值转换为十进制,写 %x 将其转换为十六进制。
print("10进制=%d, 16进制=%x" % (20, 20))
>> 10进制=20, 16进制=14
还有,写%e是把一个包含小数点的数值转换成指数表示法,写%f是把它转换成十进制浮点数(实际上以为是定点数)。
print("指数计数法=%e, 固定小数点计数法=%f" % (0.0752, 0.0752))
>> 指数计数法=7.520000e-02, 固定小数点计数法=0.075200
map key
接下来是map key。map key是一个可选选项,在使用map key类型对象指定值时使用。通过用括号()将map key括起来,来指定map key。
考虑以下示例。两个转换说明符分别指定map key (decum) 和 (hexnum)。然后,在指定值时,使用字典而不是元组,将转换说明符中指定的map key指定为字典的每个元素的键,并将要传递给转换说明符的值指定为值。
print("10进制=%(decnum)d, 16进制=%(hexnum)x" % {"hexnum":20, "decnum":20})
>> 10进制=20, 16进制=14
字典的元素没有顺序的概念,因此元素可以按任何顺序书写。
转换标志
接下来是转换标志。转换标志也是一个可选选项,具有以下值:
"#" 值转换使用“替代格式”
“0” 数字类型用零填充
“-” 左对齐转换值
“” 正数在带符号的转换中,前面留一个空格。
在“+”转换前加上一个符号字符(“+”或“-”), 否则为空
如果将“#”指定为转换标志,则将“o”指定为转换类型会在第一个数字前插入一个八进制前缀 (‘0o’)。“x”在第一个数字前插入一个十六进制前缀’0x’,“X”在第一个数字前插入一个十六进制前缀’0X’。增加。
print("number1=%x, number2=%#x" % (30, 30))
>> number1=1e, number2=0x1e
将转换标志指定为“0”时,如果数值的位数小于后述的最小字段宽度,则用 0 填充。如果未指定此转换标志,它将用空格填充。
print("number1=%5d, number2=%05d" % (30, 30))
>> number1= 30, number2=00030
转换标志指定为“-”时,如果数值的位数小于后述的最小字段宽度,则左对齐显示。如果未指定此转换标志,则显示为右对齐。(我在下面放了括号 [] 以表明它是左对齐的)。
print("number1=[%5d], number2=[%-5d]" % (30, 30))
>> number1=[ 30], number2=[30 ]
如果转换标志指定为“ ”,则仅对正数在数值前空出一个字符的空格。
print("number1=%d, number2=%d, number3=% d, number4=% d" % (30, -30, 30, -30))
>> number1=30, number2=-30, number3= 30, number4=-30
如果为转换标志指定了“+”,则在数字的开头添加“+”或“-”。
print("number1=%+d, number2=%+d" % (30, -30))
>> number1=+30, number2=-30
最小字段宽度
接下来是最小字段宽度。最小字段宽度也是一个可选选项,用于指定要保留的最小位数。例如,如果一个数字或字符串有 3 个数字并且最小字段宽度为 5,它将显示 3 个数字而不是 5 个数字。默认右对齐显示,并显示空格,但通过指定转换标志,可以左对齐或用0填充。此外,如果位数大于最小字段宽度,它将按原样显示。
print("number1=%d, number2=%4d, number3=%4d" % (30, 30, 72536))
>> number1=30, number2= 30, number3=72536
如果为最小字段宽度指定“*”,则可以将最小字段宽度指定为一个值。在这种情况下,首先指定最小字段宽度,然后是实际值。考虑以下示例。
print("number1=%d, number2=%*d" % (18, 5, 42))
>> number1=18, number2= 42
有两个转换说明符,但是指定了三个值。第一个值是要使用第一个转换说明符转换的值。第二个值是第二个转换说明符的最小字段宽度。第三个值是要使用第二个转换说明符转换的值。请注意,首先写入最小字段宽度。
精密/精密长度变压器
最后是准确性。Precision 也是一个可选选项,用于指定小数部分的精度(位数)。默认为 6 位数字。指定时,指定点(.)后的位数。
print("number1=%f, number2=%.3f" % (1/3, 1/3))
>> number1=0.333333, number2=0.333
如果为精度指定“*”,则可以用值指定精度。在这种情况下,首先指定精度,然后指定实际值。考虑以下示例。
print("number1=%f, number2=%.*f" % (1/3, 3, 1/3))
>> number1=0.333333, number2=0.333
有两个转换说明符,但是指定了三个值。第一个值是要使用第一个转换说明符转换的值。第二个值是第二个转换说明符的精度。第三个值是要使用第二个转换说明符转换的值。注意先写精度。
Python 当前不使用精确长度转换器。
从 Python 2.6 开始,字符串类型有一个格式化方法,它允许比使用 % 格式化运算符更高级的格式化。在这里,我将解释如何使用字符串类型的格式化方法来格式化字符串。
※ 格式化字符串字面量,从Python 3.6开始就可以使用,格式规范方法相同,可以写得更简洁。
format的使用方法
使用string类型的format方法进行格式化时,格式如下。
包含要替换的字符串的文字.format(値1, 値2, ...)
使用“上一节”中解释的 % 格式化运算符格式化字符串时,描述 如下。
包含要替换的字符串的文字 % (値1, 値2, ...)
替换字段而不是转换说明符,并且值被指定为format 的参数而不是tuple值
在查看详细用法之前,我们先简单了解一下如何使用。首先,对于包含替换字段的字符串。例如,考虑以下字符串。
"我的名字是xx。今年是yy岁。"
如果我想在这个字符串的名字部分(xx)和年龄部分(yy)中创建一个带有格式化值的新字符串,我该如何格式化这个xx和yy部分中的值指定一个替换字段,表示无论 这次,我分别指定了 {:<8s} 和 {:>3d} 如下。
"我的名字是{:<8s}。今年是{:>3d}岁。"
然后指定要format的值。由于我们这次在字符串中写了两个替换字段,所以我们也需要写两个值来进行转换。将值指定为format的参数。应按照替换字段的写入顺序给出参数。
"我的名字是{:<8s}。今年是{:>3d}岁。".format("Yuhua", 26)
现在,第一个值“Yuhua””被插入到由替换字段 {:<8s} 转换的字符串中,下一个值 26被插入到被替换字段 {:>3d} 转换的字符串中 请参阅下面的实际转换方式。
name = "Yuhua"
old = 26
print("我的名字是{:<8s}。今年是{:>3d}岁".format(name, old))
>> 我的名字是Yuhua。今年是26岁。
现在让我们仔细看看如何指定哪些替换字段对应于的值。
指定哪个值对应于哪个替换字段
写在字符串中的替换字段由写在花括号 {} 内的格式字符串组成。我们稍后会详细介绍格式字符串,但在此之前,让我们先谈谈如何在format的参数中指定哪个替换字段对应于哪个值。
在替换字段中指定一个数字
如果字符串中有多个替换字段,指定一个数字或关键字来区分每个替换字段。使用数字时,按顺序指定数字:0、1、2、…。
"名字{0}。年龄{1}。住址{2}。"
数値は 0 , 1 , 2, … と 0 から順番に割り当てる必要がありますが、どの置換フィールドにどの数値を割り当てるのかは自由です。
"名字{2}。年龄{0}。住址{1}。"
然后,按照从替换字段0到format的参数的顺序指定值。如果你有 3 个替换字段,指定 3 个值作为format的参数。第一个参数是传递给替换字段 0 的值,下一个参数是传递给替换字段 1 的值,最后一个参数是传递给替换字段 2 的值。
"名字{0}。年龄{1}。住址{2}。".format("Yuhua", 18, "Qingdao")
"名字{2}。年龄{0}。住址{1}。".format(18, "Qingdao", "Yuhua")
从头开始将 0 、 1 、 2 … 分配给字符串中的替换字段时,您可以省略数字。所以以下是相同的:
"名字{0}。年龄{1}。住址{2}。".format("Yuhua", 18, "Qingdao")
"名字{}。年龄{}。住址{}。".format("Yuhua", 18, "Qingdao")
在替换字段中指定关键字
以下是指定关键字的方法。关键字就像替换字段的名称,您为每个替换字段编写它。
"姓名{myname}。年龄{myold}。"
我们将在format的参数中以关键字名称=值的格式指定它。您可以自由决定顺序。
"姓名{myname}。年龄{myold}。".format(myname="Yuhua", myold=26)
使用数字还是指定关键字都没有关系。如果没有特别的原因,我认为你可以简单地写一个省略数值的格式,并为format的参数指定值的顺序。
在替换字段中指定一个数字或关键字后,写一个冒号(:),然后写要转换的格式说明符。例如 {:8s} 如果数字被省略。{0:8s} 如果您指定一个数字。当由关键字指定时,它看起来像 {name:8s}。
print("姓名{myname}。年龄{myold}岁。".format(myname="Yuhua", myold=26))
>> 姓名Yuhua。 年龄26岁。
print("姓名{0:8s}。年龄{1:4d}岁。".format("Jiangming", 32))
>> 姓名Jiangming。 年龄32岁。
print("姓名{name:8s}。年龄{old:4d}岁。".format(name="Yuhua", old=24))
>> 姓名Yuhua。 年龄4岁。
让我们仔细看看格式说明符是如何编写的。
如何指定格式说明符
通过组合以下可选选项来描述格式说明符。
[[fill(填充字符)] align(放置方式)]
[sign(符号)]
[#(替代格式)]
[0(零填充)]
[width(最小字段宽度)]
[grouping_option(数字分隔符)]
[ .precision(分数精度)]
[类型(值表示)]
格式说明符写在替换字段 {positional number or keyword: format specifier} 中冒号 (:) 的右侧。让我们来看看每个选项。
type(值的表示类型)
让我们从最后一个值的表示开始。表示指定了值的表示方式,一种用于字符串,一种用于整数,一种用于浮点数。
字符串的表型:
"s" 字符串
None "s" 一样
例如,写 :s 来格式化一个字符串值。但是,省略字符串表达式与指定 :s 相同,因此即使省略它,结果也是相同的。
print("string={:s}, string={}".format("Purple", "Apple"))
>> string=Purple, string=Apple
整数表型:
“b”二进制
“c”字符。将数字转换为相应的 Unicode 字符
"d" 十进制
"o" 八进制
"x" 十六进制。a 到 f 是小写的
“X”十六进制数。A 到 F 是大写的
“n”数字。与“d”相同,但根据当前语言环境插入定界符
none 与“d”相同
例如,写 :d 将数值转换为十进制,写 😡 将其转换为十六进制。
print("number1={:d}, number2={:x}".format(20, 31))
>> number1=20, number2=1f
浮点数和十进制数的表型:
“e”指数符号。'e' 使用
“E”指数表示法。使用 'E'
"f" 定点数表示法
"F" 定点数表示法。nan转NAN,inf转INF
"g" 四舍五入到指定精度,根据位数"
G" 以定点或指数表示法显示 除了当数字变大时切换到"E" 与"g"相同" 对于
“n”语言环境,但插入了数字分隔符 “
%”数字乘以 100 并采用定点表示法 (“f”) 显示
None,如“g”,但小数点后至少有一位数字在定点表示法中
例如,写:e 将带小数点的数值转换为指数计数法,写:f 转换为定点数。
print("指数表記={:e}".format(0.0752))
>> 指数表記=7.520000e-02
print("固定小数点表記={:f}".format(0.0752))
>> 固定小数点表記=0.075200
要显示百分比,请写 :%。
print("显示为百分比={:%}".format(0.348))
>> 显示为百分比=34.800000%
width(最小字段宽度)
接下来是宽度(最小字段宽度)。至少指定要保留的位数。例如,如果一个数字或字符串有 3 个数字并且最小字段宽度为 5,它将显示 3 个数字而不是 5 个数字。字符串默认左对齐,数字默认右对齐。
以下示例设置字符串和数字的最小字段宽度。(为清楚起见,显示在 [] 中)。
print("string=[{:10s}]".format("Lemon"))
>> string=[Lemon ]
print("number=[{:5d}]".format(123))
>> number=[ 123]
字符串左对齐,数字右对齐。
fill(填充字符)和align(放置方式)
接下来是对齐(如何放置)和填充(填充字符)。对齐方式指定当位数小于最小字段宽度时值如何对齐。
"<"左对齐
">"右对齐
"^"居中对齐
"="填充符号和值之间的空格
以下示例分别显示了左对齐、居中对齐和右对齐的数字。(为清楚起见,显示在 [] 中)。
print("number=[{:<7d}]".format(123))
>> number=[123 ]
print("number=[{:^7d}]".format(123))
>> number=[ 123 ]
print("number=[{:>7d}]".format(123))
>> number=[ 123]
如果不设置最小字段宽度,值中的位数将与显示的位数相同,因此设置对齐方式没有意义。
默认情况下,它是用空格填充的,但是你可以通过在放置方法之前指定要填充的字符来用指定的字符填充它。例如,要向左对齐并用 0 填充空白部分,请指定 :0<。
以下示例使用 * 和 – 来填充空白
print("number={:*<7d}".format(123))
>> number=123****
print("number={:-^7d}".format(123))
>> number=--123--
sign(符号)
接下来是标志。此设置仅对数值有效,并指定如何分配符号。
"+" 为正数和负数添加符号
"-" 仅为负数添加符号(默认)
" " 为正数在数字前添加空格
在以下示例中,当为数值设置每个选项时显示。
print("正数={:+d}, 负数={:+d}".format(72, -72))
>> 正数=+72, 负数=-72
print("正数={:-d}, 负数={:-d}".format(72, -72))
>> 正数=72, 负数=-72
print("正数={: d}, 负数={: d}".format(72, -72))
>> 正数=72, 负数=-72
负数是相同的,除了带有“+”的正数也有符号,而带有“”的数字前面是正数的空格。将是
grouping_option(数字分隔符)
接下来是 grouping_option(数字分隔符)。指定逗号“,”或下划线“_”。在数值的每千位插入一个逗号 (,) 或下划线 (_)。
print("Number={:,d}".format(1234567))
>> Number=1,234,567
print("Number={:,f}".format(12345.6789))
>> Number=12,345.678900
print("Number={:_d}".format(1234567))
>> Number=1_234_567
我能够自动插入数字分隔符。
.precision(小数精度)
接下来是 .precision(十进制精度)。指定小数部分的精度(位数)。默认为 6 位数字。指定时,指定点(.)后的位数。
print("number={:f}".format(1.2345))
>> number=1.234500
print("number={:.1f}".format(1.2345))
>> number=1.2
print("number={:.3f}".format(1.2345))
>> number=1.234
当省略小数部分的精度和指定小数部分的精度时,我都尝试过。
(替代格式)
然后#(替代形式)。如果描述替代格式选项,例如,在将二进制、八进制和十六进制值显示为整数时,将“0b”、“0o”和“0x”添加到开头。
print("Number={:b}, Number={:#b}".format(10, 10))
>> Number=1010, Number=0b1010
print("Number={:o}, Number={:#o}".format(20, 20))
>> Number=24, Number=0o24
print("Number={:x}, Number={:#x}".format(35, 35))
>> Number=23, Number=0x23
当附加不同的格式选项时,每个都以不同的格式显示。
格式化字符串文字(f strings)自 Python 3.6 开始可用,作为格式化字符串时比 format 方法更简洁的方法。format设置方法和format方法一样,但是直接把值写在replacement字段中,可以写得更简洁明了。本节介绍如何使用格式化字符串文字(f 字符串)来格式化字符串。
如何编写格式化后的字符串文字
使用字符串类型的format进行格式化时,格式如下。
“WWWW {索引:格式说明符} WWWW”.format(值)
描述格式设置方法的替换字段(上面的 {index: format specifier} 部分)在字符串中描述,要转换的值在格式方法的参数中指定。并且为了匹配替换字段和值,用索引或关键字指定替换字段。
对于称为 f-string 的格式化字符串,格式说明符的编写方式与格式方法相同,但要转换的值可以直接写入替换字段。
f"xxxx {值:格式说明符} xxxx"
格式化字符串是一个以“f”或“F”开头的字符串,并且字符串中包含一个用 { 和 } 括起来的替换字段。与format不同,您可以直接在替换字段中写入要格式化的值或表达式。
具体的format如下所述。
name = "Yuhua"
old = 26
print("姓名{:<8s}。年龄{:>3d}。".format(name, old))
>> 姓名Yuhua。年龄26。
使用格式化后的字符串,您可以编写:
name = "Yuhua"
old = 26
print(f"姓名{name:<8s}。年龄{old:>3d}。")
>> 姓名Yuhua。年龄26。
它比使用 format 方法更简洁,也更容易看出哪些值使用了哪些格式
如果要将 { 或 } 作为格式化字符串中的字符写入,请写入 {{ 或 }}。
name = "Yuhua"
print(f"姓名{{ {name:<8s} }}。")
>> 名前は{ Yuhua }です。
如何指定格式说明符
格式说明符的编写方法与使用格式方法时相同。有关详细信息,请参阅“使用格式化方法格式化字符串”。下面是一个带有一些格式的例子。
指数符号、定点符号、百分比符号:
num = 0.0752
print(f"指数表記={num:e}")
>> 指数表記=7.520000e-02
print(f"固定小数点表記={num:f}")
>> 固定小数点表記=0.075200
print(f"显示为百分比={num:%}")
>> 显示为百分比=7.520000%
指定最小字段宽度和对齐方式:
str1 = "Lemon"
print(f"string=[{str1:<10s}]")
>> string=[Lemon ]
print(f"string=[{str1:^10s}]")
>> string=[ Lemon ]
print(f"string=[{str1:>10s}]")
>> string=[ Lemon]
数字分隔符:
num = 1234567
print(f"number={num:,d}")
>> number=1,234,567
我们可以在可用的格式说明符中尝试几个选项。