文章目录

  • 九、容器——字符串
  • 1. 字符串概念
  • - 字符串的概念:
  • - 定义方式
  • - 引号的嵌套:
  • - 字符串的编码
  • - 编码相关函数
  • - 类型转换str()
  • 2. 字符串的拼接、复制
  • - 拼接
  • - 复制
  • 2. 字符串下标(索引):
  • - 字符串下标:
  • - 下标的访问
  • 3. 字符串的遍历
  • *练习-自定义实现int()函数
  • 4. 字符串切片
  • 索引的顺序和倒序
  • *练习-自定义字符串逆序
  • 5. 字符串常用方法
  • a. 查找、替换、统计
  • b. 分割、连接
  • c. 判断类型
  • d. 大小写转换
  • e. 文本对齐
  • f. 去除空白字符
  • 6. 转义字符
  • 7. 字符串驻留机制
  • 8. 字符串比较和同一性
  • 9. 可变字符串(了解)


九、容器——字符串

1. 字符串概念

- 字符串的概念:

  • 以引号引起来的若干字符

字符串的本质是:字符序列

  • Python 的字符串是不可变的,我们无法对原字符串做任 何修改。但,可以将字符串的一部分复制到新创建的字符串,达到“看起来修改”的效果。
  • Python 不支持单字符类型,单字符也是作为一个字符串使用的。

- 定义方式

  • 空字符串
  • ‘’
  • “”
  • 双引号和单引号
  • ‘hello’
  • “hello”
  • 连续三个单引号或三个双引号,可以帮助我们创建多行字符串
  • ‘’‘hello’’’:可换行的字符串
  • “”“hello”""

在 Python 中可以使用 一对双引号 " 或者 一对单引号 ' 定义一个字符串

- 引号的嵌套:

虽然可以使用 \" 或者 \' 做字符串的转义,但是在实际开发中:

  • 如果字符串内部需要使用 ",可以使用 ' 定义字符串
  • 如果字符串内部需要使用 ',可以使用 " 定义字符串
a = 'my_name is "TOM"'

- 字符串的编码

Python3 直接支持 Unicode,可以表示世界上任何书面语言的字符。

Python3 的字符 默认就是 16 位 Unicode 编码,ASCII 码是 Unicode 编码的子集。

- 编码相关函数

  • 使用内置函数 ord()可以把字符转换成对应的 Unicode 码;
  • 使用内置函数 chr()可以把十进制数字转换成对应的字符。

- 类型转换str()

str()可以帮助我们将其他数据类型转换为字符串。

2. 字符串的拼接、复制

- 拼接

  1. 可以使用+将多个字符串拼接起来。例如:’aa’+ ’bb’ ==>’aabb’。
  1. 如果+两边都是字符串,则拼接。
  2. 如果+两边都是数字,则加法运算。
  3. 如果+两边类型不同,则抛出异常。
  1. 可以将多个字面字符串直接放到一起实现拼接。
  • 例如:’aa’’bb’==>’aabb

- 复制

使用*可以实现字符串复制。

a = 'Sxt'*3
a  # 'SxtSxtSxt'

2. 字符串下标(索引):

- 字符串下标:

  • 字符串中,每个字符的编号
  • 字符串的下标范围是: 0 ~ 字符串字符个数-1

- 下标的访问

格式

字符串或字符串变量名[下标数字]

eg.

name = 'abcdef'
print(name[0])  # 输出a

print('hello'[0])

正向搜索:

  • 最左侧第一个字符,偏移量是 0,第二个偏移量是 1,以此类推。直到 len(str)-1 为止。

反向搜索:

  • 最右侧第一个字符,偏移量是-1,倒数第二个偏移量是-2,以此类推,直到-len(str) 为止。

3. 字符串的遍历

遍历: 依次访问字符串中的每一个字符

方式一:

for c in s:
	print(c) # 无下标

方式二:

字符串的长度 = len(字符串)
for i in range(len(字符串)):
	print(s[i]) # 有下标

方式三:

i = 0
while i < len(字符串):
	print(s[i]) # 有下标
	i += 1

*练习-自定义实现int()函数

def my_int(s):
    # 定义一个用来返回转换后的变量
    ret_num = 0
    # 遍历字符串,拿到字符串中的每一个字符

    for c in s:
        # 利用并拿到了字符,通过ord函数,和字符ASCII码进行转换,得到差值
        n = ord(c) - ord('0')
        # 进行数据的累加
        ret_num = ret_num * 10 + n  # 从百位到各位遍历*10

    return ret_num


m = my_int('123')
print(m) # 输出123
print(m*10) # 输出1230

4. 字符串切片

切片作用:通过制定下表,可以获取字符串中的某一段字符

