1. 元组(tuple)
- 什么是元组
- 元组是容器型数据类型;将()作为容器的标志,里面多个元索用逗号隔开: (数据1,数据2,数据3,…)
- 元组是不可变的(不支持增删改;有序的(支持下标操作)
- 元素:没有要求
-
空元组
t1 = ()
-
只有一个元素的元组在表示的时候唯一 的元素后面必须加逗号
t2 = (10, ) print(t2, type(t2), len(t2)) # 运行结果 ''' (10,) <class 'tuple'> 1 '''
-
在没有歧义的情况下,元组的()可以省略 (直接将多个数据用逗号隔开表示的也是一个元组)
t3 = 10, 20, 30 print(t3, len(t3)) # 运行结果 ''' (10, 20, 30) 3 '''
-
解包 - 使用多个变量直接获取元组、列表中的多个元素
# 分解元组 t4 = (10, 20, 30) print(t4[0], t4[1], t4[2]) x, y, z = t4 print(x, y, z) # enumerate的原理 list1 = [100, 200, 300] for index, item in enumerate(list1): print(index, item, end=' ') print() # 字典分解 d1 = {'a': 10, 'b': 20, 'c': 30} for key, item in d1.items(): print(key, item, end=' ') print() print(d1.items()) # 运行结果 ''' 10 20 30 10 20 30 0 100 1 200 2 300 a 10 b 20 c 30 dict_items([('a', 10), ('b', 20), ('c', 30)]) '''
-
元组就是不可变的列表
t4 = (10, 20, 30) print(t4[-1]) print(t4[1:]) print(t4 * 2, t4 + (1, 100)) print(10 in t4) print((10, 20, 30) > (1, 100, 200, 39993)) # 等等... # 一般用于储存不可变数据 week = ('星期1', '星期2', '星期3', '星期4', '星期5', '星期6', '星期7') # 运行结果 ''' 30 (20, 30) (10, 20, 30, 10, 20, 30) (10, 20, 30, 1, 100) True True '''
2. 字符串(str)
2.1 认识字符串
-
字符串是容器型数据类型(字符串对应的容器只能保存多个文字符号-字符)。将’'或者""作为容器的标志,里面的每个符号就是字符串中每个元素。
-
字符串是不可变的,对字符串进行操作会产生新的字符串,原字符串并未改变
-
多行注释只有在特定位置时才是注释,否则是字符串
-
字符串是有序的(支持索引)
-
元素:引号中每个符号都是字符串的元素(任何文字符号都可以是字符串的元素),字符串的元素又叫字符
注意:字符串的元素(字符)分为两种:普通字符(符号在字符串中表示它本身)、转义字符(符号在字符串中有特殊功能或者特殊意义,没有表示这个符号本身)
str1 = 'abc,123' str2 = "abc" # 多行字符串 str3 = '''abc''' str4 = """abc""" # 多行注释只有在特定的位置上才是注释 # 文件开头、def函数开头、class类开头表示注释、其它地方表示字符串 # 字符串不可变,所有可变操作都是在创建对应的新的字符串 str1 = 'mna' new_str1 = str1.upper() print(str1, new_str1) # 字符串有序 print('abc' == 'bca') # False # 任何文字符号都可以是字符串的元素 str2 = 'amKN12,.。;=-+&^%函数😁♠♣' print(str2) # 普通字符 str3 = 'ak2你' print(str3) # ak2你 # \t是转义字符 str4 = 'a\tb123' print(str4) # 运行结果 ''' mna MNA False amKN12,.。;=-+&^%函数😁♠♣ ak2你 a b123 '''
2.2 转义字符
-
转义字符是由\和另外一个或者多个符号一起组合而成(转义符一定是\开头)。
-
在特定的符号前加上\,让这个符号在字符串中具有特殊的功能或者特殊意义的字符就是转义字符。
-
转义字符是固定的(并不是随便一个字符前加\都可以变成转义字符)。
常见的转义字符:
转义字符 作用 \n 换行 \t 水平制表符(相当于按tab键) \’ 表示一个普通的单引号 \" 表示一个普通的双引号 \\ 表示一个普通的反斜杠 # \n、\t str1 = '\t床前明月光,\n\t疑是地上霜。\n\t举头望明月,\n\t低头思故乡。' print(str1) # \'、\" str1 = 'I say:"good good study,day day up"' print(str1) str1 = "I say:\"good good study,day day up\"" print(str1) str1 = '1\'30"' print(str1) # \\ str1 = 'abc\\n123' print(str1) path = 'c:\study\\abc\\bin\\text.txt' print(path) # 运行结果 ''' 床前明月光, 疑是地上霜。 举头望明月, 低头思故乡。 I say:"good good study,day day up" I say:"good good study,day day up" 1'30" abc\n123 c:\study\abc\bin\text.txt '''
2.3 r字符串
-
在字符串引号前加r或者R
如果表示字符串的时候在字符串最前面加r/R,可以让字符串中所有的转义字符功能消失。(r字符串中所有的字符都是普通字符)str3 = R'\tabc\n123' print(str3) path = r'c:\study\abc\bin\text.txt' print(path) # 运行结果 ''' \tabc\n123 c:\study\abc\bin\text.txt '''
2.4 字符编码
-
字符编码
计算机存储数据只能存数字(计算机只具备存储数字的能力)。
为了能够让计算机保存文字信息,就给每一个文本符号对应一个固定的数字,每次在需要存储这个文本符号的,就存储这个符号对应的数字。
这个数字就叫这个符号的编码值。 -
编码表
保存每个符号对应的编码值的表
-
ASCII码表
总共有128个字符对应的编码值,主要包含:常用的英文符号、数字字符、和字母
A - 65
a - 97 -
Unicode编码表(Python)
Unicode编码表中包含ASCII表
Unicode又叫统一码、万国码,它包含了世界上所有国家所有民族的所有语言的符号。
中文编码:4e00 ~ 9fa5# 16进制编码需要在前面加上0x print(0x9fa5 - 0x4e00) # 万国码中一共包含20901个汉字 # 运行结果 ''' 20901 '''
- 编码值转换
-
chr(编码值) - 获取指定编码值对应的字符
print(chr(97)) # a print(chr(0x4e00)) # 一 print(chr(0x9fa5)) # 龥(yù) # 运行结果 ''' a 一 龥 '''
-
ord(字符) - 获取指定字符对应的编码值(编码值以10进制的方式返回值)
注意:字符只能是长度为1的字符,而非字符串print(ord('a'), ord('A')) print(ord('余'), ord('婷')) print(hex(20313), hex(23159)) # hex(数字) - 将数字表示成16进制数 # 运行结果 ''' 97 65 20313 23159 0x4f59 0x5a77 '''
-
编码字符
在字符串中表示字符的方式有两种:直接提供字符,也可以提供一个编码字符。
\u4位的16进制编码值str1 = 'a一龥' str2 = '\u0061\u4e00\u9fa5' print(str1, str2) # 两个字符串比较大小比较的是第一对不相等的字符的编码值的大小 print('abc' > '一zzzzashf') # 运行结果 ''' a一龥 a一龥 False '''
2.5 字符串基本操作
-
查
字符串获取元素和列表获取元素的语法一模一样message = 'hello python!' print(message[0], message[-1], message[4]) print(message[1:-1:2]) print(message[1:4:-1]) print(message[2:]) # 运行结果 ''' h ! o el yhn llo python! '''
-
+、*
- 字符串1 + 字符串2 - 将两个字符串合并,产生一个新的字符串
- 字符串 * N - 字符串重复N次产生一个新的字符串
str1 = 'abc' str2 = 'hello' result = str1 + str2 print(result) result = str1 * 3 print(result) # 运行结果 ''' abchello abcabcabc '''
-
in 和 not in
字符串1 in(not in) 字符串2 - 判断字符串2中是否包含(不包含)字符串1str2 = 'hello' print('a' in str2) # False print('h' in str2) # True print('he' in str2) # True print('hl' in str2) # False # 运行结果 ''' False True True False '''
案例:统计str1中中文的个数
str1 = '换手机hss8223Kks是sjd==222' count = 0 for x in str1: if '一' <= x <= '\u9fa5': count += 1 print(count) # 运行结果 ''' 4 '''
3. 字符串相关方法
-
str.join()
- 字符串.join(序列) - 将序列中的元素用指定的字符串拼接在一起,形成一个新的字符串(序列中的元素必须是字符串)
list1 = ['后裔', '王昭君', '鲁班7号', '孙悟空'] result = ''.join(list1) print(result) result = ' and '.join(list1) print(result) # 运行结果 ''' 后裔王昭君鲁班7号孙悟空 后裔 and 王昭君 and 鲁班7号 and 孙悟空 '''
如果需要join的序列中的元素不是字符串,就想办法把它的元素变成字符串再join
-
str.split()
- 字符串1.split(字符串2) - 将字符串1中所有的字符串2作为切割点对字符串进行切割,返回包含切割后每一小段对应的字符串的列表
- 字符串1.split(字符串2, N) - 将字符串1中前N个字符串2作为切割点为字符串1进行切割
str1 = 'mnabcmnmn123mnkplmn##mn' result = str1.split('mn') print(result) str1 = 'abcmn123mnkplmn##' result = str1.split('mn', 2) print(result) # 运行结果 ''' ['', 'abc', '', '123', 'kpl', '##', ''] ['abc', '123', 'kplmn##'] '''
-
str.replace()
- 字符串1.replace(字符串2, 字符串3) - 将字符串1中所有的字符串2都替换成字符串3
- 字符串1.replace(字符串2, 字符串3, N) - 将字符串1中前N个字符串2替换成字符串3
str1 = 'mnabcmnmn123mnkplmn##mn' result = str1.replace('mn', 'ABC') print(result) result = str1.replace('mn', '') print(result) result = str1.replace('mn', 'AB', 3) print(result) # 运行结果 ''' ABCabcABCABC123ABCkplABC##ABC abc123kpl## ABabcABAB123mnkplmn##mn '''
-
str.strip()
- 字符串.strip() - 删除字符串左右两端的空白字符
- 字符串.rstrip() - 删除字符串右端的空白字符
- 字符串.lstrip() - 删除字符串左端的空白字符
str1 = '\n\t 小 明\n\t ' print(str1) print('------------------------------------华丽的分割线-----------------------------------') result = str1.strip() print(result) print('------------------------------------华丽的分割线-----------------------------------') str1 = '//小 明' result = str1.strip('/') print(result) # 运行结果 ''' 小 明 ------------------------------------华丽的分割线----------------------------------- 小 明 ------------------------------------华丽的分割线----------------------------------- 小 明 '''
-
str.find()、str.index()
- 字符串1.find(字符串2) - 获取字符串1中字符串2第一次出现的位置(以0开始的下标值返回),如果字符串2不存在返回-1
- 字符串1.find(字符串2, 开始下标, 结束下标) - 获取字符串1中指定范围内字符串2第一次出现的位置
- 字符串1.index(字符串2) - 获取字符串1中字符串2第一次出现的位置(以0开始的下标值返回),如果字符串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('abc')) # -1 # print(str1.index('abc')) # 报错! print(str1.find('you', 10)) # 30 print(str1.find('you', 10, 26)) # -1 # rfind、rindex str1 = 'how are you? I am fine, thank you! and you?' print(str1.rfind('you')) # 运行结果 ''' 8 8 -1 30 -1 39 '''
4. 字符串格式化
-
字符串拼接
- 使用+将多个字符串拼接在一起
name, age = '小花', 25 message = name + '今年' + str(age) + '岁!' print(message) # 运行结果 ''' 小花今年25岁! '''
-
格式化字符串
-
包含一个或者多个格式占位符的字符串 % (数据1, 数据2, 数据3,…)
说明:()中的数据必须和前面字符串中的占位符一一对应。如果只需要一个数据,那么()可以省略 -
常用的字符串占位符:
- %s - 可以给任何类型的数据占位(字符串占位符)
- %d - 只能给数字数据占位(整数占位符)
- %f - 只能给数字数据占位(浮点数占位符, 默认保留6位小数)
- %.Nf - 只能给数字数据占位(保留N位小数)
name, age, money = '小花', 25, 15000 message = '%s今年%d岁!月薪:%.2f元' % (name, age, money) print(message) result = '%s%s%s-%s' % ('abc', 12, [10, 20], 3.456) print(result) result = '%d-%d' % (12, 2.34) print(result) result = '%f-%f' % (2.3, 34) print(result) result = '%.2f-%.1f' % (2.3, 34) print(result) # 运行结果 ''' 小花今年25岁!月薪:15000.00元 abc12[10, 20]-3.456 12-2 2.300000-34.000000 2.30-34.0 '''
-
-
f-string
-
f-string的基本用法:如果在字符串的最外面加了f,就可以在字符串中通过{}来给字符串提供内容:{表达式} - 表达式的结果就是对应的字符串内容
name, age = '小明', 18 str3 = f'a:{age}, b:{100}, c:{100 * 2}, d:{100 > 200}, c:{name * 2}, d:{name[-1]}' print(str3) # 运行结果 ''' a:18, b:100, c:200, d:False, c:小明小明, d:明 '''
-
f-string的参数: {提供数据的表达式:参数}
a. 控制小数位数: {提供数据的表达式:.Nf}money = 672828279 result = f'余额:{money:.2f}元' print(result) num = 102.3447 result = f'个数:{num:.0f}' print(result) # 运行结果 ''' 余额:672828279.00元 个数:102 '''
b. 大金额逗号分隔: {提供数据的表达式:,}
money = 165009000 result = f'金额:{money:,}元' print(result) # {提供数据的表达式:,.Nf} - 既控制小数位数,又使用逗号 result = f'金额:{money:,.2f}元' print(result) # 运行结果 ''' 金额:165,009,000元 金额:165,009,000.00元 '''
c. 小数显示成百分比: {提供数据的表达式:.N%}
scale = 0.84 result = f'及格率:{scale:.1%}' print(result) # 运行结果 ''' 及格率:84.0% '''
d.控制填充长度(实现center、rjust、ljust、zfill的功能)
{提供数据的表达式:字符>长度}、{提供数据的表达式:字符<长度}、{提供数据的表达式:字符^长度}
注意:如果没有提供字符,会用空格填充
num = 6 result = f'{num:0>3}' print(result) # '006' result =f'{num:x>7}' print(result) # 'xxxxxx6' result =f'{num:x<7}' print(result) # '6xxxxxx' result =f'{num:x^7}' # 'xxx6xxx' print(result) result = f'编号:{num:>7}' print(result) # 例子 nums = [155, 1, 92, 9, 23, 889, 18, 5821, 47, 8993] for x in nums: print(f'编号:{x:>4}') # 运行结果 ''' 006 xxxxxx6 6xxxxxx xxx6xxx 编号: 6 编号: 155 编号: 1 编号: 92 编号: 9 编号: 23 编号: 889 编号: 18 编号:5821 编号: 47 编号:8993 '''