5.1字符串概念
字符串是一个不可变的有序序列
[不可变:是字符串内容一旦确定就不能发生变化了, 如果感觉发生变化了其实是生成了1️⃣个新的]
[存储机制:采用了intern 字符串驻留机制,
intern机制: 相同的字符串对象只会存一份,放在字符串的存储池中,这个存储是共享公用的]
intern机制是怎么实现的? — 通过维护字符串存储池来实现的这个操作。这个存储池是一个类似于字典的结构
如果字符串已经存储于池子中,就不会创建新的对象,直接返回之前创建好的字符串对象
如果这个对象之前没有在池子中,会在池子中先去创建一个字符串对象,便于使用
注意:池子中对于那些特殊的不常用的字符不会进行存储的因为认为这些是不常用的没有必要持久存储
把字符串内容当做键
#存储池--字典结构
str_dict = {}
def save_str(s): # 传进来字符串内容
# 查看s在不在存储池池中
if s in str_dict:
return str_dict[s]
else:
obj = PyStringObj(s) # 创建字符串对象
str_dict[s] = obj可以让
return obj
5.2# 索引
字符串是一个有序序列
有序 --- 容器的从左到右每个位置都有编号[下标 脚标 索引]
在Python中这个编号有两种表达形式
从左向右数 0 ... 长度-1
从右向左数 -1 -2 ... -长度
不可变的-- 不能修改指定位置的字符
# TypeError: 'str' object does not support item assignment 字符串对象不支持元素被重置
import string
s = string.digits + string.ascii_letters
ch = s[0] # 0
print(ch)
list_ch = s[-1] # Z
print(list_ch)
根据数据的不同特征对数据进行归类 类 int 对象
这类事物中具体的某个数据沈叫做对象 10 20 1 2
5.3切片 --> 提取子序列
凡是有序序列均可以切片
有序序列[start: stop: step]
从 start这个位置开始 到stop这个位置 间隔step将序列中的元索 提取出来
start和stop表示的是下标的意思
step步长
:step可以省略 -> 表示从start开始逐个取值到stop
start和stop 也是可以省略的 但是':'不能省略
step如果是负数表示从右向左取值 不省略的话start代表的位置在右边 stop在左边
start表示从最右边开始 stop表示到最左边结束
step如果是正数表示从左向右取值 不省略的话start代表的位置在右边 stop在左边
start表示从最左边开始 stop表示到最右边结束
stop不省略的情况下这个位置的元素是不包含在提取范围内的 -> 前闭后开
import string
s = string.digits + string.ascii_letters
print(s[::-1]) # 字符串反转动作
# ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba9876543210
print(s)
# 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
print(s[:3]) # 默认是从0(第一个)开始且'3'不包含在提取范围内
# 012
print(s[-3:]) # 默认是以包含最后一个字符结尾
# XYZ
print(s[:-1]) # '-1'不包含在提取范围内
# 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY
print(s[:-3:-1]) # 没有stop默认为从左向右切
# ZY
判断字符串是否以指定内容结尾
def is_start(src_str, key):
# 在宁符串中从(-key长度位置)开始提取key长度的子串判断它和key是否相同
return src_str[-len(key):] == key
print(is_start('hello', 'llo'))
5.4获取的操作
获取指定子时第一次出现的位置 [从左向右] index / find
index
获取子串第一次出现的位置
如果没有这个子串会报错
find
获取子串第一次出现的位置
如果没有这个子串会返回-1
注意
默认是从左边开始到末位 依次查找 确定位子串的位置
从指定位置开始到末尾查找确定位子串第一次出现的位置
s.find('klm', 27)
#在指定的范围内查找定位字符串第一次出现的位置
s.find('klm', 10, 30)
类似
#查找某个子串最后一次出现的位置 rindex rfind
import string
s = string.digits + string.ascii_letters
print(s)
print(s.find('klm')) # 有返回第一个字符的位置20
print(s.find('km')) # 没有返回-1
print(s.find('klm', 27)) # 从索引为27的开始查找
# 获取某个子串在字符串中出现的次数
count = s. count('ABC') # 默认也是从头到尾查找
print(count) # 2
other = 'aakkzxkksaskkkzx' # 3
print(other.count('kk'))
# 注意:子串的内容被数过之后就不会重复去数
获取某个子串在字符串中出现的次数
print('=' * 50)
# 手写一个count
def zhao(src_str, char):
"""
查找指定字符串中某个子串出现的次数
:param src_str:指定字符串
:param char:某个子串
:return:出现的次数
"""
start = src_str.find(char)
if start == -1:
return 0
return zhao(src_str[start + len(char):], char) + 1
print(zhao('sdsasadaskdasfaifskasdasdkfjak', 'as'))
5.5转换
1.将字符串中的英文字母转换为大写
s.upper()
2.将字符串中的英文字母转化为小写
.lower()
3.将字符串中的英文字母大写转化为小写 小写转化为大写
.swapcase()
4.将字符串的首个字母大写 不是字母不做操作
.capitalize()
5.将字符串中每个单词的首字母大写
.title()
6.把字符串转化为字节编码
.encode()
7.把字节编码转换成字符串
.decode(encoding='gbk')
s = 'RecursionError: maximum recursion depth excee