支持类型

  • 切片* 方法适用于 字符串列表元组
  • 切片 使用 索引值 来限定范围,从一个大的 字符串切出 小的 字符串
  • 列表元组 都是 有序 的集合,都能够 通过索引值 获取到对应的数据
  • 字典 是一个 无序 的集合,是使用 键值对 保存数据

格式

字符串或字符串变量[开始索引:结束索引:步长]

注:

  • 左闭右开,不包含结束下标
  • 起始 位开始,到 结束位的前一位 结束(不包含结束位本身)
  • 从头开始,开始索引 数字可以省略,冒号不能省略
  • 到末尾结束,结束索引 数字可以省略,冒号不能省略
  • 步长默认为 1,如果连续切片,数字和冒号都可以省略
  • 步长可以为负数,即逆序取值
str[::-1]  # 输出9876543210
str[-1::-1]  # 和上边等价
索引的顺序和倒序
  • 在 Python 中不仅支持 顺序索引,同时还支持 倒序索引
  • 所谓倒序索引就是 从右向左 计算索引
  • 最右边的索引值是 -1,依次递减

特殊使用

  • s[:]:完整切片,等效于s[0:len(s)]
  • s[5:]:从下标位置切片至末尾
  • s[:10]:从起始位置切片至下标位置
  • s[::2]:步长为2,完整切片
  • s[::-1]:等价于str[-1::-1],步长为-1,倒序完整切片,即从右往左切片(重点
  • s[10:2:-1]:从10切片至2,倒序切片
  • s[2:10:-1]:输出为'',即空字符串

了解

起始、结束下标也可以用负数

表示从右往左编号,第一个字符为-1

  • s[-1:-5:-1]:从右往左切片,从末尾位置切片至倒数第五个位置
  • s[-5:-1:-1]:输出为'',即空字符串
  • 起始偏移量和终止偏移量不在[0,字符串长度-1]这个范围,也不会报错
"abcdefg"[3:50]
# 输出'defg'

*练习-自定义字符串逆序

逆序的代码实现

# 方法一
s = 'hello'
def rev_str(s):
    res = ''
    i = len(s) - 1
    while i >= 0:
        res += s[i]
        i -= 1
    return res
print(rev_str(s))
# 方法二
s = 'hello'
def rev_str(s):
    cl=list(s)
    # print(cl)
    cl.reverse()
    return cl
print(rev_str(s))

5. 字符串常用方法

API 应用程序接口文档
Application Interface

https://docs.python.org/zh-cn/3/

a. 查找、替换、统计

方法

说明

find(str, start=0, end=len(string))

检测 str 是否包含在 string 中,如果 start 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,

找不到子串时则返回 -1常用

rfind(str, start=0, end=len(string))

类似于 find(),不过是从右边开始查找

index(str, start=0, end=len(string))

跟 find() 方法类似

找不到子串时,程序会报错

rindex(str, start=0, end=len(string))

类似于 index(),不过是从右边开始

replace(old_str, new_str, num=string.count(old))

把 string 中的 old_str 替换成 new_str,默认全部替换

如果 num 指定,则替换不超过 num 次

会返回一个新的字符串,而不会修改原有字符串

常用

count(str, start=0, end=len(string))

计数统计某个字符个数

常用

len(字符串)

字符串长度

注:字符串是不可变对象,replace()方法中,实际上我们是创建了新的字符串对象,并指向了变量 a,而不是修改了以前的 字符串。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1dCGtMmK-1609854024014)(Media/image-20201229211855737.png)]

b. 分割、连接

方法

说明

split(str="", num)

以 str 为分隔符拆分 string,如果 num 有指定值,则仅分隔 num + 1 个子字符串,

不传递参数str时,默认使用 ‘\r’, ‘\t’, ‘\n’ 和空格作为分隔符

返回一个字符串列表list

常用

splitlines()

仅识别换行符(按照行(’\r’, ‘\n’, ‘\r\n’)分隔)

返回一个包含各行作为元素的列表

partition(str)

把字符串 string 分成一个 3 元素的元组 (str前面, str, str后面)

作用:保留分割内容并分割

输出:一个元租

rpartition(str)

类似于 partition() 方法,不过是从右边开始查找

s.join(可迭代对象)

以 s作为分隔符,将 可迭代对象 中所有的元素(的字符串表示)合并为一个新的字符串

eg.‘hello’.join(’-’) # 输出 ‘h-e-l-l-o’

常用

拼接字符串要点

  • 使用字符串拼接符+,会生成新的字符串对象,因此不推荐使用+来拼接字符串。
  • 推荐 使用 join 函数,因为 join 函数在拼接字符串之前会计算所有字符串的长度,然后逐一拷贝, 仅新建一次对象

eg.

'-'.join('hello')  # 输出 'h-e-l-l-o'

l = ['Hello', 'World', 'Hello', 'Python']
print('_'.join(l))  # 输出:Hello_World_Hello_Python

