定义
将''/""/''''''/""""""作为容器标志,容器中的元素全是字符不可变的(不支持增删改)、有序(支持下标操作)的容器行数据类型
字符串中的元素 - 字符
python中只有字符的概念,没有对应的数据类型
字符串中的字符
原则上任何可以通过键盘输入或者从其他地方赋值粘贴的所有的符号都可以作为字符
1.普通字符:
- 在字符串中能够代表符号本身的字符(没有特殊意义和特殊功能的符号)
2.转义字符:
- 在字符串中有特殊意义和特殊功能的符号的组合,一般是以\开头的
注意: 所有的转义字符的长度都是1
3.阻止转义: 在字符串的最前面加r/R可以让当前字符串中所有的转义字符失效(所有的符号在字符串中都表示这个符号本身)
字符编码
计算机不能直接存储字符(符号),只能存储数字;
为了能够存储字符,把每一个字符关联了一个固定的数字(这个固定的数字就是对应的字符的编码)
字符和数字和一一对应关系就是编码表:ASCII码表,Unicode编码表(python)
1) ASCII码表 - 在计算机中采用一个字节保存一个字符(总共128个字符), 字符包含了所有的字母、数字和美国常用符号
0 ~ 9: 编码值从48开始依次增加
大写字母的编码值 < 小写字母的编码值
大写字母和小写字母不是紧挨着的
2) Unicode编码表是ASCII码表的扩展, 包含了世界上所有的国家、所有的语言对应的符号(总共有65536个符号)
ASCII码: 0 ~ 127
中文编码值范围: 0x4e00 ~ 0x9fa5
字符串操作
1.查 - 获取字符 (和列表获取元素的方式一样)
1)获取单个字符: 字符串[下标]
2)切片: 字符串[开始下标:结束下标:步长]
3)遍历: 直接变量元素、通过下标遍历
注意: 一个空格是一个字符; 按tab键是4个空格,对应4个字符; \t对应一个字符
枚举:
for 下标,元素 in enumerate(序列):
循环体
2.相关操作
1)运算符:
+,*,==,!= >, <, >=, <=
字符串1 > 字符串2
比较大小比较的是字符串编码值的大小
判断字符是否是小写字母: 'a'<= char <= 'z'
判断字符是否是大写字母: 'A'<= char <= 'Z'
判断字符是否是字母: 'A' <= char <= 'Z' or 'a'<= char <= 'z'
判断字符是否是中文: '\u4e00' <= char <= '\u9fa5'
判断字符是否是数字: '0' <= char <= '9'
2) in / not in
字符串1 in 字符串2 -> 判断字符串2中是否包含字符串1
3)相关函数: len, str, sorted(排序从小到大), reversed(倒序)
3.格式字符串
a.语法: 包含格式占位符的字符串 % (值1, 值2, 值3,...)
b.说明:
格式占位符 - 格式占位符有哪些是固定,使用的时候和字符串中变化的数据的类型相关
%s - 字符串(任何类型都可以使用%s占位)
%d - 整数;
%-Nd - 整数; N约束数字最后的长度,如果不够后面补空格
%Nd - 整数; N约束数字最后的长度,如果不够前面补空格
%f - 浮点数;小数点后面保留6位小数
%.Nf - 浮点数, N约束小数点N后的小数位数(会四舍五入)
%c - 字符
% - 固定写法
() - 固定写法;如果值的个数是1可以省略
值 - 任何有结果的表达式; 值的个数和类型和前面占位符的个数以及类型保持一致
format
一个带有{}的字符串.format(值1, 值2, 值3,...)
用法1: 让空的{}个数和format中值的个数保持相同
print('我是{}, 今年{}岁'.format('余婷', 18))
用法2: {N} - N从0开始依次增加,分别表示format中第0个值,第1个值,...
print('我是{0},年是:{1}, 今年{1}岁'.format('余婷', 18))
print('数据1:{1}, 数据2:{0}, 数据3:{1}'.format(10, 20))
数据1:20, 数据2:10, 数据3:20
用法3: [key]
'{key1}, {key2}'.format(key1=值1, key2=值2) -> '值1, 值2'
print('我是{name},年龄是:{age}, 今年{age}岁'.format(age=20, name='张三'))
用法4: 用列表元素给占位符赋值(了解)
list1 = [10, 20, 30, 40]
print('{0[1]},{0[0]},{0[3]}'.format(list1))
print('{1[0]}, {1[1]}, {1[1]}, {0}'.format('张三', list1))
print('{list[1]},{list[2]},{list[3]}'.format(name='张三', list=list1))
用法5: 用字典的值给占位符赋值(了解)
student = {'name': '小明', 'age': 20, 'id': '001', 'score': 100}
print('{name}今年{age}岁,学号:{id}, 考了{score}'.format(**student))
# format(**student) --> format(name='小明', age=20, id='001', score=100)
其他的写法:
# 约束小数位数
print('圆周率:{:.2f}'.format(3.1415926)) # 约束小数位数
# 约束整数宽度
print('整数:{:0>4d}。'.format(25)) # 整数:0025
print('整数:{:0<4d}。'.format(25)) # 整数:2500。
print('整数:{:+>4d}。'.format(25)) # 整数:++25。
# 分隔
print('大的整数:{:,}'.format(100000000)) # 大的整数:100,000,000
# 百分比
print('百分比:{:.2%}'.format(0.25)) # 百分比:25.00%
4.字符串方法
1.字符串.capitalize() - 将字符串的首字母变成大写字母
str1 = 'python'
new_str1 = str1.capitalize()
print(new_str1)
2.center/ljust/rjust/zfill
"""
字符串.center(宽度, 填充字符) # xabcx
字符串.ljust(宽度, 填充字符) # abcxx
字符串.rjust(宽度, 填充字符) # xxabc
字符串.zfill(宽度) == 字符串.rjust(宽度, '0')
"""
print('abc'.center(7, '+')) # ++abc++
print('abc'.ljust(7, '+')) # abc++++
print('abc'.rjust(7, '+')) # ++++abc
print('abc'.zfill(7)) # 0000abc
# 001, 004, 009, 023, 045, 102
num = 21
print(str(num).zfill(3))
3.统计
# 字符串1.count(字符串2) -> 统计字符串1中字符串2出现的次数
# 字符串1.count(字符串2,开始下标,结束下标) - 统计字符串1开始下标到结束下标范围内字符串2出现的次数
str2 = 'how are you? i am fine! thank you!'
print(str2.count('you')) # 2
print(str2.count('a')) # 3
print(str2.count('you', 0, 15)) # 1
print(str2.count('you', 0, 4)) # 0
4.判断str2是否以str1结尾
str1 = 'you'
str2 = 'how are you'
print(str2[-len(str1):] == str1)
5.字符串查找
"""
字符串1.find(字符串2) - 获取字符串2第一次在字符串1出现的位置(用大于等于0的下标值表示);
字符串2不存在结果是-1
字符串1.index(字符串2) - 获取字符串2第一次在字符串1出现的位置(用大于等于0的下标值表示);
字符串2不存在会报错
"""
str2 = 'how are you? i am fine! thank you!'
print(str2.index('you')) # 8
print(str2.find('you123')) # 8
print(str2.find('you123')) # -1
# print(str2.index('you123')) # ValueError: substring not found
6.join
"""
字符串.join(序列) - 将序列中的元素用字符串连接在一起产生一个新的字符串;
序列中的元素是字符串
"""
str3 = '+'.join('abc')
print(str3) # a+b+c
str4 = ''.join(['name', 'age', 'gender'])
print(str4)
str5 = ''.join({'a': 1, 'b': 1})
print(str5) # ab
7.字符串替换
"""
1) 字符串1.replace(字符串2, 字符串3) -> 将字符串1中所有的字符串2都替换成字符串3
2)
字符串1.maketrans(字符串2,字符串3) -> 创建字符串2和字符串3一一对应的映射表
字符串1.translate(替换的映射表)
"""
str2 = 'how are you? i am fine! thank you!'
new_str2 = str2.replace('you', 'me')
print(new_str2) # how are me? i am fine! thank me!
# 创建映射表
table = str.maketrans('a!', 'b+')
new_str2 = str2.translate(table) # 将字符串str2中所有的a都替换成b, 所有的!都替换成+
print(new_str2)
8.字符串切割
"""
字符串1.split(字符串2) - 将字符串1中所有的字符串2作为切割点切成多分
"""
str2 = 'how are you? i am fine! thank you!'
print(str2.split(' ')) # ['how', 'are', 'you?', 'i', 'am', 'fine!', 'thank', 'you!']
作业
输入一个字符串,打印所有奇数位上的字符(下标是1,3,5,7…位上的字符)
str1 = input('请输入一段话:')
for index in range(len(str1)):
if index % 2 == 0:
continue
print(str1[index])
输入用户名,判断用户名是否合法(用户名长度6~10位)
str1 = input('请输入用户名:')
if len(str1) < 6 or len(str1) > 10:
print('用户名长度6~10位,请重新输入')
else:
print('!!')
输入用户名,判断用户名是否合法(用户名中只能由数字和字母组成) 例如: 'abc' — 合法 '123' — 合法 ‘abc123a’ — 合法
str1 = input('请输入用户名:')
for x in str1:
if not (ord('0') <= ord(x) <= ord('9') or ord('A') <= ord(x) <= ord('Z') or ord('a') <= ord(x) <= ord('z')):
print('用户名不规范,请重新输入')
break
else:
print('!!')
输入用户名,判断用户名是否合法(用户名必须包含且只能包含数字和字母,并且第一个字符必须是大写字母)
例如: 'abc' — 不合法 '123' — 不合法 'abc123' — 不合法 'Abc123ahs' — 合法
str1 = input('请输入用户名:')
if str1.isalnum():
if 'A' <= str1[0] <= 'Z':
if str1.isalpha():
print('您输入的格式不正确,必须包含字母或数字,请重新输入')
else:
print('!!')
else:
print('您输入的格式不正确,第一个字符必须是大写字母,请重新输入')
输入一个字符串,将字符串中所有的数字字符取出来产生一个新的字符串
例如:输入'abc1shj23kls99+2kkk' 输出:'123992'
str1 = 'abc1shj23kls99+2kkk'
list = []
for x in str1:
if '0' <= x <= '9':
list.append(x)
str1_new = ''.join(list)
print(str1_new)
输入一个字符串,将字符串中所有的小写字母变成对应的大写字母输出 (用upper方法和自己写算法两种方式实现)
例如: 输入'a2h2klm12+' 输出 'A2H2KLM12+'
str1 = 'a2h2klmmm12+'
str1_new = 'a2h2klmmm12+'
print(str1.upper())
for x in str1:
if 'a' <= x <= 'z':
str1_new = str1_new.replace(x, chr(ord(x)-32))
print(str1_new)
输入一个小于1000的数字,产生对应的学号
例如: 输入'23',输出'py1901023' 输入'9', 输出'py1901009' 输入'123',输出'py1901123'
str1 = input('请输入一个小于1000的整数:')
str2 = 'py1901'
sch_num = str2 + str1.zfill(3)
print(sch_num)
输入一个字符串,统计字符串中非数字字母的字符的个数
例如: 输入'anc2+93-sj胡说' 输出:4 输入'===' 输出:3
str1 = input('请输入一段字符:')
num = 0
for x in str1:
if 'a' <= x <= 'z' or 'A' <= x <= 'Z' or '0' <= x <= '9':
continue
else:
num += 1
print(num)
输入字符串,将字符串的开头和结尾变成'+',产生一个新的字符串
例如: 输入字符串'abc123', 输出'+bc12+'
str1 = input('请输入一段字符:')
str1_new = str1.center(len(str1)+2, '+')
print(str1_new)
输入字符串,获取字符串的中间字符
例如: 输入'abc1234' 输出:'1' 输入'abc123' 输出'c1'
str1 = input('请输入一段字符:')
if len(str1) % 2 == 0:
str1_new = str1[len(str1)//2-1: len(str1)//2+1]
else:
str1_new = str1[len(str1)//2]
print(str1_new)
写程序实现字符串函数find/index的功能(获取字符串1中字符串2第一次出现的位置)
例如: 字符串1为:how are you? Im fine, Thank you! , 字符串2为:you, 打印8
str1 = '年年岁岁花相似'
str2 = '花'
num = str1.find(str2)
print(num)
num2 = str1.index(str2)
print(num2)
获取两个字符串中公共的字符
例如: 字符串1为:abc123, 字符串2为: huak3 , 打印:公共字符有:a3
str1 = 'abc123'
str2 = 'huak3'
str3 = ''
for x in str1:
if x in str2:
str3 = str3 + x
print(str3)