Fork me on GitHub

数据类型之字符串

一、概要

字符串使用算是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

image-20211218215919293

(二)切片

语法:[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'
posted @ 2023-01-19 16:53  iveBoy  阅读(23)  评论(0)    收藏  举报
TOP