一、列表元组字典集合和字符串的比较
比较项 列表 元组 字典 集合 字符串 是否可变 可变的 不可变 可变的 可变的 不可变 是否有序 有序的 有序的 Python3.7之前:无序的,Python3.7之后:有序的 无序的 有序的 是否可以存储重复元素 可以 可以 key:不可以重复,value:可以重复 不可以 可以 数据类型 任意类型 任意类型 key:不可变的数据类型,value:任意类型 任意类型 ----
二、字符串
由若干个字符组成的一个序列被称为字符串,其中的字符可以是字母,数字,符号,中文等
注意:字符串属于不可变的数据类型,可以作为字典的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.可以将一个普通字符转换为特殊字符 b.可以将一个特殊字符转换为普通字符 """ # a. s1 = "\"hello\"" print(s1) s1 = "'hello'" print(s1) s1 = '"hello"' print(s1) # 练习 dict1 = {'name':'张三','age':10} print(f"姓名:{dict1['name']}") print(f'姓名:{dict1["name"]}') # b. """ n ----->\n 换行 t ----->\t 制表符【tab键】 r ------>\r 回车 b ------>\b backsapce """ s2 = 'hello\npython' print(s2) s2 = 'hello\tpython' print(s2) # c.\----->\\ s3 = 'aaa\bbb\ccc\ddd\nnn' print(s3) # aabb\ccc\ddd s3 = 'aaa\\bbb\\ccc\\ddd\\nnn' print(s3) # aaa\bbb\ccc\ddd\nnn # 注意:r"xxx",可以将字符串中的特殊字符进行转义,无需手动转义,常用于路径的表示或者正则表达式中 s3 = r"aaa\bbb\ccc\ddd\nnn" print(s3) # aaa\bbb\ccc\ddd\nnn
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.写代码,有如下变量,请按照要求实现每个功能 # a.移除name变量对应值的两边的空格,并输出移除后的内容 """ strip():去除一个指定字符串中两端指定的子字符 lstrip():去除一个指定字符串中左边指定的子字符 rstrip():去除一个指定字符串中右边指定的子字符 """ name = " gouguoQ " print(name) # 注意:默认情况下,去除一个字符串两端的空格 a1 = name.strip() print(a1) # print(name) a1 = name.rstrip() print(a1) a1 = name.lstrip() print(a1) # 注意2:也可以去除指定的字符 name = "*****gouguoQ**" print(name) a1 = name.strip('*') print(a1) a1 = name.rstrip("*") print(a1) a1 = name.lstrip("*") print(a1) # 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 = "gouguoQoabco123" name.replace('o','p') print(name) # gouguoQoabco123 """ # 注意1:默认会将指定字符全部替换 name = "gouguoQoabco123" d1 = name.replace('o','p') print(d1) # 注意2:从左往右进行计数,可以控制替换的次数 d1 = name.replace('o','p',2) print(d1) # 注意3:可以通过映射替换操作,映射替换:简单的加密 str1 = "561735656460415" table = str.maketrans('012345','abcdef') # 此处两个字符串的长度必须相同 print(table) # {48: 97, 49: 98, 50: 99, 51: 100, 52: 101, 53: 102} d2 = str1.translate(table) print(d2) # f6b7df6f6e6aebf t = str.maketrans('o','p') d3 = name.translate(t) print(d3) # e.将name变量对应的值根据"o"分割,并输出结果 # n.利用下划线将列表li = ['gou', 'guo', 'qi']的每一个元素拼接成字符串gou_guo_qi """ join():使用指定的子字符串将列表中的元素连接【列表-----》字符串】 split():使用指定的子字符串将原字符串进行分割,得到一个列表 【字符串-----》列表】 """ # 注意1:默认全部分割,得到一个列表 name = "gouguoQoabco123" e1 = name.split('o') print(e1) # ['g', 'ugu', 'Q', 'abc', '123'] # 注意2:可以指定分割的次数 name = "gouguoQoabco123" e1 = name.split('o',2) print(e1) # 注意3:只有列表中的元素是字符串的前提下,才能进行拼接 li = ['gou', 'guo', 'qi'] n = "_".join(li) print(n) # li1 = [34,5,67] # n1 = '*'.join(li1) # TypeError: sequence item 0: expected str instance, int found # print(n1) # g.将name变量对应的值变大写,并输出结果 # h.将name变量对应的值变成小写,并输出结果 """ upper():小----》大 ****** lower():大---》小 ****** swapcase():大---》小 ****** capitalize():首单词的首字母大写,其他全部小写,英文句子 ****** title():每个单词的首字母大写,其他全部小写 ****** """ name = 'tHis is A tExt' print(name.upper()) print(name.lower()) print(name.swapcase()) # 【面试题】 print(name.capitalize()) # This is a text print(name.title()) # This Is A Text # i.请输出name变量对应的值的第二个字符 name = "gouguoQoabco123" 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 = "gQouguoQoabco12Q3" # 注意1:如果子字符串存在的前提下,index和find从左往右进行检索,返回被查找的子字符串在原字符串中第一次出现的位置 print(name.index("Q")) print(name.find("Q")) # 注意2:如果子字符串不存在的情况下,index直接报错,find返回-1,建议使用find # print(name.index("x")) # ValueError: substring not found print(name.find("x")) # -1 # 注意3:默认全局查找,但是可以设置查找范围,设置开始索引和结束索引,遵循包头不包尾 name = "gQouguoQoabco12Q3" print(name.index("Q",1,6)) # 1 print(name.find("Q",1,6)) # 1 # print(name.index("Q",2,7)) #ValueError: substring not found print(name.find("Q",2,7)) # -1 # 注意4:rindex和rfind表示从右往左进行检索,返回的结果仍然是子字符串在原字符串中的索引 print(name.rindex("Q")) print(name.rfind("Q"))
5.练习
# 2.已知字符串 a = "aAsmr3idd4bgs7Dlsf9eAF",要求如下 a = "aAsmr3idd4bgs7Dlsf9eAF" # a.请将a字符串的大写改为小写,小写改为大写 r = a.swapcase() print(r) # b.请将a字符串的数字取出,并输出成一个新的字符串 # 方式一 r1 = "" for ch in a: if ch in [str(i) for i in range(10)]: r1 += ch print(r1) # 方式二 r1 = "" for ch in a: if ch.isdigit(): r1 += ch print(r1) r1 = "" for ch in a: if ch.isdecimal(): r1 += ch print(r1) # c.请统计a字符串出现的每个字母的出现次数(忽略大小写,a与A是同一个字母),并输出成一个字典。 # 例 {'a':4,'b':2} c = a.lower() dict1 = {} for ch in c: dict1[ch] = c.count(ch) print(dict1) # d.输出a字符串出现频率最高的字母 dict1 = {} for ch in a: dict1[ch] = a.count(ch) print(dict1) max_value = max(dict1.values()) for key,value in dict1.items(): if value == max_value: print(key) # e.请判断 'boy'里出现的每一个字母,是否都出现在a字符串里。如果出现,则输出True,否则,则输出False a = 'abc24y5qgohg' substr = 'boy' count = 0 for ch in substr: if ch in a: count += 1 if count == len(substr): print(True) else: print(False)