print('$'.join('A')) # 输出:A

测试+拼接符和 join(),不同的效率

import time
time01 = time.time() #起始时刻
a = ""
for i in range(1000000):
	a += "sxt"
time02 = time.time() #终止时刻
print("运算时间:"+str(time02-time01))
time03 = time.time() #起始时刻
li = []
for i in range(1000000):
    li.append("sxt")
a = "".join(li)
time04 = time.time() #终止时刻
print("运算时间:"+str(time04-time03))

c. 判断类型

方法

说明

startswith(str)

检查字符串是否是以 str 开头,是则返回 True【常用

endswith(str)

检查字符串是否是以 str 结束,是则返回 True【常用

isupper()

如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True

islower()

如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True

isdigit()

如果 string 只包含数字则返回 True,全角数字\u00b2

isalpha()

如果 string 至少有一个字符并且所有字符都是字母则返回 True

isalnum()

如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True

isspace()

如果 string 中只包含空白字符(包括:空格 \n \r \t),则返回 True【常用

isdecimal()

如果 string 只包含数字则返回 True,全角数字常用

isnumeric()

如果 string 只包含数字则返回 True,全角数字\u00b2汉字数字

istitle()

如果 string 是标题化的(每个单词的首字母大写)则返回 True

全角数字:不包含小数

d. 大小写转换

方法

说明

upper()

转换 string 中的小写字母为大写【常用

lower()

转换 string 中所有大写字符为小写【常用

title()

把字符串的每个单词首字母大写

capitalize()

把字符串的第一个字符大写

swapcase()

翻转 string 中的大小写

e. 文本对齐

方法

说明

ljust(width)

返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串

rjust(width)

返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串

center(width)

返回一个原字符串居中,并使用空格填充至长度 width 的新字符串

默认使用英文空格,对中文效果不好,可做如下优化

#使用center方法居中显示文本 print(poem_str.center(10, " "))# 参数中多一个用引号引起来的中文空格(全角)

f. 去除空白字符

方法

说明

strip()

截掉 string 左右两边的空白字符【常用

lstrip()

截掉 string 左边(开始)的空白字符

rstrip()

截掉 string 右边(末尾)的空白字符

# 常用去单词间空白方法【常用】
' '.join(s.split())

6. 转义字符

字符串中的转义字符

  • \t 在控制台输出一个 制表符,协助在输出文本时 垂直方向 保持对齐
  • \n 在控制台输出一个 换行符

制表符 的功能是在不使用表格的情况下在 垂直方向 按列对齐文本

转义字符

描述

\(在行尾时)

续行符

\\

反斜杠符号

\'

单引号

\"

双引号

\n

换行

\t

横向制表符

\r

回车

\b

退格(Backspace)

7. 字符串驻留机制

  • 字符串驻留机制:**仅保存一份 **相同且不可变字符串的方法,不同的值被存放在字符串驻留池中。
  • Python 支持字符串驻留机制,对于符合标识符规则的字符串(仅包含下划线(_)、字母 和数字)会启用字符串驻留机制驻留机制。
  • 注意:只有字面量或者字面量的拼接会被缓存在驻留池,其他方式产生的字符串不在驻留池
a = "abd_33" # 仅包含下划线(_)、字母 和数字,在驻留池
b = "abd_33"
a is b  # True 指向同一对象

c = "dd#"  # 因为有'#',不符合标识符规则的字符串,不在驻留池
d = "dd#"
c is d  # False 指向不同对象

str1 = "aa"
str2 = "bb"
str1+str2 is "aabb"  # False  只有字面量或者字面量才存在驻留池里,这里是新生成的字符串,所以不在驻留池

str1+str2 == "aabb" # True

s1 = str1 + str2
b = s1 is "aabb"  # False

s2 = 'aa' + 'bb'
c = s2 is 'aabb'  # True  字面量的拼接缓存在驻留池里

8. 字符串比较和同一性

  • ==,!=
  • 对字符串进行比较,是否含有相同的字符。
  • is / not is
  • 判断两个对象是否同一个对象。比较的是对象的地址,即 id(obj1)是 否和 id(obj2)相等。
  • 成员操作符,in /not in 关键字:
  • 判断某个字符(子字符串)是否存在于字符串中。

9. 可变字符串(了解)

在 Python 中,字符串属于不可变对象,不支持原地修改,如果需要修改其中的值,智 能创建新的字符串对象。但是,经常我们确实需要原地修改字符串,可以使用 io.StringIO 对象或 array 模块。

import io
s = "hello, sxt"
sio = io.StringIO(s)
sio  # <_io.StringIO object at 0x02F462B0>
sio.getvalue()  # 'hello, sxt'
sio.seek(7)  # 7
sio.write("g")  # 1
sio.getvalue()  #'hello, gxt'