字符串
计算机基础
进制 : 2进制、 8进制、 10进制、 16进制
# 1) 10进制
"""
基数:0、1、2、3、4、5、6、7、8、9
进位:逢10进1
位权:10**(N-1) 123 = 1*100 + 2*10 + 3*1
表示方式:直接写
"""
# 2) 2进制
"""
基数:0、1
进位:逢2进1
位权:2**(N-1) 110 = 0*2**0 + 1*2**1 + 1*2**2 = 6
表示方式:0b、0B
"""
# 3) 8进制
"""
基数:0、1、2、3、4、5、6、7
进位:逢8进1
位权:8**(N-1)
表示方式:前缀0o、0O
"""
# 4) 16进制
"""
基数:0、1、2、3、4、5、6、7、8、9、a/A、b/B、c/C、d/D、e/E、f/F
进位:逢16进1
位权:16**(N-1) 1f -> f*16**0 + 1*16**1 = f + 16 = 31
表示方式:前缀0x、0X
"""
字符串和字符
# 1.什么是字符串(str)
"""
字符串是容器型数据类型(序列),将'' 或者"" 或者'''''' 或者"""""" 作为容器标志
里面每一个独立的符号就是字符串的一个元素
字符串不可变,字符串有序的(支持下标操作)
字符串的元素: 引号里面的每个符号都是字符串的元素,字符串的元素又叫字符
字符分为两种: 普通字符、 转义字符
"""
# 1) 空串(引号里说明什么都没有,空格也不行)
empty1 = ''
empty2 = ""
empty3 = ''''''
empty4 = """"""
# print(type(empty1), len(empty1)) # <class 'str'> 0
# print(type(empty2), len(empty2)) # <class 'str'> 0
# print(type(empty3), len(empty3)) # <class 'str'> 0
# print(type(empty4), len(empty4)) # <class 'str'> 0
# 2) 字符串的容器标志
# ''和"" 没有区别,''''''和""""""没有区别
# ''和"" 里面的内容不能通过直接回车换行,只能通过转义字符换行
# ''''''和"""""" 里面的内容可以直接通过回城换行
str1 = '床前明月光, \n疑是地上霜' # 通过\n换行
str2 = '''床前明月光,
疑是地上霜
'''
# print(str1)
# print(str2)
# 2.字符串的元素 - 字符
"""
字符分为普通字符和转义字符两种
1)普通字符 - 在字符串中表示符号本身的字符
2)转义字符 - 使用\和其他符合一起来表示特殊功能和意义的字符
\n - (换行)
\t - 水平制表符(相当于tab键)
\' - 表示一个普通的单引号
\" - 表示一个普通的双引号
\\ - 表示一个普通的反斜杠
3)阻止转义 - 让字符串中的所有转义字符功能消失(让一个字符串中的每一个符号都是表示符号)
在字符串前加r/R: r'' 、 R''
4)转义字符 - 编码字符
"""
# str8 = r'\tabc\n123\'mn\"nn\\00' # 阻止转义
# print(len(str8)) # 22
# print(str8) # \tabc\n123\'mn\"nn\\00
# \u4位的16进制数 - 16进制数的编码值对应的字符 4e00 到 9fa5
# str9 = 'abc\u4e60123'
# print(str9) # abc习123
# 3.编码值 - 字符编码
# 1)编码值 - 计算机在存储符号的时候其实存的是这个符号对应的固定数字,这个数字就是符号对应的编码值
# 2)编码表 - 将字符和数字一一对应的表
"""
ASCII码表 - 总共有128个符号,只有美国常用的符号,不包括中文
数字在字母的前面,大写字母在小写字母前面(A-65,a-97),
大写字母和小写字母之间有间隙
Unicode编码表(python) - Unicode编码表中包含ASCII码
包含了目前世界上所有国家、所有民族的所有语言符号(万国码);
中文编码范围: 4e00 - 9fa5
chr(编码值) - 获取编码值对应的字符
ord(字符) - 获取指定字符的编码值 (凡是需要字符的地方,都给长度是1的字符串)
编码字符 - \u4e00
"""
# print(chr(97)) # 'a'
# print(chr(0x4e18)) # 丘
# 获取所有的中文
# num = 0
# print(0x9fa5 - 0x4e00)
# for x in range(0x4e00, 0x9fa6):
# num += 1
# print(chr(x), end=' ')
# if num % 30 == 0:
# print()
# for x in range(0x1b00, 0x1b7f+1):
# print(chr(x), end=' ')
# print()
# for x in range(0x2800, 0x28FF+1):
# print(chr(x), end=' ')
# print(ord('陈'), ord('星')) # ord() 获取编码值
# print(hex(38472)) # 将其他进制的数转换成十六进制数据
# print(bin(38472)) # 将其他进制的数转换成二进制数据
字符串的相关操作
- 查 - 字符串获取字符和列表获取元素的语法一样
message = 'you see see one day day!'
print(message[2]) # u
print(message[1:5]) # ou s
print(message[:-5:-1]) # !yad
# 一个空格是一个字符
str1 = 'abc 123'
print(str1[4]) # 1
一个转义字符是一个字符,长度是1
str2 = '\tabc\u4fa9 123'
print(str2[6]) # 1
for x in 'ab\u67afc':
print(x) # a、b、枯、c
- 运算符
字符串1 + 字符串2 - 将两个字符串拼接产生一个新的字符串
字符串 * N - 将字符串重复N此,产生一个新的字符串
print('abc'+'123') # 'abc123'
print('abc' * 3) # 'abcabcabc'
print('abc' == 'acb') # False
print('a' == '\u0061') # True
比较大小: > < >= <=
两个字符串比较大小,比较的是第一对不相等的字符的编码值的大小
"""
是否是数字字符:'0' <= char <= '9'
是否是小写字母:'a' <= char <= 'z'
是否是大写字母:'A' <= char <= 'Z'
是否是字母: 'a' <= char <= 'z' or 'A' <= char <= 'Z'
是否是中文: '\u4e00' <= char <= '\u9fa5'
"""
print('abc' > 'cd') # False
# 练习:提取一个字符串中所有的数字字符
# # 'sh函数78sk--好2o' -> '782'
str1 = 'sh函数78sk--好2o'
str2 = ''
for x in str1:
if '0' <= x <= '9':
str2 += x
print(str2) # 782
str3 = ''
for y in str1:
if '\u4e00' <= y <= '\u9fa5':
str3 += y
print(str3) # 函数好
result = ''.join([x for x in str1 if '\u4e00' <= x <= '\u9fa5'])
print(result) # # 函数好
- in 和 not in
字符串1 in 字符串2 - 判断字符串2中是否包含字符串1(判断字符串1是否是字符串2的子串)
print('abc' in 'a1b2c3') # False
print('abc' in 'abc123') # True
print('1' in 'abc123') # True
- 相关函数: len、str
str(数据) - 将数据转换成字符串(任何类型的数据都可以转换成字符串,转换时,直接在数据的打印值外加引号)
print(str(100)) # '100'
print(str(12.5)) # '12.5'
list1 = [1, 2, 3]
print(str(list1)) # '[1, 2, 3]'
dict1 = {'name': '小明', 'age': 18}
print(str(dict1)) # "{'name': '小明', 'age': 18}"
dict2 = {"name": '小明'}
print(str(dict2)) # "{'name': '小明'}"
字符串的相关方法
字符串.join(序列) - 将序列中的元素使用指定字符串连接,产生一个新的字符串(序列中的元素必须是字符串)
names = ['小明', '张三', '李四']
result = ''.join(names)
print(result) # 小明张三李四
result = ' '.join(names)
print(result) # 小明 张三 李四
result = '和'.join(names)
print(result) # 小明和张三和李四
message = 'abc'
print('.'.join(message)) # a.b.c
num = [10, 9, 78, 67]
str1 = ''.join([str(x) for x in num])
print(str1) # 1097867
list1 = ['name', 23, True, '你好', '哈哈']
str2 = '+'.join([x for x in list1 if type(x) == str])
print(str2) # name+你好+哈哈
split
字符串1.split(字符串2) - 将字符串1中所有的字符串2作为切割点对字符串1进行切割
字符串1.split(字符串2, N) - 将字符串1中前N个字符串2作为切割点对字符串1进行切割
str1 = 'how are you? i am fine, thank you! and you?'
result = str1.split(' ')
print(result) # ['how', 'are', 'you?', 'i', 'am', 'fine,', 'thank', 'you!', 'and', 'you?']
result = str1.split('you')
print(result) # ['how are ', '? i am fine, thank ', '! and ', '?']
print('abca123aamna'.split('a')) # ['', 'bc', '123', '', 'mn', '']
str2 = 'abc12mn12xy12==12++'
print(str2.split('12', 2)) # ['abc', 'mn', 'xy12==12++']
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) # how are me? i am fine, thank me! and me?
str2 = str1.replace('you', '.', 2)
print(str2) # how are .? i am fine, thank .! and you?
作业
1输入一个字符串,打印所有奇数位上的字符(下标是1,3,5,7…位上的字符)
str1 = input('输入一个字符串:')
str2 = str1[1::2]
print(str2)
2输入用户名,判断用户名是否合法(用户名长度6~10位)
str1 = input('输入用户名:')
if 6 <= len(str1) <= 10:
print('用户名合法')
else:
print('用户名不合法')
3输入用户名,判断用户名是否合法(用户名中只能由数字和字母组成)
str1 = input('输入用户名:')
for x in str1:
if ('0' <= x <= '9') or ('a' <= x <= 'z' or 'A' <= x <= 'Z'):
continue
else:
print('用户名不合法')
break
else:
print('用户名合法')
4输入用户名,判断用户名是否合法(用户名必须包含且只能包含数字和字母,并且第一个字符必须是大写字母)
str1 = input('请输入用户名:')
if 'A' <= str1[0] <= 'Z':
for x in str1:
if ('0' <= x <= '9') or ('a' <= x <= 'z' or 'A' <= x <= 'Z'):
continue
else:
print('用户名不合法')
break
else:
print('用户名合法!')
else:
print('用户名不合法!')
5.输入一个字符串,将字符串中所有的数字字符取出来产生一个新的字符串
str1 = input('输入一个字符串:')
print(''.join(x for x in str1 if '0' <= x <= '9'))
6输入一个字符串,将字符串中所有的小写字母变成对应的大写字母输出
# 一:
str1 = input('输入一个字符串:')
print(str1.upper())
# 二:
str1 = input('输入一个字符串:')
print(''.join(chr(ord(x) - 32) if 'a' <= x <= 'z' else x for x in str1))
7输入一个小于1000的数字,产生对应的学号
str1 = input('输入一个小于1000的数字:')
if len(str1) == 1:
print('学号为:', 'py190100' + str1)
elif len(str1) == 2:
print('学号为:', 'py19010' + str1)
else:
print('学号为:', 'py1901' + str1)
8输入一个字符串,统计字符串中非数字字母的字符的个数
str1 = input('输入一个字符串:')
print(len(str1)-len([x for x in str1 if '0' <= x <= '9' or 'a' <= x <= 'z' or 'A' <= x <= 'Z']))
9输入字符串,将字符串的开头和结尾变成’+’,产生一个新的字符串
str1 = input('输入一个字符串:')
len1 = len(str1)
print(''.join(['+' if index == 0 or index == len1 - 1 else str1[index] for index in range(len1)]))
10输入字符串,获取字符串的中间字符
11写程序实现字符串函数find/index的功能(获取字符串1中字符串2第一次出现的位置)
str1 = 'how are you? Im fine,Thank you!'
str2 = 'are'
len1 = len(str2)
for index in range(len(str1)):
if str1[index: index + len1] == str2:
print(index)
break
12获取两个字符串中公共的字符
str1 = 'how are you? Im fine,Thank you!'
str2 = 'are'
str3 = ''
for x in str1:
if x in str2 and x not in str3:
str3 += x
print(str3)