字符串
1.字符串
1.1 什么是字符串(str)
-
字符串是容器型数据类型(能同时保存多个文字符号);将单引号、双引号或者三个单引号或者三个双引号作为容器标志;
-
字符串不可变;字符串有序
-
字符串的元素:
a. 字符串引号没一个独立的符号都是字符串的元素,字符串的元素又叫字符;
b. 任何文字字符都开始独立的字符串元素(摆阔英文符号、中文符号、阿拉伯数字、汉语、日语、 …、表情符号等)
str1 = '小明'
str2 = "小明"
str3 = '''小明'''
str4 = """小明"""
msg = '床前明月光,' \
'凝视地上霜'
msg1 = '床前明月光,\n凝视地上霜'
msg2 = '''床前明月光,
凝视地上霜。'''
print(msg)
print(msg2)
print(msg1)
1)空串 - 引号中没有任何符号的字符串(引号中有空格的时候不是空串)
str6 = ''
print(type(str6), len(str6)) # <class 'str'> 0
1.2 字符 - 字符串没一个独立的符号(字符串的元素)
字符串中的字符分为两种:普通字符、转义字符
1)普通字符 - 在字符串中表示符号本身的字符就是普通字符串
2)转义字符 - 在字符串中有特殊意义或者特殊功能的符号就是转义字符;(在特定符号前加 \ 来表示特殊意义或者特殊功能)
\n - 换行
\t - 水平制表符(相当于tab键)
\' - 表示一个普通的单引号
\" - 表示一个普通的双引号
\\ - 表示一个普通的反斜杠
str1 = 'avf你好123!'
print(str1) # avf你好123!
# 并不是所有符号前加\搜会变成转义字符
str2 = '\m\h'
print(str2) # \m\h
str2 = '\tabc\n123'
print(str2)
# 表示 it's ok!
str3 = 'it\'s ok!'
str4 = "it's ok!"
print(str3, str4)
# 表示 I say "good good study!"
str5 = 'I say "good good study!"'
str6 = "I say \"good good study!\""
print(str6)
# 表示abc\n123
str7 = 'abcn123' # abcn123
str8 = 'abc\n123' # 会换行
str9 = 'abc\\n123'
print(str9) # abc\n123
path = 'E:\name\python\text\b.txt'
print(path) # ame\python ex.txt
path1 = 'E:\\name\\python\\text\\b.txt'
print(path1) # E:\name\python\text\b.txt
1.3 r字符串
- 在字符串的引号前面加 r 或者 R,可以让字符串中所有的字符功能消失(让所有字符串都变成普通字符串)
str1 = r'\tab\n123'
print(str1) # \tab\n123
path = R'E:\name\python\text\b.txt'
print(path) # E:\name\python\text\b.txt
2. 字符编码
计算机存储只能存储数字(存的数字是二进制补码)
2.1 字符编码
为了能够让计算机存储文字符号,给每一个符号对应了一个固定数字,每次在需要存储这个符号的时候,就去存储这个固定数字。
每个对应的那个数字就是这个符号的编码值。
2.2 编码表 - 保存字符和字符对应的编码表
1)ASCII码表
美国信息码。(只包含了美国人常用的符号,共128个)
a. 数字字符
b. 大写字母(A - 65)
c. 小写字母(a - 97)
d. 英文输入法下的特殊符号
2)Unicodde编码表(python) - 包含了世界上多有国家所有民族所有语言符号
- Unicode编码表包含了ASCII(前128个字符就是ASCII表的内容)
- 中文编码范围:4e00 - 9fa5(16进制)
2.3 编码值的使用
1)chr(编码值) - 获取编码值对应的字符
print(chr(97)) # a
print(chr(0x4e00)) # 一
print(chr(0x9af5)) # 髵
from pypinyin import pinyin
for x in range(0x4e00, 0x9fa5+1):
print(chr(x), pinyin(chr(x)), end=' ')
2)ord() - 获取指定字符对应的编码值
- 注意:字符指的是长度为1的字符串
print(ord('a')) # 97
print(ord('A')) # 65
print(ord('余')) # 20313
print(ord('1')) # 49
案例:大小写字母转换
char = 'm'
print(chr(ord(char) - 32)) # M
print(chr(ord('G') + 32)) # g
3)编码字符:\u4位的16进制编码值
-
hex(x进制) - 获取指定数字对应的16进制表示方法
-
在字符串中提供字符的方式有两种:
-
直接提供字符
str1 = 'ab你好' print(hex(97)) # 0x61
-
使用编码字符
如果知道字符的编码值是多少,但是不知道字符是什么的时候,就可以使用编码字符来表示这个字符
str2 = '\u0061' print(str2) # a
# 判断是否是中文字符 char = '数' if '一' <= char <= '\u9af5': print(char, '是中文字符') else: print(char, '不是中文字符')
-
3. 字符串的操作
- 字符串获取字符的方法和列表获取元素的方法一样
3.1 获取单个字符
-
字符串[下标]
-
注意:转义字符的长度是1
str1 = '\thello\nwprld!\u9fa5'
print(str1[5]) # o
print(str1[-1]) # 龥
print(len(str1)) # 14
3.2 字符串切片
- 字符串[开始下标:结束下标:步长]
str1 = 'good good study!'
print(str1[1:-2:2]) # 'odgo td'
print(str1[-3:]) # 'dy!'
3.3 遍历字符串
for x in str1:
print(x)
print('------------------------------华丽分割线-----------------------------')
for index in range(len(str1)):
print(index, str1[index])
print('------------------------------华丽分割线-----------------------------')
for index, item in enumerate(str1):
print(index, item)
4. 字符串相关操作
4.1 字符串加法运算 - 字符串拼接
- 字符串1 + 字符串2 - 将两个字符串合并成一个字符串
str1 = 'hello'
str2 = '你好'
print(str1 + str2) # hello你好
print(str1 + ' ' + str2) # hello 你好
# 案例1: 提取字符串中所有的数字字符
str1 = '时候速度903u48vog;e=-e5!'
new_str = ''
for x in str1:
if '0' <= x <= '9':
new_str += x
print(new_str) # 903485
# 案例2: 在每一个数字后面加一个%
str1 = '时候速度903u48vog;e=-e5!'
new_str = ''
for x in str1:
if not '0' <= x <= '9':
new_str += x
else:
new_str += x
new_str += '%'
print(new_str) # 时候速度9%0%3%u4%8%vog;e=-e5%!
# 练习: 将字符串中所有数字字符都改成‘+’
str1 = '时候速度903u48vog;e=-e5!'
new_str = ''
for x in str1:
if not '0' <= x <= '9':
new_str += x
else:
new_str += '+'
print(new_str) # 时候速度+++u++vog;e=-e+!
4.2 字符串乘法运算
- 字符串 * N、N * 字符串 - 让字符串中的元素重复N次产生一个新的字符串
str1 = 'a' * 5
print(str1) # aaaaa
str2 = '你好!' * 2
print(str2) # 你好!你好!
4.3 字符串比较运算
1)比较运算符: ==、!=
print('abc' == 'bac') # False
2)比较大小
- 两个字符串比较大小,比较大时第一对不相等的字符的编码大小
判断字符的性质:
- 是否是数字字符:‘0’ <= x <= ‘9’
- 判断是否是小写字母:‘a’ <= x <= ‘z’
- 判断是否是大写字母:‘A’ <= x <= ‘Z’
- 判断是否是字母:‘a’ <= x <= ‘z’ or ‘A’ <= x <= ‘Z’
- 是否是中文汉子:‘一’ <= x <= ‘\u9fa5’
print('abc' > 'aac') # True
print('a1mn' > 'abmn') # False
print('a你好' > 'abc') # True
4.4 in 和 not in
- 字符串1 in 字符串2 - 字符串1是否是字符串2的字串(字符串2是都包含字符串2)
print('a' in 'abc') # True
print('ab' in 'abc') # True
print('ac' in 'abc') # False
4.5 相关函数
1)max、min、sorted
print(max('hello world')) # w
print(sorted('hello world')) # [' ', 'd', 'e', 'h', 'l', 'l', 'l', 'o', 'o', 'r', 'w']
2)len(字符串)
msg = 'hello world!'
print(len(msg)) # 12
msg1 = '\thello\nworld!\u4e00'
print(len(msg1)) # 14
3)str(数据) - 任何类型数据都可以转换乘字符串;转换到时候是在数据的打印值外面加引号
str(122) # '122'
str(1.23) # '1.23'
str(True) # 'True'
list1 = ["小明",18,'男']
str(list1) # "['小明', 18, '男']"
4)eval(字符串) - 去掉字符串的引号获取引号中表达式的结果
eval('100') # 100
eval('1.23') # 1.23
# eval('abc') # 去掉引号的abc不合规,会报错
# 但可以提前定义abc
abc = 100
eval('abc')
eval('"hello"') # "hello"
b1 = eval('10 + 20') # 30
a = int(input('输入a:'))
b = int(input('输入b:'))
value = input('选择运算符(+、-、*、/):')
result = eval('a'+ value + 'b')
print(result)
5. 字符串相关方法
字符串.xxx()
5.1字符串.join(序列)
- 将序列中的元素用指定字符串连接成一个新的字符串(序列中的元素必须全市字符串)
list1 = ['小明', '张三', '李四', '王五']
result = '+'.join(list1)
print(result) # 小明+张三+李四+王五
result = ' and '.join(list1)
print(result) # 小明 and 张三 and 李四 and 王五
result = '**'.join('abc')
print(result) # a**b**c
nums = [90, 98, 78, 86]
# '90'+'98'+'78'+'86'
result = '+'.join([str(x) for x in nums])
print(result)
5.2 字符串1.count(字符串2)
- 统计字符串1中字符串2的个数
# 统计you出现次数
msg = 'how are you? i am fine! thank you, and you?'
result = msg.count('you')
print(result) # 3
result = msg.count('a')
print(result) # 3
5.3 字符串.split()
- 字符串1.split(字符串2) - 将字符串1中所有的字符串2作为切割垫对字符串1进行切割
- 字符串1.split(字符串2, N) - 将字符串1中前N个字符串2作为切割垫对字符串1进行切割
msg = 'how are you? i am fine! thank you, and you?'
result = msg.split('you')
print(result) # ['how are ', '? i am fine! thank ', ', and ', '?']
result = msg.split(' ')
print(result) # ['how', 'are', 'you?', 'i', 'am', 'fine!', 'thank', 'you,', 'and', 'you?']
result = msg.split(' ', 3)
print(result) # ['how', 'are', 'you?', 'i am fine! thank you, and you?']
5.4 字符串.replace()
- 字符串1.replace(字符串2, 字符串3) - 将字符串1中所有的字符串2都替换成字符串3
- 字符串1.replace(字符串2, 字符串3, N) - 将字符串1中前N个字符串2都替换成字符串3
msg = 'how are you? i am fine! thank you, and you?'
result = msg.replace('you', 'xx')
print(result) # how are xx? i am fine! thank xx, and xx?
result = msg.replace('you', '', 2)
print(result) # how are ? i am fine! thank , and you?
5.5 字符串.strip() - 去掉字符串前后空白字符
msg = ' how are you? i am fine! thank you, and you? '
result = msg.strip()
print(msg)
print(result)
msg = '/小//明//'
result = msg.strip('/')
print(result) # 小//明
5.6 字符串.isupper()
- 字符串.isupper() - 判断字符串是否是纯大写字母字符串
- 字符.isupper() - 判断字符是否是纯大写字母字符串
print('HOAN'.isupper()) # True
print('D'.isupper()) # True
print('d'.isupper()) # False
5.7 字符串.islower()
- 判断字符串是否是纯小写字母字符串
print('ibsbdbv'.islower()) # False
5.8 字符串.isdigit()
- 判断字符串是否是全是数字字符
print('9039'.isdigit()) # True
5.9 字符串.upper()
- 将小写字母转化为大写字母
print('diob奇偶比是894jd'.upper()) # DIOB奇偶比是894JD
print('m'.upper()) # M
5.10 字符串.lower()
- 将大写字母转化为小写字母
print('J'.lower()) # j
print('HO78fi'.lower()) # ho78fi
6. 格式字符串
解决问题:字符串内容不确定
name = input('请输入姓名:')
age = int(input('请输入年龄:'))
money = float(input('输入月薪:'))
6.1 字符串拼接
msg = '今年' + name + str(age) + '岁,月薪:' + str(money) + '元!'
print(msg)
6.2 格式字符串 - 包含格式占位符的字符串
1)语法:包含格式占位符的字符串 % (数据, 数据2, 数据3, …)
2)注意:后面括号中数据必须和前面字符串中占位符一一对应
3)常见格式占位符:
%s - 可以给任何类型数据占位
%d - 可以给任何数字占位(整数占位符,如果给的是小数,会自动转换成整数再拼接上去)
%f - 可以给任何数字占位(浮点数占位符,且保留6位小数)
%.Nf - 控制保留N位小数
msg = '%s今年%s岁,月薪;%.2f元!' % (name, age, money)
print(msg)
result = 'x: %s%s' % (10.2, 'm')
print(result) # x: 10.2df
result = 'x: %d' % 10.2
print(result) # x: 10
result = 'x: %.2f' % 10.7777
print(result) # x: 10.78
6.3 f-string
- 在字符串的最前面(引号的前面)加f,就可以在字符串中通过{表达式}中表达式的结果来给字符串提供内容
msg = f'{name}今年{age}岁,月薪:{money}元!'
print(msg) # 张三今年22岁,月薪:10000元!
1){表达式.Nf} - 控制保留N位小数
a = 100.345
b = 20.76
# 'xxx + xx = xxx'
print(f'{a} + {b} = {a+b}') # 100.345 + 20.76 = 121.105
print(f'{a:.0f} + {b:.2f} = {a+b:.2f}') # 100 + 20.76 = 121.11
2){表达式.N%} - 控制数字显示成百分比,N控制百分比学校数位数
c = 0.98
print(f'及格率:{c:.2%}') # 及格率:98.00%
3){表达式:.Nf} - 标准金额拼接
# 236800 --> ¥236,800.00
d = 236860067800
print(f'余额:¥{d:,.2f}')
4)在表达式前后填充指定字符
{表达式:符号>N}、{表达式:符号<N}、{表达式:符号^N}
x = 'abc'
result = f'{x:0>7}'
print(result) # 0000abc
result = f'{x:0<7}'
print(result) # abc0000
result = f'{x:0^7}'
print(result) # 00abc00
result = f'{x:^7}'
print(result) # abc