字符串和字符
1.什么是字符串(str)
字符串是容器型数据类型,将''/""/""""""作为容器标志、容器中元素全是字符
不可变(不支持增删改)、有序(支持下标操作)
str1 = 'hello'
str2 = "你好"
str3 = '''thanks'''
str4 = """谢谢"""
2.字符串中的元素 - 字符
python中只有字符的概念,没有对应的数据类型。引号中只有一个元素的字符串可以看成一个字符
字符串又叫字符集
1)字符串中的字符 - 原则上任何可以通过键盘输入或者从其他地方复制粘贴的所有符号都可以作为字符
"""
a.普通字符:在字符串中能够代表符号本身的字符(没特殊意义,没功能的符号)
b.转义字符:在字符串中有特殊意义和特殊功能的符号的组合,一般以\开头
\n - 换行
\' \" - 表示’或”本身
\t - 表示一个缩进(tab)
\\ - 表示一个\
注意:所有转义字符的长度都是1
c.编码字符
"""
2)阻止转义:在字符串的最前面加r/R可以让字符串所有转义字符都失效
# \u四位的16进制数 - 编码字符(获取4位16进制数作为编码值对应的字符)
str1 = 'abc\n123'
print(str1)
str2 = 'abc\'1\"23'
print(str2)
str3 = '\tabc'
print(str3)
str4 = 'abc\\123'
print(str4)
str5 = 'abc\u4eba'
print(str5)
str6 = r'\tabc\n\'123'
print(str6)
3.字符编码
计算机不能直接存储字符(符号),只能存数字;
为了能存储字符,把每个字符都关联一个固定数字(编码)
字符和数字对应的关系就是编码表:ASCII码表,Unicode编码表(python)
1)ASCII码表 - 在计算机中采用一个字节保存一个字符(总共128个字符),字符包含了所有字母、数字和美国常用符号
0~9:编码值从48开始依次增加
大写字母编码值<小写字母编码值
大写字母和小写字母不是紧挨着
2)Unicode编码表是ASCII码表的扩展,包含了世界上所有的国、所有的语言对应的符号(总共65536个符号)
ASCII码表:0~127
中文编码范围:0x4e00~0x9fa5
1.编码字符:\u4位16进制编码值
str1 = 'abc\u50aa'
print(str1)
2.chr(编码值) - 获取编码值对应的字符
print(chr(97))
3.ord(字符) - 获取指定字符对应的编码值
print(hex(ord('雷')))
print(hex(ord('军')))
字符串操作
1.查 - 获取字符(和列表获取元素的方式一样)
1)获取单个字符:字符串[下标]
2)切片:字符串[开始下标:结束下标:步长]
3)遍历:直接遍历元素、通过下标遍历
# 注意:一个空格是一个字符;一个缩进4个空格4个字符;\t对应一个字符
str1 = '\thello python!'
print(str1[-2]) # n
print(str1[2]) # e
print(str1[2:]) # ello python!
# 遍历每个元素
for x in str1:
print('x:', x)
print('========================')
# 遍历每个元素,返回下标和元素
for x, y in enumerate(str1):
print(x, y)
2.相关操作
1)运算符:
a.+,*
str1 = 'abc'
str2 = '123'
print(str1+' '+str2) # abc 123
print(str1 * 3) # abcabcabc
b.==,!=,is
print('abc' == 'abc') # True
print('abc' == 'acb') # False
符号:>,<,>=,<=
字符串1 > 字符串2
字符串比较大小比较的是字符串编码值的大小
"""
判断字符是否是小写字母: 'a' <= char <= 'z'
判断字符是否是小写字母: 'A' <= char <= 'Z'
判断字符是否是字母:'A' <= char <= 'Z' or 'a' <= char <= 'z'
判断字符是否是中文: '\u4e00' <= char <= '\u9fa5'
判断字符是否是数字: '0' <= char <= '9'
"""
print('abcdef' > 'bc') # False
print('Z' < 'a') # True
练习:输入一个字符串,判断这个字符串是否全是中文
str1 = input('请输入字符串:')
for i in str1:
if not '\u4e00' <= i <= '\u9fa5':
print('不是中文')
break
else:
print('是中文')
in / not in
字符串1 in 字符串2 -> 判断字符串2中是否包含字符串1
3)相关函数:len,str,sorted,reversed
a.len(字符串)
print(len('\taaa1 2\n33')) # 10 转义字符和空格算一个字符
b.str(数据) - 所有数据都可以转换成字符串;直接将数据的打印值加引号
a = 100
str(a) # '100'
str(True) # 'True'
list1 = [10, 20, 30]
str4 = str(list1) # '[10, 20, 30]'
print(len(str4), str4[0]) # 12 [
c.sorted(字符串) - 按编码从小到大排列
str5 = 'python'
list2 = sorted(str5)
print(list2) # ['h', 'n', 'o', 'p', 't', 'y']
格式字符串
1.格式占位符
"""
a.语法: 包含格式占位符的字符串 % (值1,值2,值3...)
b.说明:
格式占位符 - 格式占位符有哪些是固定的,使用的时候和字符串中变化的数据类型相关
%s - 字符串(任何类型都可以使用%s占位)
%d - 整数
%-Nd - 整数;N约束数字最后的长度,如果不够后面空格填充
%Nd 前面空格填充
%f - 浮点数;小数点后面保留6位小数
%.Nf - 浮点数;小数点后面保留N位小数(四舍五入)
%c - 单个字符或数字,如果为数字为编码值可以自动转换
% - 固定写法
() - 固定写法;如果值的个数是1可以省略
值 - 任何有结果的表达式;值得个数和类型和前面占位符的个数以及类型保持一致
"""
name = '雷军'
age = 18
num1 = 1.257
print('我是%s,今年%-4d岁!' % (name, age)) # 我是雷军,今年18 岁!
print('我是%s,但被约束成%.2f了' % (num1, num1)) # 我是1.257,但被约束成1.26了
print('%c,%c' % ('z', 97))
2.format
一个带有{}的字符串.format(值1,值2,值3...)
# 用法1:让空的{}个数和format中值的个数保持一致
print('我是{},今年{}岁'.format('雷军', 34)) # 我是雷军,今年34岁
# 用法2:{N} - N从0开始依次增加,分别表示format中第0个值,第1个值...
print('我是{0},年龄是{1},今年{1}岁'.format('雷军', 34)) # 我是雷军,年龄是34,今年34岁
print('{1},{0},{1}'.format(10, 20)) # 20,10,20
# 用法3:{key}
# '{key1},{key2}'.format(key1=值1, key2=值2)
print('{name},{age}'.format(name='雷军', age=18)) # 雷军,18
# 用法4:用列表元素给占位符赋值
list1 = [10, 20, 30, 40]
print('{0[2]},{0[0]},{0[1]}'.format(list1)) # 30,10,20
print('{1[1]},{1[2]},{0}'.format('雷军', list1)) # 20,30,雷军
# 用法5:用字典的值给占位符赋值
student = {'name': '小明', 'age': 18, 'id': '001', 'score': 100}
print('{name}今年{age}岁,学号:{id},考了{score}'.format(**student)) # 小明今年18岁,学号:001,考了100
# format(**student) --> format(name='小明',age=18,id='001',score=100)
# 其他方法:
print('圆周率:{:.2f}'.format(3.141592653)) # 圆周率:3.14 约束小数点位数
print('整数:{:S>4d}B'.format(25)) # 整数:SS25B
print('整数:{:S<4d}B'.format(25)) # 整数:25SSB
print('整数:{:+>4d}B'.format(25)) # 整数:++25B
字符串相关方法
1.字符串.capitalize() -将字符串的首字母变成大写
print('python'.capitalize()) # Python
# 97-65 == 32; 98-66 == 32
char = 'j'
print(chr(ord(char) - 32)) # J 小写转大写
2.center/ljust/rjust/zfill
"""
字符串.center(宽度,填充字符)
字符串.ljust(宽度,填充字符)
字符串.rjust(宽度,填充字符)
字符串.zfill(宽度) == 字符串.rjust(宽度,'0')
"""
print('abc'.center(7, 'X')) # XXabcXX
print('abc'.ljust(7, 'X')) # abcXXXX
print('abc'.rjust(7, 'X')) # XXXXabc
print('abc'.zfill(7)) # 0000abc
3.count()
# 字符串1.count(字符串2) - 统计字符串2在字符串1中出现了多少次
str2 = 'hello python!'
print(str2.count('o')) # 2
print(str2.count('th')) # 1
4.字符串查找
字符串1.find(字符串2) - 获取字符串2第一次出现在字符串1中的位置,没有不会报错
字符串1.index(字符串2) 跟上面一样,但没有会报错
5.join
"""
字符串.join(序列) - 将序列中的元素与字符串拼接在一起,产生新的字符串
序列中的元素必须是字符串
"""
str3 = '+'.join('雷军牛逼') # 雷+军+牛+逼
print(str3)
6.字符串替换
"""
1)字符串1.replace(字符串2,字符串3) -> 将1中2替换成3,产生新的
2)
字符串1.maketrans(字符串1,字符串2) -> 创建字符串和字符串3一一对应的映射表
字符串1.translate(替换映射表)
"""
str4 = 'how are you? I am fine 3Q!'
print(str4.replace('a', 'what')) # how whatre you? I whatm fine 3Q!
table = str.maketrans('a!', 'b+') # 将字符串4中的a变成b,!变成+
new_str4 = str4.translate(table)
print(new_str4) # how bre you? I bm fine 3Q+
7.字符串切割
"""
字符串1.split(字符串2) - 将字符串1中所有字符串2作为切割点切成多份
"""
str5 = 'how are you? I am fine 3Q!'
print(str5.split(' ')) # ['how', 'are', 'you?', 'I', 'am', 'fine', '3Q!']