1.python数据类型详解
python数据类型分类
1).数值型:整数型(int)、浮点型(float)、布尔型(bool 取值:True、False)
2).容器类型
: 字符串型(str)、列表(list)、元祖(tuple)、字典(dict)、集合(set)
3).自定义类型:Person、Animal、Dog、Cat、Student...
4).NoneType:None (理解:不存在、未明确的、未知的)
一. 字符串类型(str)
特点:属于容器类型之一,满足有序的(有索引)、可重复的、不可变的数据类型(不可变:指字符串中某个位置的元素不允许改变,但是可以将整个字符串变量中的地址进行改变(意味着将字符串完全覆盖掉))
1.自定义打印效果的显示
使用:""" ... """ 或者 ''' ... ''' 来定义字符串数据,对于有些情况下,需要对定义的字符数据进行显示样式的把控,可以使用如下的方式定义字符串数据,可以做到换行的效果
1 content = """遥想公瑾当年,小乔出嫁了!
2 雄姿英发,羽扇纶巾,
3 谈笑间,樯橹灰飞烟灭"""
4 content1 = '''遥想公瑾当年,小乔出嫁了!
5 雄姿英发,羽扇纶巾,
6 谈笑间,樯橹灰飞烟灭'''
7 print(content)
8 print(content1)
2.转义字符
转义字符:将字符原本的含义去除,赋予一个新的含义
常见的转义字符如下:
\n: 换行符
\t: 制表符
\b: 退格
\”: 双引号
\': 单引号
如果字符串描述的是一串物理地址,在其中可能会包含一些转义字符,那么对于我们路径的解析会造成错误,所以我们需要在字符串第一个引号的前面显示的追加一个r,目的:就是为了避免转义
1 address = "d:\\basic\\tpython1809\\day02\\note.txt"
2 address = r"d:\basic\tpython1809\day02\note.txt"
3 print(address)
3.字符串的*和+操作
字符串数据和字符串数据之间可以做拼接操作,使用+号来实现
字符串数据和整数之间使用*号连接,作用:让字符串数据重复执行多次
4.字符串的索引
起始索引:0
结束索引:-1 /
length - 1
5.内置函数len()的作用
例如:len(obj) --> 得到容器对象obj的长度/尺寸/容量
6.如何访问字符串元素
1).获取元素:
通过变量名配合下标来实现
2).设置元素:
由于字符串属于不可变的数据类型,所以没有设置元素这一说
7.常见的运行时异常:IndexError
以下代码有问题:由于str1的长度为10,所以它的最大索引为9,
导致代码出现IndexError类型的异常,原因是下标越界了,这种情况是需要避免的
8.字符串的切片操作
目的:从原串中得到部分子串数据,最终原串不会发生改变
格式:字符串变量[[start]:[end]:[step]]
【注意】:内部的中括号表示可选的意思
参数解释:start:起始位置;end:结束位置;step:步长(默认为1),满足含头不含尾的特点(99%的情况) [start,end)
9.占位符
在定义字符串数据时,可能在某些位置并不清楚需要填入什么内容,那么就先将位置占了,等到之后确定了数据再填入进去
1).百分号原则:
符号:
%d:整数占位符
%f:小数占位符
%s:万能占位符
2).大括号原则:
需要配合str类中的format()来使用得到效果
1 name = "jerry" 2 age = 18 3 height = 185.5 4 5 print("姓名:%s,年龄:%d,身高:%.1fcm" %("韩梅梅",21,163.5)) 6 print("姓名:%s,年龄:%010d,身高:%010.1fcm" %(name,age,height)) 7 8 print("最喜欢的歌手:{},最喜欢看的电影:{},最喜欢玩的游戏:{},最喜欢的编程语言:{}".format("张学友","海王","魔兽世界","python")) 9 print("最喜欢的歌手:{3},最喜欢看的电影:{1},最喜欢玩的游戏:{2},最喜欢的编程语言:{0}".format("java","蜘蛛侠","LOL","周杰伦")) 10 print("最喜欢的老师:{teacher},最喜欢看的电影:{film},最喜欢玩的游戏:{game},最喜欢的编程语言:{language}".format(language="js", 11 teacher="微微姐",film="小电影",game="超级玛丽"))
10.字符串中常用的函数
1). ‘sep‘.join(seq) :sep分隔符,可以为空;seq连接的元素序列、字符串、元组、字典
【补充】os.path.join(): 将多个路径组合后返回
2). ljust(width,format):将str数据显示在左侧,如果长度/尺寸不满width,那么右侧补format
3). rjust(width,format):将str数据显示在右侧,如果长度/尺寸不满width,那么左侧补format
4). center(width,format):将str数据显示在中间,如果长度/尺寸不满width,那么左右侧补format
5). zfill(width):将str数据显示在右侧,如果长度/尺寸不满width,那么左侧补0
6). strip(): 去除字符串左、右两侧匹配到的字符数据,返回一个新串
7). lstrip():去除字符串左侧匹配到的字符数据,返回一个新串
8). rstrip():去除字符串右侧匹配到的字符数据,返回一个新串
9). replace(old,new,[number]):将str中的old内容替换为new,默认全部替换;也可以选择性的替换number次
10). split(format):将str以format格式进行切割,返回一个列表对象;默认空参数的split()可以切割的内容:' '、\n、\t
11). index(s):返回字符串s在原串中对应的下标/索引,若存在多个相同数据,返回第一个匹配成功的,如果都没有匹配成功,会报错
12). count(s):返回字符串s在原串中出现的次数,如果一次都没有出现,不会报错,返回0
13). find(format):查找字符串中首次出现的format的位置
14). rfind(format):查找字符串中最后一次出现的format的位置
15). upper():将字符串数据变为全大写
16).lower():将字符串数据变为全小写
17).capitalize():将字符串数据首字母大写,其余字母小写
18). title():将字符串数据首字母大写,其余字母小写 备注:如果存在多个单词,每个单词首字母都要考虑
19). swapcase():将字符串中大写变为小写,小写变为大写
20). startswith(format):判断字符串是否以format开头,函数结果是布尔值
21). endswith():判断字符串是否以format结尾,函数结果是布尔值
22). isalnum():判断字符串的内容是否都是英文、数字字符;如果是,返回True;反之,返回False
23). isalpha():判断字符串的内容是否都是英文字符;如果是,返回True;反之,返回False
24). isdecimal():判断字符串的内容是否都是数字字符;如果是,返回True;反之,返回False
25). isdigit():判断字符串的内容是否都是数字字符;如果是,返回True;反之,返回False
26). islower():判断字符串中英文字符是否全小写;如果是,返回True;反之,返回False 【注意】数字、其它字符不影响
27). isupper():判断字符串中英文字符是否全大写;如果是,返回True;反之,返回False 【注意】数字、其它字符不影响
28). istitle():判断字符串内容中的英文子串(多组)的首字母是否大写
1 lt = ['i','love','you','very','much'] 2 print('-'.join(lt)) 3 print(str.join('#',lt)) 4 5 str1 = 'i love you very much' 6 print(str1.ljust(50,'*')) #i love you very much****************************** 7 print(str1.rjust(50,'-')) #------------------------------i love you very much 8 print(str.rjust(str1,50,'$')) #$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$i love you very much 9 print(str1.center(50,'^')) #^^^^^^^^^^^^^^^i love you very much^^^^^^^^^^^^^^^ 10 print(str1.zfill(50)) #000000000000000000000000000000i love you very much 11 12 str1 = ' ,,,..\ i hate you very much ...,,;;\ ' 13 print(str1.lstrip('\ ,.')) #i hate you very much ...,,;;\ 14 print(str1.rstrip('\;., ')) #,,,..\ i hate you very much 15 print(str1.strip(',\;. ')) #i hate you very much 16 17 str1 = "python啊python,你是我的骄傲!python啊python,我为你自豪!" 18 print(str1.replace('python','java')) #java啊java,你是我的骄傲!java啊java,我为你自豪! 19 print(str1.replace('python','java',2)) #java啊java,你是我的骄傲!python啊python,我为你自豪! 20 21 str1 = 'i love\nabc you\t very\n much' 22 print(str1.split(' ')) #['i', 'love\nabc', 'you\t', 'very\n', 'much'] 23 print(str1.split()) #['i', 'love', 'abc', 'you', 'very', 'much'] 24 print(str1.split('\n')) #['i love', 'abc you\t very', ' much'] 25 print(str1.splitlines()) #['i love', 'abc you\t very', ' much'] 26 27 str1 = 'abcdefgd1234567' 28 print(str1.index('d')) #3 29 print(str1.index('efg')) #4 30 print(str1.index('xyz')) #报错 31 32 str1 = 'dsaalkfaaasdfaaaa2141aaaaaaxyz' 33 print(str1.count('a')) #15 34 print(str1.count('aa')) #7 35 print(str1.count('www')) #0 36 37 str1 = '山不在在高,有仙则灵;水不在在深,有龙则灵;斯是在在陋室,惟吾德馨' 38 print(str1.find('在在')) #2 39 print(str1.rfind('在在')) #24 40 41 str1 = 'today is thursday PM' 42 print(str1.upper()) #TODAY IS THURSDAY PM 43 print(str1.lower()) #today is thursday pm 44 print(str1.capitalize()) #Today is thursday pm 45 print(str1.title()) #Today Is Thursday Pm 46 print(str1.swapcase()) #TODAY IS THURSDAY pm 47 48 str1 = 'hahaha abcdefghijk 32141234 hehehe' 49 print(str1.startswith('h')) #True 50 print(str1.startswith('ha')) #True 51 print(str1.startswith('haha')) #True 52 print(str1.startswith('Haha')) #False 53 print(str1.startswith('hahha')) #False 54 55 print(str1.endswith('e')) #True 56 print(str1.endswith('he')) #True 57 print(str1.endswith('ehe')) #True 58 print(str1.endswith('Hehe')) #False 59 60 str1 = '3214Love&Tdsajflks*^' 61 print(str1.isalnum()) #False 62 print(str1.isalpha()) #False 63 print(str1.isdigit()) #False 64 print(str1.isdecimal()) #False 65 print(str1.islower()) #False 66 print(str1.isupper()) #False 67 print(str1.istitle()) #Ture
二. 列表类型(list)
特点:有序的(有索引、定义和显示的顺序是一致的)、可变的(既可以改变元素的内容也可以自动(扩缩)容)、可重复的、可以存储任何数据类型的元素
1.如何访问列表中的元素
1).获取元素
列表名配合下标获取 --> 例如:lt[0],lt[-1]
2).设置元素(和str有区别)
列表名配合下标 = ... --> 例如:lt[4] = "武大郎"
2.列表的+和*操作
对于+操作而言:将两个列表对象中的元素都组合起来以一个新的列表返回
对于*操作而言:将列表中的元素重复出现n次,以新的列表返回
3.和列表有关的一些函数
append(obj):将obj元素追加到列表的末尾
clear():清空列表,元素没了,列表对象还在 : lt.clear()
4.del关键字配合列表对象/元素使用
目的:回收列表对象,并且回收其中的元素内容(即可以回收列表对象,也可以回收列表元素):del lt
del可以删除列表中指定位置的元素:del lt[1]
5.列表的切片操作
格式和特点和str一模一样...
1 lt6 = ['葫芦娃','黑猫警长','熊出没','灌篮高手','柯南','海尔兄弟'] 2 lt7 = lt6[1:5] 3 print(lt7,type(lt7)) 4 print(lt6,type(lt6)) 5 print(lt6[2:-2]) 6 print(lt6[:]) 7 print(lt6[::-1])
6.归纳总结列表的定义格式
格式一:列表名 = [值1,值2,...,值n]
格式二:列表名 = [变量1,变量2,...,变量n] = [值1,值2,...,值n]
格式三:列表名 = []
7. list中常用的函数
1). append(obj):将obj存入到列表的最后一个位置
2). extend(iterable):将iterable对象中的每个元素分别取出存入到列表的最后位置
3).index(obj):返回obj在列表中出现的索引位置;如果存在多个相同的obj元素,返回的是第一次出现的那个元素的索引;如果一个有没有,直接报错
4). count(obj):返回obj在列表中出现的次数;如果一次都没有出现,返回0
5). pop([index]):如果是空参数的pop(),将列表最后一个元素弹出(作为返回值给程序);如果有参数,必须是索引值,将具体索引位置上的元素弹出
6). remove(element):删除和element匹配的某个元素,没有返回值;如果有多个匹配的,只删除第一个
7). reverse():反转列表元素
8). sort([reverse=True],[key=...]):默认以升序排列(reverse=False),如果想要降序排列,显示定义reverse=True
1 lt = ['路飞','索罗','山治','娜美','乌索普','乔巴','布鲁克'] 2 lt.append('香克斯') 3 print(lt) # ['路飞','索罗','山治','娜美','乌索普','乔巴','布鲁克','香克斯'] 4 lt.append(['卡卡西','鸣人','佐助','樱']) 5 print(lt) # ['路飞','索罗','山治','娜美','乌索普','乔巴','布鲁克','香克斯',['卡卡西','鸣人','佐助','樱']] 6 7 lt = ['路飞','索罗','山治','娜美'] 8 lt.extend(['卡卡西','鸣人','佐助','樱']) # ['路飞', '索罗', '山治', '娜美','卡卡西', '鸣人', '佐助', '樱'] 9 lt.extend('大蛇丸') 10 print(lt) # ['路飞', '索罗', '山治', '娜美', '卡卡西', '鸣人', '佐助', '樱', '大', '蛇', '丸'] 11 lt.extend(200) # TypeError: 'int' object is not iterable 12 13 lt = ['路飞','索罗','山治','娜美','乌索普','乔巴','布鲁克','娜美'] 14 print(lt.index('娜美')) # 3 15 # print(lt.index('娜美1')) # 报错ValueError 16 17 print(lt.count('路飞')) #1 18 print(lt.count('娜美')) #2 19 print(lt.count('娜美1')) #0 20 21 print(lt.pop()) #娜美 22 print(lt) #['路飞','索罗','山治','娜美','乌索普','乔巴','布鲁克'] 23 print(lt.pop(1)) # 索罗 24 print(lt) #['路飞', '山治', '娜美', '乌索普', '乔巴', '布鲁克'] 25 # lt.pop('乔巴') # 报错 非法操作 26 27 lt = ['路飞','索罗','山治','娜美','乌索普','乔巴','布鲁克','娜美'] 28 print(lt.remove('山治')) # None 29 print(lt) #['路飞','索罗','娜美','乌索普','乔巴','布鲁克','娜美'] 30 lt.remove('娜美') 31 print(lt) #['路飞','索罗','乌索普','乔巴','布鲁克','娜美'] 32 33 print(lt.clear()) #None 34 print(lt) #[] 35 36 lt = ['路飞','索罗','山治','娜美','乌索普','乔巴','布鲁克','娜美'] 37 lt.reverse() 38 print(lt) #得到['娜美','布鲁克','乔巴','乌索普','娜美','山治','索罗','路飞'] 39 40 lt1 = [53,23,-17,9,-21,0,79,88,-30] 41 lt1.sort() 42 print(lt1) #[-30, -21, -17, 0, 9, 23, 53, 79, 88] 43 lt1.sort(reverse=True) 44 print(lt1) #[88, 79, 53, 23, 9, 0, -17, -21, -30]
三. 元祖类型(tuple)
特点:有序的(有索引、定义和显示的顺序是一致的)、不可变的(和str一样理解)、可重复的、可以存储任何数据类型的元素
1.如何访问元祖中的元素
1).获取元素
元祖名配合下标获取 -->
例如:tp[0],tp[-1]
2).设置元素(和str保持一致)
没有此操作,是非法的,原因元祖是不可变的数据类型
2.元祖的+和*操作
对于+操作而言:将两个元祖对象中的元素都组合起来以一个新的元祖返回
对于*操作而言:将元祖中的元素重复出现n次,以新的元祖返回
【注意事项】元祖有没有类似于列表的append或者clear函数,因为append和clear这类函数改变的都是容器对象内部的元素内容,这和不可变所冲突
3.del关键字配合元祖对象使用
目的:回收整个元祖对象,但是对于tuple类型而言无法回收其任何一个元素
4.元祖的切片操作
格式和特点和str一模一样...
5.归纳总结元祖的定义格式
格式一:元祖名 = (值1,值2,...,值n)
格式二:元祖名 = (变量1,变量2,...,变量n) = (值1,值2,...,值n)
格式三:元祖名 = ()
格式四:元祖名 = (值1,) 【注意】:定义元祖并且只有一个元素,必须在元素后显示的加上一个逗号
四. 字典类型(dict)
特点:无序性(没有索引,通过键找值)、可变的数据类型(值可变、键不可变);字典的结构是键值对组合 --> key-value对象;键(key):唯一性(不可重复)、不可变的数据类型(例如:list就不能作为键);值(value):没有任何要求,可以是任何类型的数据,甚至可以重复
1.如何访问字典元素
1).获取值:字典名配合键名可以得到对应的值
1 dic1 = {"name":"韩梅梅","age":23,"height":165.0} 2 dic1['name'] # 韩梅梅
2).设置值:字典名配合键名 = ...
【注意事项】1.在定义字典对象的时候如果出现了重复的键,保留键名的同时,将后者的值覆盖前面的值。2.在添加新的键值对的过程中,如果原字典对象中没有此键,那么就将其键值对一并加入进去,称为一个元素。
1 dic2 = {"name":"韩梅梅","age":23,"height":165.0,"name":"李雷"} 2 dic2['weight'] = 120 3 print(dic2)
2.字典相关函数
clear():清空字典元素,保留空字典对象,dic2.clear( )
3.和关键字del配合使用
目的:回收键值对组合,或者整个字典对象;del dic2['age'] # 删除年龄键值对;del dic2 # 删除所有(数据和整个字典结构)
4.通过键查找值的情况
方式一:字典名[键名] 如果键不存在,报错;出现KeyError类型的异常;dic2["name1"]
方式二:字典名.get(键名) 如果键不存在,不会报错,会返回给程序一个None值;此方式比较安全/友好(更加好用);dic2.get("name1")
【注意事项】键:必须满足不可变的数据类型;枚举:int、float、bool、str、None等都可以充当键,满足唯一性(不可重复);值:没有要求,任何类型都可以,甚至可重复。
5.dict中常用的函数
1). dic1.update(dic2):将dic2中每一个键值对和dic1中的进行比较,如果dic1中经过存在相同的 键,那么就保证键不变,值被覆盖;如果dic1中没有相应的键值对,那么就将其加入进dic1中
items():返回一个dict_items类型的对象,内部封装了一个一个元祖充当其元素,元祖中包含键和值两块内容
keys():返回一个dict_keys类型的对象,内部封装了键集
values():返回一个dict_values类型的对象,内部封装了值集
popitem():弹出最后一个键值对,以元祖的形式返回
pop(key):传入key时,弹出整个键值对,最终返回给程序value
copy():拷贝 ;dict1.copy()
1 dic1 = {"name":"张三丰","age":120,"height":168.0} 2 dic2 = {"name":"金毛狮","weight":100,"faceValue":False,"girlFriend":"灭绝师太"} 3 dic1.update(dic2) 4 print(dic1) #得到{'name': '金毛狮王', 'age': 120, 'height': 168.0, 'weight': 100, 'faceValue': False, 'girlFriend': '灭绝师太'} 5 print(dic2) #得到{'name': '金毛狮王', 'weight': 100, 'faceValue': False, 'girlFriend': '灭绝师太'} 6 7 dic1 = {"name":"张三丰","age":120,"height":168.0} 8 print(dic1.items(),type(dic1.items())) #得到dict_items([('name', '张三丰'), ('age', 120), ('height', 168.0)]) <class 'dict_items'> 9 print(dic1.keys(),type(dic1.keys())) #得到dict_keys(['name', 'age', 'height']) <class 'dict_keys'> 10 print(dic1.values(),type(dic1.values())) #得到dict_values(['张三丰', 120, 168.0]) <class 'dict_values'> 11 12 dic2 = {"name":"金毛狮","weight":100,"faceValue":False,"girlFriend":"灭绝师太"} 13 print(dic2.popitem()) #('girlFriend', '灭绝师太') 14 print(dic2) #{'name': '金毛狮王', 'weight': 100, 'faceValue': False} 15 print(dic2.pop('weight')) #100 16 print(dic2) #{'name': '金毛狮王', 'faceValue': False} 17 18 dic3 = dic2.copy() # id改变 19 print(dic2,id(dic2)) #得到{'name': '金毛狮王', 'weight': 100, 'faceValue': False, 'girlFriend': '灭绝师太'} 5999280 20 print(dic3,id(dic3)) #得到{'name': '金毛狮王', 'weight': 100, 'faceValue': False, 'girlFriend': '灭绝师太'} 5999352
五. 集合类型(set)
特点:无序性(没有索引,每一次显示的效果都不一样)、唯一性(不可重复)、可变的、只能存放不可变的数据。使用场景:在实际开发过程中,经常用于对数据进行去重(过滤)
1.集合的一些常用操作如下
以下的操作都是在两个集合对象中使用
符号:
&:取交集
|:取并集
-:取差集(对于取差集的操作,需要关注的是谁在-号的前面(左侧),返回的就是谁独有的数据)
^:先取并集再舍弃交集部分
【注意事项】对于集合和集合之间没有+操作。会出现TypeError类型的错误
2.集合相关的函数
clear():清空集合,保留外壳
3.和关键字del配合使用
目的:回收集合元素,或者回收整个集合对象
1 s1 = {"貂蝉","西施","王昭君","玉环"} 2 s1.clear() 3 print(s1) # set() 4 del s1 5 print(s1) # 直接全删了,什么都不剩,所以报错NameError:name's1'is not defined
思考:删除"貂蝉"这个数据,该怎么做到?
1).可以使用remove(obj)函数来实现;2).先将集合转换为列表 --> 使用转换函数list() , 再使用循环的思想,来处理列表对象,一旦匹配上了"貂蝉",就可以使用del关键字进行数据删除的行为
1 # 方法1 2 s1.remove("貂蝉") 3 4 # 方法2 5 lt = list(s1) # 将集合转换为列表 6 i = 0 7 while i < len(lt): 8 if lt[i] == "貂蝉": 9 print(lt[i]) 10 del lt[i] 11 i += 1 12 print(lt)
4.定义一个空集合
s1 = set( )
5. set中常用的函数
1). add(e):添加一个元素e(不可变的数据类型)到集合中
2). pop(): 只能是空参的(集合没有索引的概念),随机从集合中弹出一个元素
3). remove(e):从集合中删除和e匹配的元素
4).clear():清空集合,保留容器
5).copy(): 拷贝
6).issubset(s):判断一个集合是否是另一个集合的子集;s1.issubset(s2) >>> s1是否是s2的子集
7). issuperset(s):判断一个集合是否是另一个集合的父集;s1.issubset(s2) >>> s1是否是s2的父集
8). isdisjoint(s):判断两个集合之间是否存在交集,如果存在,返回False;反之,返回True
1 s1 = {10,100,3.14,"abcd"} 2 s2 = {3.141,100} 3 s1.add('hello') 4 print(s1.pop()) 5 s1.remove(100) 6 s1.clear() 7 print(s1) #set() 8 print(s1.issubset(s2)) #False 9 print(s1.issuperset(s2)) #True 10 print(s1.isdisjoint(s2)) #False 11 print(s2.isdisjoint(s1)) #False