格式化字符串
Python 中的字符串(Strings)是用单引号或双引号标记的一系列连续字符(characters),换句话说,字符串是由单个字符组成的序列(list)。即便只有一个字符,也是字符串,Python 中没有字符数据类型。单引号括起的字符串和双引号括起的字符串是一样的,它们不存在任何区别。
还可以使用三引号'''定义字符串,这种方式可以定义多行文字。
创建字符串
创建字符串的最简单方法是将文本放入单引号(')或双引号(")中。Python不区分单引号和双引号,你可以根据自己的喜好选择使用。
# 使用单引号
greeting = 'Hello, World!'
# 使用双引号
greeting = "Hello, World!"在这两个例子中,greeting 是一个字符串变量,它包含了文本 “Hello, World!”。
多行字符串
如果你想创建包含多行的字符串,可以使用三个单引号(''')或三个双引号(""")。
# 使用三个单引号
long_string = '''
Hello,
World!
This is a multi-line string.
'''
# 使用三个双引号
long_string = """
Hello,
World!
This is a multi-line string.
"""在这里,long_string 包含了一个跨越多行的字符串。
字符串的不可变性
在 Python 中,每一个对象都可以分为不可变性或者可变性。在核心类型中,数字、字符串和元组是不可变的。
字符串在 Python 中一旦创建就不能就地改变,例如不能对其某一位置进行赋值而改变字符串。下面的语句就会出现如下语法错误:“TypeError: 'str' object does not support item assignment”。
s = 'string'
print(len(s))
print(s[0]) # 输出序列的第一个元素
s[0] = 'another s' # 试图修改字符串的内容
print(s)关于不可变性,我们再看一个例子:
>>> str1 = "welcome"
>>> str2 = "welcome"上述代码中,str1 和 str2 都指向存储在内存中某个地方的字符串对象"welcome"。我们可以通过id() 函数来测试 str1 和 str2 是否真的指向同一个对象。
id() 函数可以得到对象在内存中的存储地址。
如下:
>>> str1 = 'welcome'
>>> str2 = 'welcome'
>>> id(str1)
35462112
>>> id(str2)
35462112我们可以看到,str1 和 str2 都指向同一个内存地址,因此,他们都指向同样的对象“welcome”。下面让我们再编辑 str1 的内容看看:
>>> str1 += " yangjh"
>>> str1
'welcome yangjh'
>>> id(str1)
35487600我们可以看到,现在变量 str1 指向了一个完全不同的内容地址,这也说明,我们对 str1 的内容操作实际上是新建了一个新的字符串对象。
字符串切片
我们还可以通过“[]”操作符来获取原始字符串的子集,这就是所谓的切片。语法规则如下:
s[start:end]切分操作将返回字符串的部分内容,起始于 index,结束于 end-1。例如:
>>> s = 'yangjh'
>>> s[1:3]
'an'
>>> s = "Welcome"
>>> s[ : 6]
'Welcom'
>>> s[4 : ]
'ome'
>>> s[1 : -1]
'elcom'注意:开始索引和结束索引都是可选的,如果忽略,开始索引就是 0,而结束索引就是字符串的最后一个字符对应的索引值。
字符串对象常用方法
下表是常用的字符串方法:
| 方法名称 | 功能描述 |
|---|---|
len() |
返回字符串长度 |
max() |
返回字符串中 ASCII 编码值最大的字符 |
min() |
返回字符串中 ASCII 编码值最小的字符 |
title() |
以首字母大写的方式显示每个单词。 |
upper() |
将字符串改为全部大写 |
lower() |
将字符串全部改为小写 |
>>> len("hello")
5
>>> max("abc")
'c'
>>> min("abc")
'a'比较字符串
我们可以使用 ( > , < , <= , <= , == , != ) 比较两个字符串。Python 比较字符串是按照编纂字典的方式进行的,也就是使用 ASCII 编码值。
假设 str1的值为"Jane",str2 的值为"Jake",首先比较这两个字符串的第一个字符“J”,如果相等,就继续比较第二个字符(a 和 a),因为相同,所以继续比较第三个字符(n 和 k),因为 n 的 ASCII 编码值大于 k,因此 str1 大于 str2。更多例子参见下面的代码:
>>> "tim" == "tie"
False
>>> "free" != "freedom"
True
>>> "arrow" > "aron"
True
>>> "green" >= "glow"
True
>>> "green" < "glow"
False
>>> "green" <= "glow"
False
>>> "ab" <= "abc"
True遍历字符串
字符串是序列,因此也可以使用循环遍历成员。
>>> s = "yangjh"
>>> for i in s:
... print(i, end="")
...
yangjhprint()函数在默认状态下,会另起一行打印字符串,我们可以使用第二个参数修改结束标记。如print("my string", end="")就表示打印字符串,但不另起一行。
字符串内容检验
Python 字符串类内置了丰富的方法,使用这些方法,我们可以检查字符串内容的类型。
| 方法名称 | 方法说明 |
|---|---|
isalnum() |
如果 str 包含字符都是字母或数字则返回 True |
isalpha() |
如果 string 包含字符都是字母则返回 True |
isdigit() |
如果 string 包含字符都是数字则返回 True |
isidentifier() |
判断字符串是否是合格的标识名 |
islower() |
判断字符串中是否都是小写字母 |
isupper() |
判断字符串中是否都是大写字母 |
isspace() |
判断字符串是否由空格组成 |
这些判断方法的实例如下:
>>> s = "welcome to python"
>>> s.isalnum()
False
>>> "Welcome".isalpha()
True
>>> "2012".isdigit()
True
>>> "first Number".isidentifier()
False
>>> s.islower()
True
>>> "WELCOME".isupper()
True
>>> " \t".isspace()
True字符串内查找和替换
除了一般的序列操作,字符串还有独有的一些方法。如查找和替换:
print(s.find('in'))
print(s.replace('g', 'gs')) # 虽然显示字符串已被替换,但实际上是一个新的字符串。相关的方法见下表:
| 方法名称 | 方法说明 |
|---|---|
endswith(s1: str): bool |
如果字符串以指定的字符串结尾,则返回真 |
startswith(s1: str): bool |
如果字符串以指定的字符串开始,则返回真 |
count(substring): int |
返回子字符串在字符串中出现的次数 |
find(s1): int |
返回子字符串在字符串中第一次出现的索引,如果没有,则返回-1 |
rfind(s1): int |
返回子字符串在字符串中最后一次出现的索引,如果没有,则返回-1 |
示例如下:
>>> s = "welcome to python"
>>> s.endswith("thon")
True
>>> s.startswith("good")
False
>>> s.find("come")
3
>>> s.find("become")
-1
>>> s.rfind("o")
15
>>> s.count("o")
3接受用户输入的内容字符串
input()函数可以接受用户输入的内容,并将其保存到字符串中:
price = input("请输入您的年龄\n")
print(type(price), price)该函数返回的值是字符串类型。
格式化字符串
字符串模版
- 在字符串前加前缀
f或F,通过{expression}表达式,可以在字符串中使用表达式的值。 - 还可在表达式后面增加格式说明符,以便控制内容格式。
Python格式化字符串的替代符以及含义
| 符号 | 说明 |
|---|---|
%c |
格式化字符及其ASCII码 |
%s |
格式化字符串 |
%d |
格式化整数 |
%u |
格式化无符号整型 |
%o |
格式化无符号八进制数 |
%x |
格式化无符号十六进制数 |
%X |
格式化无符号十六进制数(大写) |
%f |
格式化浮点数字,可指定小数点后的精度 |
%e |
用科学计数法格式化浮点数 |
%E |
作用同%e,用科学计数法格式化浮点数 |
%g |
根据值的大小决定使用%f或%e |
%G |
作用同%g,根据值的大小决定使用%f或%e |
%p |
用十六进制数格式化变量的地址 |
案例: 设置浮点数的显示精度
import math
print(f'{math.pi:.3f}.')print(f'{math.pi:.3f}.')将打印出3.141。在 ':' 后传递整数,为该字段设置最小字符宽度,常用于列对齐。
案例:设置字符换及数字显示长度
table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
for name, phone in table.items():
print(f'{name:10} ==> {phone:10d}')
...
Sjoerd ==> 4127
Jack ==> 4098
Dcab ==> 7678f字符串是Python 3.6引入的。如果你使用的是Python 3.5或更早的版本,需要使用format()方法,而非这种f语法。要使用方法format(),可在圆括号内列出要在字符串中使用的变量。对于每个变量,都通过一对花括号来引用。
还可以使用字符串format()方法。str.format() 方法的基本用法如下所示:
for x in range(1, 11):
... print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))
...
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000print('We are the {} who say "{}!"'.format('knights', 'Ni'))
We are the knights who say "Ni!"花括号及之内的字符(称为格式字段)被替换为传递给 str.format() 方法的对象。花括号中的数字表示传递给 str.format() 方法的对象所在的位置。
print('{0} and {1}'.format('spam', 'eggs'))
spam and eggs
print('{1} and {0}'.format('spam', 'eggs'))
eggs and spamstr.format() 方法中使用关键字参数名引用值。
print('This {food} is {adjective}.'.format(
... food='spam', adjective='absolutely horrible'))
This spam is absolutely horrible.字符转义
使用\加上符号表示对其后的字符进行转义,如\n表示换行,而不是\和n的简单组合。例如,要在字符串中添加制表符,可使用字符组合\t。
常用转义符号
| 符号 | 说明 |
|---|---|
\ |
如果出现在行尾,则表示续行。即一行未完,转到下一行继续写 |
\' |
单引号 |
\" |
双引号 |
\n |
换行符 |
\t |
横向制表符 |
\r |
回车符 |
\x |
十六进制数代表的字符 |
原始字符串
要防止字符串中使用转义,需要在字符串前面加上r或者R,表示原始(raw)字符串,例如r"data\600519.csv"。
防止字符转义案例
fileUrl = r"data\600519.csv"如果不加r,则文件路径中的\600就会被转义为ƀ,进而可能会引发错误。