day9 字符串
1. 字符串
1.1 什么是字符串
字符串是容器型数据类型;将’’、""、’’’’’’、""""""作为容器的标识,里边直接是多个符号,每个符号就是字符串的一个元素:‘元素1元素2元素3…’
字符串不可变(不可增删改);
字符串是有序的(支持下标操作);
元素 - 所有的符号都可以作为字符串的元素;字符串中的元素又叫字符。字符分普通字符和转义字符两种
- python中只有字符,却没有字符对应的类型,与C语言不同
str1 = '上界sgngj,.:[]-*↓↑【】☆'
print(str1)
str2 = ''
str3 = ""
str4 = ''''''
str5 = """"""
print(type(str5), len(str5))
注意:
多行注释的显示颜色与字符串相同,因为多行注释实质是字符串,只有放在特定位置的多行注释才是真正的字符串,内容不符合字符串要求会报错
不在特定位置的多行注释会参与编译,只是不保存它它编译后便会消失。
str1 = """
abc
123
===========
"""
print(str1)
str3 = 'ab\nc'
print(str3)
print('abs' == 'sba')
1.2 字符串中的元素 - 字符
1.2.1 普通字符
普通字符 - 符号在字符串中表示符号本身的字符
1.2.2 转义字符
转义字符 - 在特定符号前加\表示特殊功能或者特殊意义的字符(各语言通用)
\n - 换行
\t - 水平制表符(相当于tab键)
\' - 表示一个普通的单引号
\" - 表示一个普通的双引号
\\ - 表示一个普通的反斜杠
注意:
转义字符的长度为1。
想要实现一般tab键的功能最好采用\t,因为\t的长度为1,而tab键的长度可能不一致。
str1 = 'abc\n123'
print(str1)
str1 = 'abc\t123'
print(str1)
str1 = 'It\'s OK'
print(str1)
str1 = "It's OK"
print(str1)
str1 = "I say, \"good good study.\""
print(str1)
str1 = 'I say, "good good study."'
print(str1)
str1 = 'C:User\\name\小明'
print(str1)
str1 = '\u4e00abc'
print(str1)
1.3 字符编码
- 计算机在存储数据时只能存数字(实质存的是数字对应的二进制的补码)
计算机存储图片,存的是每一个像素点的颜色(RGB值)
计算机存储视频,存的是每一帧图像的每个像素点的颜色(RGB值)
2)为了能够让计算机存储文字,给每个字符对应了一个固定数字,每次在存储这个字符的时候就存储这个字符对应的数字。
每个字符对应的数字就是这个字符的编码值
编码表 - 记录每一字符对应的编码值
1.3.1 常用字符编码
'0' - 48
'A' - 65
'a' - 97
1.4 编码表
编码表 - 记录字符和数字对应关系的表
常用的编码表:ASCII码表、Unicode编码表(Python)
Unicode编码表是ASCII码表的扩展版
1.4.1 ASCII码表
a.只记录了美国的符号(这里没有记录中文)
b.顺序(从前往后):数字字符(‘0’-48)、大写字母(‘A’-65)、小写字母(‘a’-97)。并且三类符号之间不连续。
'0' - 48
'A' - 65
'a' - 97
1.4.2 Unicode编码表
a.是ASCII码表的扩展(包含了ASCII码表),记录了世界上所有国家所有名族所有语言的符号
b.中文范围:4e00 ~ 9fa5 (共20901个)
'\u4e00'
'\u9fa5'
1.5 编码值的使用
1.5.1 chr函数
chr(编码值) - 获取编码值对应的字符
print(chr(97))
print(chr(0x4e00), chr(0x9fa5))
num = 0
for x in range(0x4e00, 0x9fa5+1):
num += 1
print(chr(x), end=' ')
if num == 30:
print()
num = 0
1.5.2 ord函数
ord(字符) - 获取字符编码值
print(ord('婷'))
1.5.3 编码字符
\u四位的16进制编码值
print('a', '\u0061')
print('a\u0061')
c = '看'
if '\u4e00' <= c <= '\u9fa5':
print('中文!')
2. 进制
2.1 十进制
基数:0 ~ 9
表示方法:直接写
转换函数:直接写
num = 1234567890
2.2 二进制
基数:0、1
表示方法:加前缀0b/0B
转换函数:bin(数据)
num = 0b101
print(num)
2.3 八进制
基数:0~7
表示方法:加前缀0o/0O
转换函数:oct(数据)
num = 0o23
print(num)
2.4 十六进制
基数:09,af(A~F)
表示方法:加前缀0x/0X
转换函数:hex(数据)
num = 0xaf2
print(hex(100))
print(bin(100))
print(oct(100))
3. 字符串的相关操作和相关函数
3.1 查
查 - 获取字符
字符串获取字符和列表获取元素的语法一样
str1 = 'how are you? i am fine, and you?'
print(str1[2], str1[-1])
注意:一个转义字符的长度是1
str1 = '\tabc\n123\u6afa'
print(str1[1], str1[-2])
print(str1[1:6])
print(str1[-1:2])
print(str1[1:7:2])
print(str1[-1::-2])
print(str1[2:])
print('-------')
for x in str1:
print(x)
3.2 +、*
1)两个字符串比较大小,比较的是第一对不相等字符的编码值大小
2)两个字符比较大小,比较的是字符的编码值的大小
3)应用:
已知字符X:
判断是否是数字字符:‘0’<= x <= ‘9’
判断是否是小写字母:‘a’<= x <= ‘z’
判断是否是大写字母:‘A’<= x <= ‘Z’
判断是否是字母:‘a’<= x <= ‘z’ or ‘A’<= x <= ‘Z’
判断是否是中文:’\u4e00’ <= x <= ‘\u9fa5’
print('abc' == 'acb')
print('abc' > 'Abc123')
print('你好' > 'hello')
str1 = '-==sh是uM09K你好!'
count = 0
for string in str1:
if '\u4e00' <= string <= '\u9fa5':
count += 1
print('中文出现的次数:', count)
str1 = '234445'
str2 = '122h2333'
for string in str1:
if not '0' <= string <= '9':
print('不是')
break
else:
print('是')
str1 = '-==sh是uM09K你好!'
new_str = ''
for string in str1:
if 'A' <= string <= 'Z':
new_str += string
print(new_str)
3.4 in 和 not in
字符串1 in 字符串2 - 判断字符串1是否是字符串2的子串
print(10 in [10, 20, 30])
print([10, 20] in [10, 20, 30])
print('a' in 'abc123')
print('abc' in 'abc123')
print('ac' in 'abc123')
3.5 相关函数
3.5.1 len(字符串)
注意:一个转义字符长度为1
3.5.2 str(数据)
str(数据) - 将数据转换为字符串(任何数据都能转换为字符串;转换的时候是直接在数据的打印值外边加引号)
x = 23
str(23)
str(12.5)
str(True)
str([10, 20])
str({'a': 18, 'b': 32})
print(str({'a': 18, 'b': 32}))
3.3 比较运算
1)两个字符串比较大小,比较的是第一对不相等字符的编码值大小
2)两个字符比较大小,比较的是字符的编码值的大小
3)应用
已知字符X:
判断是否是数字字符:‘0’<= x <= ‘9’
判断是否是小写字母:‘a’<= x <= ‘z’
判断是否是大写字母:‘A’<= x <= ‘Z’
判断是否是字母:‘a’<= x <= ‘z’ or ‘A’<= x <= ‘Z’
判断是否是中文:’\u4e00’ <= x <= ‘\u9fa5’
print('abc' == 'acb')
print('abc' > 'Abc123')
print('你好' > 'hello')
str1 = '-==sh是uM09K你好!'
count = 0
for string in str1:
if '\u4e00'<= string<='\u9fa5':
count += 1
print('中文出现的次数:', count)
str1 = '234445'
str2 = '122h2333'
for string in str1:
if not '0' <= string <= '9':
print('不是')
break
else:
print('是')
str1 = '-==sh是uM09K你好!'
new_str =''
for string in str1:
if 'A' <= string <= 'Z':
new_str += string
print(new_str)
4. r语法
在字符串的最前面加r或者R,可以让字符串中所有的转义字符的功能消失(每个符号都会变成普通字符)
str1 = r'c:\user\name\test\demo.py'
print(str1)
5. 字符串格式化
name = '小明'
age = 18
message = name + '今年' + str(age) + '岁!'
print(message)
message = '%s今年%d岁!' % (name, age)
print(message)
message = f'{name}今年{age}岁!'
print(message)
5.1 格式字符串
语法:包含格式占位符的字符串 % (数据1, 数据2, …)
格式占位符:(各门语言通用)
- %s - 字符串占位符(python中,%s可以给任何类型的数据占位(任何数据都能转换为字符串),转化时会将数据转换为字符串)
- %d - 整数占位符(如果数据为浮点数,会自动转化为整数)
- %f - 浮点数占位符
- %.Nf - 浮点数保留N位小数
str1 = '%sxxx' % '张三'
print(str1)
str1 = '%s-xxx' % [10, 20]
print(str1)
str1 = '%d-xxx' % 12.5
print(str1)
str1 = '%f - xxx' % 4.34
print(str1)
str1 = '余额:%.2f' % 3241.2345
print(str1)
str1 = '%s今年%d岁,月薪:%.2f元' % (name, age, 1000 + 2000)
print(str1)
5.2 f-string
-
基本用法 语法:f’{任何有结果的表达式}’ - 用表达式的结果来填充{}所在的位置
- ‘{数据}’ - {数据},{}内的数据原样显示
- f’{数据}’ - 将{}内的数据进行替换
name = '小明'
age = 18
str1 = f'{name}xxx{age}xxx{age*10}zzz{name[-1]}'
print(str1)
-
加参数 语法:f’{任何有结果的表达式:参数}’ 参数: .Nf - 保留N位小数。例如:12.32
, - 每三位用逗号隔开。例如:金额:12,345,677
% - 将数据转换为百分比。例如:12%
.N% - 将数据转换为百分比,比值保留N位小数
X > N - 将数据转换为长度为N的字符串,不够在前面用X对应的字符来填充
X > N - 将数据转换为长度为N的字符串,不够在后面用X对应的字符来填充
money = 123456
str1 = f'余额:{money:.2f}'
print(str1)
str1 = f'余额:{money:,}'
print(str1)
rate = 0.5
str1 = f'市值占有率:{rate:%}'
print(str1)
str1 = f'市值占有率:{rate:.2%}'
print(str1)
num = 9
str1 = f'python2000{num:0>3}'
print(str1)
str1 = f'python2000{num:0<3}'
print(str1)
6. 字符串相关方法
菜鸟教程有字符串的全部方法:[https://www.runoob.com/python3/python3-string.html]
6.1 center、rjust、rjust、zfil
字符串.center(长度,填充字符) - ‘abc’.center(7, ‘x’) -> ‘xxabcxx’
字符串.rjust(长度,填充字符) - ‘abc’.rjust(7, ‘x’) -> ‘xxxxabc’
字符串rjust(长度,填充字符) - ‘abc’.ljust(7, ‘x’) -> ‘abcxxxx’
字符串.zfill(长度) == 字符串.rjust(长度,‘0’)- ‘abc’.zjust(7) -> ‘000abc’
其中:
? center 将原字符中间对齐,并使用填充字符将其填充为指定长度
? rjust 将原字符右对齐,并使用填充字符将其填充为指定长度
? ljust 将原字符左对齐,并使用填充字符将其填充为指定长度
? zfill 将原字符右对齐,并使用填充字符0将其填充为指定长度
print('abc'.center(7, 'x'))
print('abc'.zfill(7))
print('abc'.center(6, 'x'))
6.2 count
字符串1.count(字符串2) - 统计字符串1中字符串2出现的次数
字符串1.count(字符串2,开始下标,结束下标) - 在字符串1中[开始下标,结束下标)范围内统计字符串2出现的次数
str1 = 'how are you? i am fine, thank you! and you?'
print(str1.count('you'))
print(str1.count('a', 0, 12))
6.3 find、index
字符串1.find(字符串2) - 获取字符串1中字符串2第一次出现的为位置,范围0开始的下标值(从前往后找);如果不存在返回-1
字符串1.index(字符串2) - 获取字符串1中字符串2第一次出现的为位置,范围0开始的下标值(从前往后找);如果不存在会报错
字符串1.find(字符串2,开始下标,结束下标) - 在字符串1中[开始下标,结束下标)范围内获取字符串2第一次出现的为位置
字符串1.index(字符串2,开始下标,结束下标) - 在字符串1中[开始下标,结束下标)范围内获取字符串2第一次出现的为位置
str1 = 'how are you? i am fine, thank you! and you?'
print(str1.find('you'))
print(str1.index('you'))
print(str1.find('you1'))
print(str1.find('you', 5, 15))
print(str1.index('you', 10, -1))
6.4 rfind、rindex
字符串1.rfind(字符串2) - 获取字符串1中字符串2第一次出现的为位置,范围-1开始的下标值(从后往前找);如果不存在返回-1
字符串1.rindex(字符串2) - 获取字符串1中字符串2第一次出现的为位置,范围-1开始的下标值(从后往前找);如果不存在会报错
字符串1.rfind(字符串2,开始下标,结束下标) - 在字符串1中[开始下标,结束下标)范围内获取字符串2第一次出现的为位置
字符串1.rindex(字符串2,开始下标,结束下标) - 在字符串1中[开始下标,结束下标)范围内获取字符串2第一次出现的为位置
str1 = 'how are you? i am fine, thank you! and you?'
print(str1.rfind('you'))
print(str1.rindex('you'))
6.5 isalnum
字符串.isalnum() - 判断字符串是否只有字母或者数字,是返回
注意:只判断ASCII码内的内容,ASCII外的内容不管
print('ahs234函数')
6.6 isdigit、isnumeric
字符串.isdigit() - 判断是否是纯数字字符串(数字指0~9的数字字符)
字符串.isnumeric() - 判断是否是纯数字字符串(数字指具有数字意义的字符)
print('12345'.isdigit())
print('12345'.isnumeric())
print('12345一二十百千万'.isnumeric())
print('12345壹'.isnumeric())
print('12345①'.isnumeric())
6.7 islower isupper
字符串.islower() - 判断字符串是否是纯小写字母字符串
字符.islower() - 判断字符串是否是纯小写字母字符串
字符串.isupper() - 判断字符串是否是纯大写字母字符串
字符.isupper() - 判断字符串是否是纯大写字母字符串
print('abC'.islower())
print('abC'.isupper())
6.8 join
字符串.join(序列) - 将序列中的元素用指定的字符串拼接成一个新的字符串
注意:
-
序列中的元素必须是字符串,不然会报错 -
如果序列为列表,则列表中的元素必须是字符串才行
result = '+'.join('abc')
print(result)
result = 'and'.join('abc')
print(result)
result = '+'.join(['小明', '张三'])
print(result)
result = ''.join(['小明', '张三'])
print(result)
list1 = ['abc', 100, 12.5, True, 'hello']
str1 = ''.join(str(x) for x in list1)
print(str1)
students = [{'name': '张三', 'age': 18}, {'name': '小明', 'age': 20}, {'name': '小花', 'age': 30}]
result = ','.join(x['name'] for x in students)
print(result)
6.9 lower、upper
字符串.lower() - 转换字符串中的大写字母为小写
字符串.upper() - 转换字符串中的小写字母为大写
6.10 strip.lstrip.rstrip
字符串.strip() - 去除字符串两端的空白字符
字符串.lstrip() - 去除字符串前端(即左端)的空白字符
字符串.lstrip() - 去除字符串后端(即右端)的空白字符
空白字符:空格、tab键、换行
str1 = ' \tabc123 \n'
print(str1)
print(str1.strip())
print(str1.lstrip())
print(str1.rstrip())
6.11 replace
字符串1.replace(字符串2,字符串3) - 将字符串1中所有字符串2替换为字符串3
字符串1.replace(字符串2,字符串3,替换次数N) - 将字符串1中前N个字符串2替换为字符串3
str1 = 'how are you? i am fine, thank you! and you?'
result = str1.replace('you', 'me')
print(result)
result = str1.replace('you', 'me', 2)
print(result)
6.12 maketrans、translate
两者一般成对使用
str.maketrans(字符串1,字符串2) - 创建字符串1和字符串2的字符对应表
注意:字符串1和字符2的长度一致,对应位置上的字符相对应
字符串.translate(表) - 将字符串按照表内的字符替换方式进行替换
str1 = 'how are you? i am fine, thank you! and you?'
table = str.maketrans('ain', '你我他')
result = str1.translate(table)
print(result)
str1 = '123木头人,88'
table = str.maketrans('0123456789', '零一二三四五六七八九')
result = str1.translate(table)
print(result)
6.13 split
字符串1.split(字符串2) - 将字符串1中所有的字符串2作为切割点进行切割,返回一个由切割后的字符段(不包含字符串2,字符段数量一定是切割点的数量加1)组成的列表,列表中各元素为切割后的各字符段
注意:
切割后的字符段数量 = 切割点的数量 + 1
如果切割点在最前面或者最后面或者出现连续切割点,结果会出现空串
str1 = 'how are you? i am fine, thank you! and you?'
str2 = str1.split('you')
print(str2)
str1 = 'abcaanea'
print(str1.split('a'))
|