数据类型之字符串
一、概要
字符串使用算是Python中使用比较频繁的数据类型了。
- 字符串基础
- 字符串操作
- 字符串格式化
- 字符串主要方法
- 字符串其它方法
二、字符串基础
(一) 字符串定义
str1='hello'
str2="hello"
#保留字符串格式信息
str3='''hello
world
'''
print(str1)
print(str2)
print(str3)
(二) 字符串与转义字符
如果字符串中间有正常的字符,不进行区别就会报错,python解释器无法判断单引号是正常字符还是多余单引号,例如:
s1='It's pencil'
print(s1)
File "<ipython-input-6-efe6d2ca4c27>", line 1
s1='It's pencil'
^
SyntaxError: invalid syntax
解决方法:
使用双引号将单引号扩起来
s1="It's pencil"
print(s1)
It's pencil
如果内部是双引号,可以使用单引号扩起来
但是如果同时输出单引号和双引号,那又怎么办呢?,这时就需要使用转义字符。
s1="It's pencil,and not \"pen\""
print(s1)
It's pencil,and not "pen"
这样就可以解决同时输出单引号和双引号了,其实这也是可以解决只输出单引号或者双引号的问题。
(三)转义字符
转义字符的定义:由反斜杠加上一个字符或数字组成,它把反斜杠后面的字符或数字转换成特定的意义。
| 转义字符 | 解释 | 举例 |
|---|---|---|
| \n | 换行 | "hello\nworld" |
| \r | 回车,移到每一行的行首 | "hello\rworld" |
| \b | 退格 | "hello\bworld" |
| \t | 制表符,横向跳格 | "hello\tworld" |
| \x20 | 空格 | “hello\x20world” |
| \\ | 反斜杠 | "hello\world" |
| " | 双引号 | "hello"world" |
| ' | 单引号 | "hello'world" |
(四)拼接字符串
但是对于字符串变量是不可以的,Python解释器会报语法错误,这时需要使用“+”进行拼接
s2="ni"
s3="hao"
print(s2+s3)
nihao
(五)长字符串
在字符串中提到了三引号包裹字符串,三引号进行输出会成为一个长字符串,它保留原始格式。
单、双引号混用,不需要加转义符
s6="""
It's my pencil,not "pen"
"""
print(s6)
It's my pencil,not "pen"
长字符串只需在每一行结尾处输入"",这样的话转行就被转义了,变成一行字符串
s7="""ni\
hao"""
print(s7)
nihao
(六) 案例
# 案例一
s1 = "床前明月光,\n疑是地上霜。\n举头望明月,\n低头思故乡。"
print(s1)
# 案例二
s1 = """床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。"""
print(s1)
# 案例三
s1 = """床前明月光,
\r疑是地上霜。
\r举头望明月,
\r低头思故乡。"""
print(s1)
三、字符串基本操作
(一)索引
根据字符串索引取值,索引为0取出字符串第一个值,索引为-1取出倒数第一个,索引从0(前向)或-1(后向)开始。
s8="hello word"
print(s8[0]) #h
print(s8[-1]) #d
(二)切片
语法:[start : finish]
- start:子序列开始位置的索引值
- finish:子序列结束位置的下一个字符的索引值
如果不提供 start 或者 finish,默认 start 为第一 个字符开始,finish 为最后一个字符
s8="hello word"
print(s8[1:4]) #ell
print(s8[:5]) #hello
print(s8[-3:]) #ord
另外切片接受三个参数的情况:
[start : finish : countBy]
- 默认 countBy 为 1
s8="hello word"
print(s8[::2])#hlowr 每隔一个取一个字符
案例一:逆串
s8="hello word"
print(s8[::-1]) #drow olleh
案例二:各个为数字立方和
s = input("请输入一个三位数:")
a = s[0]
b = s[1]
c = s[2]
res = pow(a, 3) + pow(b, 3) + (c, 3)
print(res)
(三) 获取字符串长度
使用了len()方法获取字符串长度a
s11="hello word"
print(len(s11)) #10
(四) 乘法
字符串中使用乘法
s9='mnk'
print(10*s9)#mnkmnkmnkmnkmnkmnkmnkmnkmnkmnk
print(s9*10)#mnkmnkmnkmnkmnkmnkmnkmnkmnkmnk
(五) 判断是否包含值
使用用in判断字符串中是否包含其中的一部分,如果是,返回True,否则返回False
s10="hello word"
print('h' in s10)#True
print('o' not in s2)#True
(六) 案例
从控制台接收任意一个字符串,且长度大于5,获得第二个到倒数第二个的字符之间的子串。
s = input("请输入:")
length = len(s)
if length > 5:
substr = s[1:-1]
print(substr)
四、字符串格式化
如果一个字符串中有一部分是固定的,而另一部份是动态变化的,那么可以将固定部分做成模板,动态变化的部分用“%”进行替换。“%”后面根据不同数据类型进行格式化参数。
例如:
- %d 整数
- %f 浮点型
- %f 字符串
等参数。如果要在格式化字符串中显示百分号就需要使用两个百分号(%%),否则就会因为数量不匹配抛出异常。
(一) %方式
比如:
s = "price %d" % 5
print(s)
另外还可以使用模板字符串、format方法
(二) 模板字符串
在string模块中有一个用于格式化的Template类的构造方法,该类功能是用同一个值替换所有的相同的格式化参数。参数使用“$”符号开头,格式化时需要使用Template类的substitute()方法。
from string import Template
template=Template("$s $s")
result=template.substitute(s="nihao")
print(result) #nihao nihao
当格式化参数是字符串的一部分需要大括号将其区分开
from string import Template
template=Template("${s}stitute")
result=template.substitute(s="sub")
print(result) #substitute
(三)format()方法
字符串本身有一个format方法用于格式化字符串,这个与之前的"%"不太一样,它使用的是{},支持按顺序以及关键字格式化字符串。
- 顺序格式化
s12="{},{}"
print(s12.format("hello","world")) #hello,world
- 关键字格式化
s12="{a},{b}"
print(s12.format(a="hello",b="world")) #hello,world
- 混合格式化
format传递参数需要前面是按照顺序传递的参数,后面是关键字传递参数。
s12="{a},{},{b},{}"
print(s12.format("你好","世界",a="hello",b="world")) #hello,你好,world,世界
(四) 案例
从控制台接收两个整数,然后计算它们的乘积,类似乘法口诀。
a = int(input("第一个数:"))
b = int(input("第二个数:"))
print("{}*{}={}".format(a,b,a*b))
五、字符串主要方法
(一) center()
用于将一个字符串在一定宽度区域居中显示,并且在字符串两侧填入制定字符长度为1的字符串,默认情况填充空格。
s13="hell0"
print(s13.center(30))#hello
print(s13.center(30,"*"))#************hell0*************
(二) find()
用于在一个大字符串中查找小字符串,如果找到,find()方法返回子字符串在大字符串中出现的第一个位置,如果没找到,返回-1。
s14="Hello World"
print(s14.find("ld"))#9
print(s14.find("m"))#-1
find()方法可以指定查找开始和结束的位置。使用第二个和第三个参数。
s14="Hello World"
print(s14.find("ll",2,7))#2
(三) join()
用于连接序列中的元素。
list=['A','B','C','D']
s15='*'
print(s15.join(list)) #A*B*C*D 将字符串s15与列表中的每个元素进行相连,然后将连接的结果进行合并
注意:与字符串连接的序列元素必须是字符串类型,如果是其它类型就会报错。
(四) split()
split()方法与join()方法互为逆方法,split()方法将一个字符串通过分隔符拆成一个序列,如果split()方法不指定任何参数,就会把所有空格作为分隔符。
s17="h e l l 0"
print(s17.split())#['h', 'e', 'l', 'l', '0']
s16="A*B*C*D"
print(s16.split('*'))#['A', 'B', 'C', 'D']
(五) lower()、upper()和capwords()方法
lower()、upper()方法分别是将字符串中所有字母字符转换为小写和大写,capwords()是将字符串中每个单独的单词的首字母转换为大写。
s18="HELLO"
s19="word"
print(s18.lower())#hello
print(s19.upper())#WORD
import string
s20="it is pencil"
print(string.capwords(s20))#It Is Pencil
(六) replace()
用于将一个字符串中的子字符串替换为另外一个字符串,该方法返回替换后的子字符串,如果在原字符串中未找到要替换的子串,那么该方法返回原字符串,replace()方法就是一个查找替换的过程。
s21="hello world"
print(s21.replace('world','bright')) #hello bright
(七)strip()
用于截取字符串的前后空格或者指定的字符。
- 用于截取前后空格
s22=" hello world "
print(s22.strip())#hello world
- 用于截取指定字符
s23="hello world"
print(s23.strip("hd"))#ello worl
注意:
- strip()方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
六、字符串其它方法
(一) count()
用于统计字符串里某个字符出现的次数。可选参数为在字符串搜索的开始与结束位置
person = "my name is bright, i am 27 years old"
print(person.count('m',3,30)) #2 从索引3开始到索引30结束
(二) endswith()
用于判断字符串是否以指定后缀结尾,如果以指定后缀结尾返回True,否则返回False。可选参数"start"与"end"为检索字符串的开始与结束位置。
person = "my name is bright, i am 27 years old"
print(person.endswith('old',3,40)) #True
(三) index()
检测字符串中是否包含子字符串 str,如果包含子字符串返回开始的索引值,否则抛出异常,可以指定开始和结束的索引值。
person = "my name is bright, i am 27 years old"
print(person.index('old',3,40)) #33
更多方式可以查看str类中的方法。
七、案列
一、获得用户输入的一个数字,可能是整数或浮点数,a,计算a的三次方值,并打印输出。
要求:
(1)输出结果采用宽度20个字符、居中输出、多余字符采用减号(-)填充。
(2)如果结果超过20个字符,则以结果宽度为准。
示例:input: 10
Output:--------1000--------
a = eval(input("请输入:"))
res = pow(a, 3)
print("{}".format(res).center(20, "-"))
二、获得输入的一个字符串s,以字符减号(-)分割s,将其中首尾两段用加号(+)组合后输出。
要求:
示例: input:a-b-c
Output:a+c
s = input()
l = s.split("-")
length = len(l)
result = l[0] + "+" + l[length-1]
print(result)
三、输入一个三位数,判断其是否为回文数。如果是回文数输出yes,否则为no.
示例:input:121
Output:yes
# 方法一
a = eval(input("请输入:"))
# 百位数
x = a // 100
y = (a-x*100) // 10
z = a-x*100-y*10
if x == z:
print("yes")
else:
print("no")
# 方法二
a = input("请输入:")
if a[0] == a[len(a)-1]:
print("yes")
else:
print("no")
八、内存模型
画图说明:
# 不可变数据类型
>>> s = 'hello'
>>> s[0] = 'a'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
# 修改整体相当于创建一个新的字符串
>>> s = 'hello'
>>> id(s)
2942381588848
>>> s = 'world'
>>> s
'world'
>>> id(s)
2942381617072
# 创建新的字符串
>>> s = 'a'+s[1:]
>>> s
'aello'


浙公网安备 33010602011771号