格式化字符串
Python 中的字符串(Strings)是用单引号或双引号标记的一系列连续字符(characters),换句话说,字符串是由单个字符组成的序列(list)。即便只有一个字符,也是字符串,Python 中没有字符数据类型。单引号括起的字符串和双引号括起的字符串是一样的,它们不存在任何区别。
还可以使用三引号'''
定义字符串,这种方式可以定义多行文字。
创建字符串
创建字符串的最简单方法是将文本放入单引号('
)或双引号("
)中。Python不区分单引号和双引号,你可以根据自己的喜好选择使用。
# 使用单引号
= 'Hello, World!'
greeting
# 使用双引号
= "Hello, World!" greeting
在这两个例子中,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
”。
= 'string'
s print(len(s))
print(s[0]) # 输出序列的第一个元素
0] = 'another s' # 试图修改字符串的内容
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="")
...
... yangjh
print()
函数在默认状态下,会另起一行打印字符串,我们可以使用第二个参数修改结束标记。如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()
函数可以接受用户输入的内容,并将其保存到字符串中:
= input("请输入您的年龄\n")
price 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
。在 ':'
后传递整数,为该字段设置最小字符宽度,常用于列对齐。
案例:设置字符换及数字显示长度
= {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
table for name, phone in table.items():
print(f'{name:10} ==> {phone:10d}')
...==> 4127
Sjoerd ==> 4098
Jack ==> 7678 Dcab
f
字符串是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 1000
print('We are the {} who say "{}!"'.format('knights', 'Ni'))
"Ni!" We are the knights who say
花括号及之内的字符(称为格式字段)被替换为传递给 str.format()
方法的对象。花括号中的数字表示传递给 str.format()
方法的对象所在的位置。
print('{0} and {1}'.format('spam', 'eggs'))
and eggs
spam print('{1} and {0}'.format('spam', 'eggs'))
and spam eggs
str.format()
方法中使用关键字参数名引用值。
print('This {food} is {adjective}.'.format(
='spam', adjective='absolutely horrible'))
... foodis absolutely horrible. This spam
字符转义
使用\
加上符号表示对其后的字符进行转义,如\n
表示换行,而不是\
和n
的简单组合。例如,要在字符串中添加制表符,可使用字符组合\t
。
常用转义符号
符号 | 说明 |
---|---|
\ |
如果出现在行尾,则表示续行。即一行未完,转到下一行继续写 |
\' |
单引号 |
\" |
双引号 |
\n |
换行符 |
\t |
横向制表符 |
\r |
回车符 |
\x |
十六进制数代表的字符 |
原始字符串
要防止字符串中使用转义,需要在字符串前面加上r
或者R
,表示原始(raw)字符串,例如r"data\600519.csv"
。
防止字符转义案例
= r"data\600519.csv" fileUrl
如果不加r
,则文件路径中的\600
就会被转义为ƀ
,进而可能会引发错误。