day 10 字符串
字符编码
1. 字符编码
为了你能够让计算机存储文字符号,每个符号对应了一个固定的数字,每次在需要存储这个符号时,就去存储这个固定的数字。
每个对应的那个数字就是这个符号的编码值。
2. 编码表
1)ASCII码表
美国信息码(只保存了美国人常用的符号,总共128个)
数字字符
大写字母(A 为 65)
小写字母(a 为 97)
英文输入法下的特殊符号
码:48 — > 57 65 ----> 90 97 ----> 122
代表:0 ----> 9 A -----> Z a ----> z
2)Unicode编码表(Python) — 现阶段普遍使用的
又叫统一码、万国码,
a. 是在包含ASCII码的情况下扩展的,故A、a、0~9的编码值都没有变,和ASCII码相同
即是前128个字符就是ASCII码表中的内容。
它包含了世界上所有国家所有民族的所有语言符号
b. 其中中文编码范围:4e00 ~ 9fa5 (十六进制)
3. 编码表的使用
1). chr(编码值) — 获取编码值对应的字符
print(chr(97))
# a
-
获取中文字符(python中十六进制需要在编码值前 加 0x)
中文字符的编码值是十六进制的,4e00 ~ 9fa5
# 中文字符第一个: print(chr(0x4e00)) # 一 # 最后一个中文字符 print(chr(0x9fa5)) # 龥
可以导入pypinyin库,对中文字符注音
from pypinyin import pinyin print(pinyin('龥')) # [['yù']]
获取所有的中文字符
for i in range(0x4e00, 0x9fa5+1):
print(chr(i),pinyin(chr(i)),end=' ')
2). ord(字符) — 获取字符的编码值
注意:字符指的是长度为1的字符串,返回的编码值为十进制的
应用
m ----> M : 把小写字母变成大写
char=chr(ord('m')-32)
print(char) # M
大写字母变为小写字母 +32即可
char3 = chr(ord('H')+32)
print(char3)
3). 编码字符:\u4位16进制的编码值
在字符串中提供字符的方式有两种:a.直接提供字符 b. 使用编码字符
hex(10进制数字) — 将10进制数字转换为16进制,不满四位的在前面补0
str1 = 'a'
str2 = '\u0061\u9fa5'
print(str2)
# 如果知道字符编码值是多少,但不知道字符是什么的时候,就可以使用编码字符来表示这个字符
char = '块'
if '\u4e00' <= char <= '\u9fa5':
print(char, '是中文字符')
else:
print(char, '不是中文字符')
4. 字符查
字符串获取字符的方法和列表获取元素的方法一样
-
获取单个元素
字符串[下标]
**注意:字符串中转义字符的长度是1,例如\t、\n、\u9fa5长度都是1
str1 = '\thello \nworld\u9fa5!' print(str1[-2]) # 龥 print(str1[1]) # h
-
字符串切片
和列表切片相同
str2 = 'good good study' print(str2[1:-2:2]) # odgo t
-
遍历字符串
# 依次取到每个字符 for i in str2: print(i) for index in range(len(str1)): print(index, str1[index]) str3 = '竹杖芒鞋轻声马,归去,也无风雨也无晴🌤!' for index, item in enumerate(str3): printpython print(index*item)
5. 字符串相关操作
-
加法运算 — 将两个字符串合并为一个字符串
字符串1+字符串2
应用:提取指定类字符、插入指定字符、删改某些字符
# 案例1:提取字符串中所有的数字字符 str1 = '世界上788睡觉觉啊098kkk' str2 = '' for i in str1: if '0' <= i <= '9': str2 += i print(str2)
# 案例2:在字符串每一个数字后面插入一个百分号 str1 = '世界上788睡觉觉啊098kkk' str2 = '' for i in str1: if '0' <= i <= '9': str2 += i + '%' else: str2 += i print(str2)
# 练习:将字符串中所有数字字符改成‘+’ str1 = '世界上788睡觉觉啊098kkk' str2 = '' for i in str1: if '0' <= i <= '9': str2 += '+' else: str2 += i print(str2)
-
乘法运算
# 字符串 * N、N* 字符串 --- 让字符串中元素重复产生一个新的字符串 str1 = 'a'*3 print(str1)
-
字符串比较运算
-
比较是否相等: == 、!=(顺序影响结果)
print('abc' == 'bac') # False
-
比较大小
两个字符串比较大小,比较的是第一对不相等的元素的大小
判断字符的性质:
判断是否是数字字符:‘0’ <= x <= ‘9’
判断是否是小写字母:‘a’ <= x <= ‘z’
判断是否是大写字母:‘A’ <= x <= ‘Z’
判断是否是字母:‘a’ <= x <= ‘z’ or ‘A’ <= x <= ‘Z’
判断是否是中文:‘一’ <= x <= ‘\u9fa5’ (‘一’也可以换为’\u4e00’)两个字符比较大小是比较两个字符的编码值的大小
数字 < 大写字母 < 小写字母 < 中文print('abc' > 'bcc')
-
-
in 和 not in
# 字符串1 in 字符串2 --- 字符串1是否是字符串2的子串(字符串2是否包含字符串1) print('a' in 'abc') # True print('ab' in 'abc') # True print('ac' in 'abc') # False
-
相关函数
-
sum 求和函数不支持
-
max 、 min 、 sorted支持
-
len(字符串)
-
转换类型为字符串
str(数据) — 任何数据类型都可以转换为字符串
转换时在数据打印值外面加引号
list1 = [10, 20, 30] # '[10, 20, 30]' print(str(list1)) # 对于不标准的数据(没有空格、用的单引号),转换时即是在打印值外加引号 list1 = [10,20,30] # '[10, 20, 30]' 打印时会有空格 print(str(list1)) list1 = ["天线宝宝",3] print(str(list1)) # "['天线宝宝', 3]" # 打印时会有空格,双引号会变为单引号
-
eval(字符串)
去掉字符串的引号,获取引号中表达式的结果
a = eval('100') print(a, type(a)) # 100 <class 'int'>
# b = eval('abc') # 若去掉引号后字符不合法如abc 则会报错 # 此时需要在其前面加一条语句:abc = 100 就不会报错 abc = 100 b = eval('abc')
可以得到代码,也可以执行代码
m = int(input('请输入数据m:')) n = int(input('请输入数据n:')) value = input('请选择运算符:(+、-、*、/)') result = eval(f'm{value}n') # 此处也可以用拼接:result = eval('m' + value + 'n') print(result)
-
6. 字符串相关方法
-
连接字符串的符号.join(序列) ---- 将序列中元素用指定的字符串连接成一个新的字符串(序列中元素必须都是字符串)
list1 = ['花花', '小马', '小明'] result = ' and '.join(list1) print(result) # 花花 and 小马 and 小明 result = '**'.join('abc') print(result) # a**b**c
案例:
nums = [90, 78, 67, 45, 23] # 需求: 想要得到:'90 + 78 + 67 + 45 + 23' nums_s = [] for i in nums: nums_s.append(str(i)) result = ' + '.join(nums_s) print(result) # 法2: 列表推导式 result = ' + '.join([str(i) for i in nums]) print(result, end=' = ') print(eval(result))
-
字符串.count(字符串2) — 统计字符串1中字符串2的个数
msg = 'how are you? i am fine! thank you, and you?' result = msg.count('a') print(result) # 4
-
字符串.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 ', '?'] # 切割点会消失,不会保留在切割后的结果中 date = '2020/6/5' result = date.split('/') print(result) # ['2020', '6', '5'] msg = 'how are you? i am fine! thank you, and you?' result = msg.split('you', 1) print(result) # ['how are ', '? i am fine! thank you, and you?']
-
-
字符串1.replace(字符串2,字符串3)
1)字符串1.replace(字符串2,字符串3) – 将字符串1中所有的字符串2都替换成字符串3
2) 字符串1.replace(字符串2,字符串3,N) – 将字符串1中前N个字符串2都替换成字符串3msg = 'how are you? i am fine! thank you, and you?' result = msg.replace('you', '') print(result) # how are ? i am fine! thank , and ? # 替换为空串效果即是删除了'you'
-
字符串.strip() — 将字符串前后两边的空白去掉。空白包括空格、换行、缩进
str1 = ' "how are you?" ' result = str1.strip() print(result) # "how are you?" str2 = '//小明/' print(str2.strip('/')) # 小明
-
-
字符串.isupper() – 判断字符串是否是纯大写字母字符串
字符.isupper() – 判断字符是否是大写字母 -
字符串.islower() — 判断字符串(或字符)是否是纯大写字母字符串
-
字符串.isdigit() — 判断字符或字符串是否是全是数字字符
-
字符串.upper() — 将字符串中所有小写字母转换为大写字母
字符.upper() -
字符串.lower — 将字符串中所有大写字母转换为小写字母
字符.lower()# 判断char是否是字母 char = '2' if char.islower() or char.isupper(): print('是字母') else: print('不是字母') if 'a' <= char <= 'z' or 'A' <= char <='Z': print('是字母') else: print('不是字母')
7. 格式字符串
str1 = 'hello world!'
# 解决的问题:字符串内容不确定
name = input('请输入学生的名字:')
age = int(input('请输入学生的年龄:'))
money = float(input('请输入薪资:'))
# 输出:xxx今年XXX岁!薪资XXX元!
- 字符串拼接:
msg = name + '今年' + str(age) + '岁!' + '薪资' + str(money) + '元!'
print(msg)
-
格式字符串 – 包含格式占位符的字符串
1)语法:包含格式占位符的字符串% (数据1,数据2, 数据3,……)
2)注意:()中的数据必须和前面字符串中的占位符一一对应
3)常见的格式占位符:
%s — 可以给任何类型的数据占位,列表、字符串、数字……都可以
%d —(整数占位符) 可以给任何数字也只能给数字占位,但如果给的是小数会自动转换为整型
%f —(浮点占位符) 可以给任何数字也只能给数字占位,若给的是整数,会转换为小数,且不论给什么数字都会保存六位小数
%.Nf – 控制保留N位小数,默认是保留六位小数
msg = '%s今年%s岁,月薪:%s元!' % (name, age, money)
print(msg)
msg2 = '%s今年%d岁,月薪%.2f元!' % (name, age, money)
print(msg2)
-
f-string
在字符串的最前面(引号的前面)加f,就可以在字符串中通过{表达式}中表达式的结果来给字符串提供内容
msg = f'{name}今年{age}岁!月薪:{money}元!' print(msg) a = 12.347 b = 2.798 print(f'{a} + {b} = {a+b}') # 100 + 20 = 120 # {表达式:.Nf} --- 控制保留N位小数。整数则是:.0f print(f'{a:.2f} + {b:.2f} = {a+b:.0f}') # {表达式:.N%} --- 控制数字显示为百分比,N为百分比数字的小数位数,若不写N,则默认六位小数。 c = 0.98 print(f'及格率:{c:.0%}') # 及格率:98% # {表达式:,.Nf} --- 标准的金额拼接,逗号表将数字三位三位的隔开 # 银行显示:357800 --> ¥357,800,00 d = 357800 print(f'¥{d:,.2f}') # ¥357,800.00