原文点这里
字符串是 Python 中最常用的数据类型,几乎所有的python应用程序都会以某种方式用到字符串。今天我们就利用几分钟时间详细了解下我们经常用的这种数据类型。
字符串是什么
字符串是单个字符的序列。序列这个术语很重要,这意味着字符串是固定的,即他们的位置无法改变。字符串中可以包含数字、字母,以及一些控制字符,如换行符、制表符等。
- 使用单引号(’)
你可以用单引号定义字符串,就如同’xiao Q’这样。所有的空白,即空格和制表符都照原样保留。
- 使用双引号(")
在双引号中的字符串与单引号中的字符串的使用完全相同,例如"xiao Q"。
- 使用三引号(’’'或""")
利用三引号,你可以指示一个多行的字符串。你可以在三引号中自由的使用单引号和双引号。例如:
‘’’
My name is xiao Q,
我的中文名字叫小Q,
这是一个多行字符串。
‘’’
注意上述三种字符串在语义上没有任何差别,但必须要求在字符串开始和结尾使用的引号类型必须相同。
将多个字符串常量放在一行会连接起来,如
string = "hello"'world' '!'
helloworld!
转义符
假设你想要在一个字符串中包含一个单引号(’),那么你该怎么指示这个字符串?例如,这个字符串是What’s your name?。你肯定不会用’What’s your name?'来指示它,因为Python会弄不明白这个字符串从何处开始,何处结束。所以,你需要指明字符串中间的单引号不是字符串的结尾。可以通过转义符来完成这个任务(如果只用双引号和单引号定义整个字符串,则可以相应的嵌入单引号和双引号)。
在python中使用反斜杠(’\’)来转义特殊字符,如换行符,反斜杠本身,引号等等。下面列出了一些常用的转义字符,无法识别的转义符将连同前面的反斜杠在内保持原样。
常见的转义字符
字符 | 描述 |
---|---|
\ | 续行符 |
\\ | 反斜杠符号 |
\’ | 单引号 |
\" | 双引号 |
\a | 响铃(音箱发出声音) |
\b | 退格 |
\e | 转义 |
\0 | 空 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符 |
\r | 回车 |
\f | 换页 |
下面我们展示下转义字符在字符串中的应用。
print("xiao \
Q") # 加入续行符
xiao Q
print("\\") # 反斜杠,输出为\
print("xiao \t Q") #纵向制表符
xiao
Q
print("xiao\rQ")
Q
自然字符串
如果你想要指示某些不需要如转义符那样的特别处理的字符串,即不想任何转义字符生效时,那么你需要指定一个自然字符串。自然字符串通过给字符串加上前缀r或R来指定。例如r"Newlines are indicated by \n"。
print(r"\n \a \\ \'")
\n \a \\ \'
Unicode字符串
Unicode是书写国际文本的标准方法,它为每种语言的每一个字符都设定了统一并且唯一的二进制编码。那么你需要有一个支持Unicode的编辑器。类似地,Python允许你处理Unicode文本——你只需要在字符串前加上前缀u或U 。例如,u"This is a Unicode string."。
在你处理文本文件的时候就可以使用Unicode字符串,特别是当你知道这个文件含有用非英语的语言写的文本。
字符串操作
python中可以使用“+”,“*”,”in", "not in"等运算符对字符串进行操作。
a = "xiao"
b = "Q"
c = 7
print(a + b) # 使用+连接字符串,输出为:xiaoQ。
print(b * c) # 使用*重复字符串,这里重复c=7次,输出为:QQQQQQQ
print(a + str(c)) # 注意:不同数据类型无法合并,这里c是int型,我们需要利用str()将其转成字符串型,才能够与a进行连接。
print('a' in a) # True, 判断a中是否含有字符'a'
print('c' not in a) # True, 判断a中不含有字符'c'
同时,python也提供了很多对字符串操作的函数,如下表所示(未列出全部)。
字符串操作 | 描述 |
---|---|
string.capitalize() | 将字符串的第一个字符转换为大写 |
string.center(width,fillchar) | 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串 |
string.count(str,beg=0,end=len(string)) | 获得字符串中,某一子字符串出现的次数,如果beg和end指定,则返回指定范围内str出现的次数 |
string.endswith(obj,beg=0,end=len(string)) | 检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束 |
string.find(str,beg=0,end=len(string)) | 检测 str 是否包含在字符串中,如果指定范围 beg 和 end ,则检查是否包含在指定范围内 |
string.index(str,beg=0,end=len(string)) | 跟find()方法一样,只不过如果str不在字符串中会报一个异常. |
string.isalnum() | 如果字符串至少有一个字符并且所有字符都是字母或数字则返 回 True,否则返回 False |
string.isalpha() | 如果字符串至少有一个字符并且所有字符都是字母则返回 True, 否则返回 False |
string.isdecimal() | 如果 string 只包含十进制数字则返回 True 否则返回 False. |
string.isdigit() | 如果字符串只包含数字则返回 True 否则返回 False |
string.islower() | 检查是否都为小写字母 |
string.isspace() | 如果字符串中只包含空白,则返回 True,否则返回 False. |
string.istitle() | 检查字符串中的单词是否都为首字母大写 |
string.isupper() | 检查字符串是否都为大写字母 |
string.join() | 以指定字符串作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串 |
string.lstrip() | 截掉 string 左边的空格 |
string.lower() | 转换 string 中所有大写字符为小写 |
string.split(str="", num=string.count(str)) | 以 str 为分隔符切片 string,如果 num 有指定值,则仅分隔num+1个子字符串 |
string.swapcase() | 将字符串中大写转换为小写,小写转换为大写 |
string.title() | 所有单词首字母大写,其余字母小写 |
string.upper() | 转换字符串中的小写字母为大写 |
len(string) | 返回字符串长度 |
函数的使用如下所示:
s = "xiaoQ"
s.capitalize() # 返回为'Xiaoq'
s.center(7) # 返回为' xiaoQ '
s.count('x') # 返回为1
s.endswith('q') # 返回为False
s.find('a') # 返回为2,若str不在字符串中,则返回-1
s.index('i') # 返回为1,若str不在字符串中,会报错
s.isalnum() # 返回为True
s.isalpha() # 返回为True
s.isdecimal() # 返回为False
s.isdigit() # 返回为False
s.islower() # 返回为False
sp = " "
s.isspace() # 返回为False
sp.isspace() # 返回为True
s.istitle() # 返回False
s.isupper() # 返回False
'_'.join(s) # 返回为'x_i_a_o_Q'
sl = " xiaoQ"
sl.lstrip() # 返回为"xiaoQ"
s.lower() # 返回为"xiaoq"
s.split('a') # 返回为['xi','oQ']
s.swapcase() # 返回为"XIAOq"
st = "my name is xiao q"
st.title() # 返回为"My Name Is Xiao Q"
st.upper() # 返回为”MY NAME IS XIAO Q“
len(st) # 返回为17
注意,以上函数并不改变字符串本身,而是返回修改后的新的字符串。如果要修改原字符串,可以使用如下所示方法,如:
s = s.title # 此时s变成"My Name Is Xiao Q"
索引和分片
前面我们也说了字符串是一个不可改变序列的列表,即一旦声明了字符串,则该字符串中每个字符都有了自己固定的位置。在python中可以使用[]来访问字符串中指定位置上的字符。同时也可以指定索引范围,称为分片。
s = "xiao Q"
s[2] # 索引字符串中序号为2的字符,也就是第3个字符,'a'
s[-1] # 从字符串尾部索引倒数第1个字符,'Q'
s[1:3] # 取字符串中第2个字符到第4个字符的内容,但不包括第4个内容,'ia'
s[1:-1] # 从第2个字符到最后1个字符,但不包含最后一个,'iao Q'
s[:-2] # 等同于[0:-2]相同,'xiao'
索引与分片string[start: end]的过程遵循以下的规则:
- 返回的字符串包含从start起始到end但不包括end结束的所有字符,也不包含end指定的字符。
- 若指定了start但未指定end,则一直向后分片,直至字符串结束。
- 若指定了end但未指定start,则从0开始分片直至end,但不包含end指定的字符。
- 若start和end均指定为负数,则索引从字符串尾部开始,而不是从首部开始。最后一个字符为-1。
格式化
由于字符串中的字符顺序是不可变的,但是在某些情况,又要根据不同需要修改字符串的内容。此时,可以使用"%"开头的字符,用以改变字符串的内容,转换符只是一个占位符,它会被后面表达式(变量、常量、数字、字符串、加减乘除等各种形式)的值代替。使用时将格式化的字符串放于运算符%左边,需内插到返回表达式的对象放置于右边。例如:
"my name is %s"% 'xiao Q' # 返回"my name is xiao Q"
常用的格式化字符如下表所示。
符号 | 描述 |
---|---|
%c | 转换成字符(ASCII 码值,或者长度为一的字符串) |
%r | 使用 repr() 函数将表达式转换为字符串 |
%s | 使用 str() 函数将表达式转换为字符串 |
%d/%i | 转成有符号十进制数 |
%u | 转成无符号十进制数 |
%o | 转成无符号八进制数 |
%x/%X | 转成无符号十六进制数(x / X 代表转换后的十六进制字符的大小写) |
%e/%E | 转成科学计数法(e / E控制输出e / E) |
%f/%F | 转成浮点数(小数部分自然截断) |
%g/%G | %f和%e的简写 |
%% | 输出% (格式化字符串里面包括百分号,那么必须使用%%) |
%p | 用十六进制数格式化变量的地址 |
通过"%“可以进行字符串格式化,但是”%"经常会结合下面的辅助符一起使用。
辅助符号 | 描述 |
---|---|
* | 定义宽度或者小数点精度 |
- | 用做左对齐 |
+ | 在正数前面显示加号(+) |
# | 在八进制数前面显示零(0),在十六进制前面显示"0x"或者"0X"(取决于用的是"x"还是"X" |
0 | 显示的数字前面填充"0"而不是默认的空格 |
(var) | 映射变量(通常用来处理字段类型的参数) |
m.n | m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话) |
f = 3.1415926
n = 77
print("f is %.2f, n is %d "%(f,n)) # 输出为"f is 3.14, n is 77"
print("n is %10d"%n) #输出为"n is 77"
当然,python也提供了format函数进行格式化。它用{}来代替之前的%。具体使用如下所示。
name = "xiao Q"
print("my name is {}".format(name)) # 输出为"my name is xiao Q"
age = 25
print("{} is {} years old".format(name,age)) # 输出为"xiao Q is 25 years old"
print "He is {0}! {0} is {1} years old".format(name, age) # 输出为"He is xiao Q! xiao Q is 25 years old"
# 下标参数
Q1 = ["xiao Q", 25]
Q2 = ["old Q", 18]
print ("{0[0]} is {0[1]} years old,{1[0]} is {1[1]} years old".format(Q1, Q2))
# 输出为"xiao Q is 25 years old,old Q is 18 years old"
你也可以在字符串前面加上f用以代替format。
print(f"{name} is {age} years old") # 输出为"xiao Q is 25 years old"
总结
今天我们详细介绍了python中常用的数据类型-字符串(string),希望通过本文你能在今后的学习工作中灵活运用字符串。
更多python内容分享,请关注: