一、字符串
由若干个字符组成的一个序列被称为字符串,其中的字符可以是字母,数字,符号,中文等
注意:字符串属于不可变的数据类型,可以作为字典的key
1.创建
# 1.' ' str1 = '123abc%$#计算机' print(str1) # 2." " str2 = "123abc%$#计算机" print(str2) # 3.""" """ 或 ''' ''' str3 = """123abc%$#计算机""" print(str3) # 注意:三引号的特殊之处:内部的内容可以换行,而且可以原样输出 str3 = """123 abc %$# 计算机""" print(str3) # 4.转义字符 # 语法:\x """ 可以将一个普通字符转换为特殊字符 可以将一个特殊字符转换为普通字符 """ # a.n---->\n,\n表示换行 s1 = 'hellonworld' print(s1) s1 = 'hello\nworld' print(s1) # b.t---->\t,\t表示制表符【tab键】 s1 = 'hellotworld' print(s1) s1 = 'hello\tworld' print(s1) # c."---->\" s2 = "'hello'" print(s2) s2 = '"hello"' print(s2) s2 = "\"hello\"" print(s2) s2 = '\'hello\'' print(s2) # d.\------>\\ s3 = 'aaa\\bbb\\ccc' print(s3) s3 = 'aaa\\bbb\\ccc\\ddd\\kf\\ggg' print(s3) # r"":可以将字符串中的特殊字符进行转义,无需手动转义,常用于路径的表示或者正则表达式中 s3 = r'aaa\bbb\ccc\ddd\kf\ggg' print(s3)
2.操作
# 字符串的使用和列表的使用相似,都是有序的,都有索引 # 1.字符的访问 str1 = 'ghajkghajk' print(str1[0]) print(str1[-len(str1)]) print(str1[-1]) print(str1[len(str1) - 1]) # 2.+:拼接 s1 = 'abc' s2 = '123' print(s1 + s2) # 3.*:重复 print("#" * 30) print(s1 * 3) # 4.in/not in:判断是否存在 print('a' in s1) print('a' not in s1) # 5.遍历 data = 'hello' for ch in data: print(ch) for i in range(len(data)): print(data[i]) for i,ch in enumerate(data): print(i,ch)
3.系统功能
3.1转换
eval():将str转换为有效的表达式
# 1.eval(str):可以识别一个字符串str中的有效的python语句并执行该语句 # a s1 = '123' r1 = eval(s1) r2 = int(s1) print(r1,type(r1)) print(r2,type(r2)) # b s1 = '123.34' r1 = eval(s1) r2 = float(s1) print(r1,type(r1)) print(r2,type(r2)) # c. eval("print('哈哈哈哈哈哈')") list1 = [34,65,6,67] eval('list1.append(88)') print(list1) # d. # 练习1:从控制台输入数学表达式,并计算结果 # data = input("请输入数学表达式:") # print(f"{data}的运算结果为:{eval(data)}") # 练习2:从控制台输入5个数,组成一个列表,求平均值 # numlist = eval(input("请输入5个数字的列表:")) # print(f"平均值:{sum(numlist) / len(numlist)}")
upper():将小写字母转换为大写
lower():大—》小
swapcase():大—》小 小----》大
capitalize():首单词的首字母大写,其他全部小写,英文句子
title():每个单词的首字母大写,其他全部小写
ord(),chr()
# 2.chr()和ord() """ chr(num):获取数字num在ASCII表中对应的字符 ord(ch):获取字符ch在ASCII表中对应的十进制数字 """ print(chr(97)) print(ord('A')) print(ord('0')) # 练习:从控制台输入一个小写字母,将其转换为对应的大写字母 ch = input("请输入一个小写字母:") # e # 获取小写字母对应的数字 n1 = ord(ch) print(n1) # 获取大写字母对应的数字 n2 = n1 - 32 print(n2) # 获取对应的大写字母 ch1 = chr(n2) print(ch1) # 整合 ch = input("请输入一个小写字母:") # 面试题 print(chr(ord(ch) - 32))
3.2查找
find():从左往右进行检索,返回被查找的子字符串在原字符串中第一次出现的位置,如果查找不到返回-1 ******
rfind():从右往左进行检索
index():从左往右进行检索,返回被查找的子字符串在原字符串中第一次出现的位置,如果查找不到则直接报错 ****
rindex():从右往左进行检索
3.3填充
center(width[,fillchar]):用fillchar填充指定的字符串,填充之后的长度为width,原字符串居中显示 ****
ljust(width[,fillchar]):用fillchar填充指定的字符串,填充之后的长度为width,原字符串居左显示,
rjust(width[,fillchar]):用fillchar填充指定的字符串,填充之后的长度为width,原字符串居右显示,
zfill(width):原字符串居右显示,剩余的字符默认用0填充
""" center(width[,fillchar]):用fillchar填充指定的字符串,填充之后的长度为width,原字符串居中显示 ljust(width[,fillchar]):用fillchar填充指定的字符串,填充之后的长度为width,原字符串居左显示, rjust(width[,fillchar]):用fillchar填充指定的字符串,填充之后的长度为width,原字符串居右显示, zfill(width):原字符串居右显示,剩余的字符默认用0填充 """ # 1.center():两端使用指定字符填充,原字符串居中显示 # fillchar可以省略,默认使用空格填充 print("hello".center(20)) # fillchar可以自定义,但是,fillchar必须是一个字符 print("hello".center(20,"*")) # print("hello".center(20,"*****")) # TypeError: The fill character must be exactly one character long # 2.ljust():右边使用指定字符填充,原字符串居左显示 print("hello".ljust(20)) print("hello".ljust(20,"*")) # 3.rjust():左边使用指定字符填充,原字符串居右显示 print("hello".rjust(20)) print("hello".rjust(20,"*")) # 4.zfill():左边使用字符0填充,原字符串居右显示 print("hello".zfill(20)) print("hello".rjust(20,"0"))
3.4提取
strip():去除一个指定字符串中两端指定的子字符 ****
lstrip():去除一个指定字符串中左边指定的子字符
rstrip():去除一个指定字符串中右边指定的子字符
3.5合并和分割
join():使用指定的子字符串将列表中的元素连接【列表-----》字符串】 ****
split():使用指定的子字符串将原字符串进行分割,得到一个列表 【字符串-----》列表】****
3.6替换
replace(old,new):将原字符串中的old替换为new ****
映射替换:
maketrans():生成映射表
translate():根据映射表将指定字符串中的指定字符替换为映射表中对应的字符
3.7判断
isalpha():一个字符串非空并字符全部是字母才返回True
isalnum():一个字符串非空并字符是字母或者数字才返回True
isupper()/islower()/istitle():和upper,lower,title有关
isdigit()/isdecimal():一个字符串非空并字符全部是数字才返回True ***
startswith();判断一个字符串是否是以指定自字符串开头【前缀】 ***
endswith():判断一个字符串是否是以指定自字符串结尾【后缀】 ****
3.8编码和解码
encode():编码
decode();解码
""" 【面试题】简述字符串的编码和解码 编码:将字符串类型转换为字节类型,实现方式:bytes()或encode() 解码:将字节类型转换为字符串类型,实现方式:str()或decode() 字符串:'' '' 三引号 字节:b'' b"" b三引号 常用的编码格式: utf-8 gbk """ # 1.编码 str1 = "3454jgjgj计算机%¥#" # a.bytes() r1 = bytes(str1,encoding="utf-8") # int()/float()/list().... print(r1) print(type(r1)) # b.encode() r2 = str1.encode(encoding="gbk") print(r2) print(type(r2)) # 2.解码 # a.str() # 注意:字符串的编解码的格式一定要保持一致,否则无法操作 s1 = str(r1,encoding="utf-8") print(s1) print(type(s1)) # b.decode() s2 = r2.decode(encoding="gbk") # r2.decode("gbk") print(s2) print(type(s2)) # 使用场景:文件读写和爬虫
3.9格式化
占位符
format()
f""
# 1.占位符 ****** """ %d:可以匹配数字,一般匹配整型【整数】 %f:可以匹配数字,一般匹配浮点型【小数】 %s:可以匹配Python中的一切数据类型 """ # 语法:"使用占位符设置格式" % (实际的数据) # 作用:使用实际的数据将占位符占用的位置进行填充 print(13,'abc') print('年龄:%d,爱好:%s' % (10,'篮球')) # 注意1:实际数据的数量和占位符的数量需要完全一致 # print('年龄:%d,爱好:%s' % (10)) # TypeError: not enough arguments for format string # 注意2:从前往后进行一一匹配,实际数据的类型和占位符的类型要匹配 # print('年龄:%d,爱好:%s' % ('篮球',10)) # TypeError: %d format: a number is required, not str print('年龄:%s,爱好:%s' % (10,'篮球')) # 注意3:%d匹配到浮点数会自动取整,%f匹配到整型会自动转换为浮点型 print('年龄:%d,爱好:%s,体重:%f' % (10.85,'篮球',55)) # 注意4:%.nd,n表示整数显示的位数,不够的话在原数字的前面补0 # %.nf,n表示保留小数点后n位 ***** print('年龄:%.5d,爱好:%s,体重:%.2f' % (10,'篮球',55.2463563234)) # print('年龄:%s,爱好:%s,体重:%s' % (10.85,'篮球',55.2463563234)) # 2.format() # 注意1:format和占位符相比,优点:不需要考虑类型的问题 print('年龄:{},爱好:{}'.format(10,'篮球')) # 注意2:format和占位符相比,优点:也可以不需要考虑数量的问题 print('名次:{},年龄:{},爱好:{}'.format(10,10,'篮球')) # 默认,数量一致 print('名次:{0},年龄:{0},爱好:{0}'.format(10,'篮球')) # 同一个数据可以重复使用 # 注意3:format也可以限制类型,{编号:s},s表示字符串类型,f表示浮点型,d表示整型, # 默认保留小数点后6位 print('年龄:{0},爱好:{1},体重:{2:f}'.format(10,'篮球',55.6347)) # 3.f"",推荐 ******* print(f'年龄:{10},爱好:{"篮球"}') print(f'年龄:{10},爱好:{"篮球"},体重:{55.6347}') # 练习: name = input("请输入你的姓名:") age = input("请输入你的年龄:") hobby = input("请输入你的爱好:") print("大家好,我是%s,今年%s岁,爱好%s,还有%d年退休。" % (name,age,hobby,60 - int(age))) print("大家好,我是{},今年{}岁,爱好{},还有{}年退休。".format(name,age,hobby,60 - int(age))) print(f"大家好,我是{name},今年{age}岁,爱好{hobby},还有{60 - int(age)}年退休。")
4.练习一
# 注意:字符串是不可变的数据类型,所以但凡涉及到字符串的更改,都是生成了一个新的字符串 # 1.写代码,有如下变量,请按照要求实现每个功能 name = "gouguoQ " # a.移除name变量对应值的两边的空格,并输出移除后的内容 """ strip():去除一个指定字符串中两端指定的子字符 ****** lstrip():去除一个指定字符串中左边指定的子字符 rstrip():去除一个指定字符串中右边指定的子字符 """ # 注意1:默认都是去除字符串两头的空格 name = " gouguoQ " print(name) a1 = name.strip() print(a1) # 注意2:如果指定需要去除的字符,则会查找去除 name = "*******gouguoQ***" print(name) a2 = name.strip('*') print(a2) a2 = name.lstrip('*') print(a2) a2 = name.rstrip('*') print(a2) # b.判断name变量对应的值是否以"go"开头,并输出结果 # c.判断name变量对应的值是否以"Q"结尾,并输出结果 """ startswith();判断一个字符串是否是以指定自字符串开头【前缀】 *** endswith():判断一个字符串是否是以指定自字符串结尾【后缀】 """ name = "gouguoQ " b = name.startswith('go') print(b) c = name.endswith('Q') print(c) # d.将name变量对应的值中的"o",替换为"p",并输出结果 """ replace(old,new):将原字符串中的old替换为new 映射替换: maketrans():生成映射表 translate():根据映射表将指定字符串中的指定字符替换为映射表中对应的字符 """ name = "gouguogougouQ " # 注意1:默认会全部替换 d1 = name.replace('o','p') print(d1) # 注意2:可以控制替换的次数 d1 = name.replace('o','p',2) print(d1) # 注意3:映射替换,生成映射表的时候,给定的字符串的长度必须相等,可以用于简单的加密 str1 = '65178561089' table = str.maketrans('012345','abcdef') # 生成映射表 print(table) d2 = str1.translate(table) # 根据映射表完成替换操作 print(d2) t = str.maketrans('o','p') d3 = name.translate(t) print(d3) # g.将name变量对应的值变大写,并输出结果 # h.将name变量对应的值变成小写,并输出结果 """ upper():将小写字母转换为大写 lower():大---》小 swapcase():大---》小 小----》大 capitalize():首单词的首字母大写,其他全部小写,英文句子 title():每个单词的首字母大写,其他全部小写 """ data = 'tHis is A Text' print(data.upper()) print(data.lower()) print(data.swapcase()) print(data.capitalize()) print(data.title()) # e.将name变量对应的值根据"o"分割,并输出结果 """ split():使用指定的子字符串将原字符串进行分割,得到一个列表 【字符串-----》列表】 """ name = "gouguogougouQ " # 注意1:默认会全部分割 e1 = name.split('o') print(e1) # 注意2:可以控制分割的次数 e1 = name.split('o',2) print(e1) # n.利用下划线将列表li = ['gou', 'guo', 'qi']的每一个元素拼接成字符串gou_guo_qi """ join():使用指定的子字符串将列表中的元素连接【列表-----》字符串】 """ li = ['gou', 'guo', 'qi'] n = "_".join(li) print(n) name = "gouguoQ" # i.请输出name变量对应的值的第二个字符 print(name[1]) # j.请输出name变量对应的值的前三个字符 print(name[:3]) # k.请输出name变量对应值的后2个字符 print(name[-2:]) print(name[len(name) - 2:]) # m.获取子序列,仅不包含最后一个字符,如:woaini则获取woain root则获取roo print(name[:-1]) # l.请输出name变量中的值"Q的索引的位置 """ find():从左往右进行检索,返回被查找的子字符串在原字符串中第一次出现的位置,如果查找不到返回-1 **** ** rfind():从右往左进行检索 index():从左往右进行检索,返回被查找的子字符串在原字符串中第一次出现的位置,如果查找不到则直接报错 rindex():从右往左进行检索 """ name = "gouguoQabcQ123Q" print(len(name)) # 注意1:如果子字符串存在的前提下,find和index使用相同,都是返回子字符串在原字符串中从左往右第一次出现的索引 print(name.find('Q')) print(name.index('Q')) # 注意2:如果子字符串不存在的前提下,find返回-1,index直接报错 print(name.find('X')) # -1 # print(name.index('X')) # ValueError: substring子字符串 not found # 注意3:如果子字符串存在的前提下,rfind和rindex使用相同,都是返回子字符串在原字符串中从右往左第一次出现的索引 # 说明:此时的索引还是原字符串中的索引 print(name.rfind('Q')) # 14 print(name.rindex('Q')) # 14 # 注意4:默认情况下,全局查找,但是,可以指定查找的范围【区间】,仍然是前闭后开区间 # 说明:此时的索引还是原字符串中的索引 print(name.find('Q',6,8)) # 6 print(name.index('Q',6,8)) # 6 print(name.find('Q',7,10)) # -1 # 【面试题】代码阅读题 # 1 data = 'abc' data.upper() print(data) # abc # 2 data = 'abc' data = data.upper() print(data) # ABC
5.练习二
# 2.已知字符串 a = "aAsmr3idd4bgs7Dlsf9eAF",要求如下 a = "aAsmr3idd4bgs7Dlsf9eAF" # a.请将a字符串的大写改为小写,小写改为大写 a1 = a.swapcase() print(a1) # b.请将a字符串的数字取出,并输出成一个新的字符串 """ isdigit()/isdecimal():一个字符串非空并字符全部是数字才返回True *** """ b = "" for ch in a: if ch.isdigit(): b += ch print(b) # c.请统计a字符串出现的每个字符的出现次数(忽略大小写,a与A是同一个字母),并输出成一个字典。 # 例 {'a':4,'b':2} # 方式一 count_dict = {} c = a.lower() for ch in c: if ch not in count_dict: count_dict[ch] = 1 # 添加键值对 else: count_dict[ch] += 1 # 修改指定键对应的值 print(count_dict) # 方式二 count_dict = {} c1 = a.lower() for ch in c1: count_dict[ch] = c1.count(ch) print(count_dict) # d.输出a字符串出现频率最高的字母 count_dict = {} for ch in a: count_dict[ch] = c1.count(ch) print(count_dict) max_count = max(count_dict.values()) print(max_count) for key,value in count_dict.items(): if value == max_count: print(key) # e.请判断 'boy'里出现的每一个字母,是否都出现在a字符串里。如果出现,则输出True,否则,则输出False # 方式一:统计个数 a = 'abc23647ofhajyfh' substr = 'boy' count = 0 for ch in substr: if ch in a: count += 1 if count == len(substr): print(True) else: print(False) # 方式二:使用集合的去重性 a = 'abc27fhoafh' substr = 'boy' s1 = set(a) s1.update(substr) if len(s1) == len(set(a)): print(True) else: print(False)
6.练习三
# 3.统计用户输入的内容中有几个数字,几个字母? """ isalpha():一个字符串非空并字符全部是字母才返回True,不推荐使用 isalnum():一个字符串非空并字符是字母或者数字才返回True,不推荐使用 isdigit()/isdecimal():一个字符串非空并字符全部是数字才返回True *** """ # 不严谨的写法 """ 问题: isalpha和isalnum:工作原理依据的是ASCII码,但是,在使用的过程中,可以识别除了ASCII码表外的中文 在实际开发中,不建议使用这两个功能 """ # content = input("请输入内容:") # digits_count = 0 # letters_count = 0 # for ch in content: # if ch.isalpha(): # letters_count += 1 # elif ch.isdigit(): # digits_count += 1 # print(f"用户输入的内容中有{digits_count}个数字,{letters_count}个字母") # 正确写法: # 方式一 # content = input("请输入内容:") # digits_count = 0 # letters_count = 0 # for ch in content: # if 'a' <= ch <= 'z' or 'A' <= ch <= 'Z': # letters_count += 1 # elif ch.isdigit(): # digits_count += 1 # print(f"用户输入的内容中有{digits_count}个数字,{letters_count}个字母") # 方式二 import string # print(string.ascii_letters) # print(string.ascii_lowercase) # print(string.ascii_uppercase) # content = input("请输入内容:") # digits_count = 0 # letters_count = 0 # for ch in content: # if ch in string.ascii_letters: # letters_count += 1 # elif ch.isdigit(): # digits_count += 1 # print(f"用户输入的内容中有{digits_count}个数字,{letters_count}个字母") # # 4.编写敏感词语过滤程序,提示用户输入内容,如果用户输入的内容中包含特殊的字符, # 如山寨 水货,则将内容替换为***** data = input("请输入内容:") words = ['山寨','水货','草','大傻逼'] for word in words: if data.find(word) != -1: # word in data data = data.replace(word,"*" * len(word)) print(data)