一、数字类型1、数字类型 int 和float数字类型即变量的值如 age18,18则是我们保存的数据变量的是用来反映/保持状态以及状态变化的毫无疑问针对不同的状态就应该用不同类型的数据去标识数字类型只能存一个值是不可变类型不可变类型可以哈希#int整型 定义age10 # ageint(10) 用于标识年龄等级身份证号qq号个数 #float浮点型 定义:salary3.1 #salaryfloat(3.1) 用于标识工资身高体重2、int类型常用的方法下面代码所使用的bin()、oct()、hex()在进制转换中经常用到大家可以了解一下#常用操作内置的方法 print(bin(3)) #十进制转成二进制0b11 print(oct(8)) #十进制转成八进制0010 print(l0) #10 print(hex(l6)) #十进制转成十六进制0xl0在进行用户交互程序的时候我们常用.isdigit(这个判断用户输入是不是数字来进行下一步操作这样就避免了程序出错但是需要注意的是用户输入的内容默认是字符串判断一个字符串是否是数字我们使用这个方法。age input (your age:) if age.isdigit(): age int(age) # 如果大家在pycharm中敲代码if语句下面是会自动缩进的如果在普通文档编 辑器中 敲下Tab键就可以缩进 age 1 print (age)3、Python其他数字类型了解#int (整型) 在32位机器上整数的位数为32位取值范围为-2**312**31-1即-21474836482147483647 在64位系统上整数的位数为64位取值范围为-2**632**63-1即92233720368547758089223372036854775807 #long (长整型) 跟c语言不同Python的长整数没有指定位宽即Python没有限制长整数数值的大小但实际上由于机器内存有限我们使用的长整数数值不可能无限大。 注意自从Python2.2起如果整数发生溢出Python会自动将整数数据转换为长整数所以如今在长整数数据后面不加字母也不会导致严重后果了。 注意在Python3里不再有long类型了全都是int a 2**64 #表示在命令行模式下进行输入 t ype(a) #type()是查看数据类型的方法 type int # int类型 b 2**60 type(b) type int #complex复数型 x1-2j x.imag -2.0 x.real 1.0二、字符串类型1、字符串类型介绍在python中加了引号的字符就是字符串类型用于标识描述性的内容如姓名性别国籍种族定义形式:nameAlbert # namestr(Albert)字符串格式化name input(请输入名字) print(你好, %s % name # %s其实可以理解为占位符在输出时会使用字符串后面的%后面的变量的值进行替换2、单引号双引号和三引号的区别#那单引号、双引号、多引号有什么区别呢让我大声告诉你单双引号木有任何区别只有下面这种情况你需要考虑单双的配合 msg My name is Albert , Im 18 years old #多引号有什么作用呢作用就是多行字符串必须用多引号 msg 今天我想写首小诗, 歌颂我的同桌, 你看他那乌黑的短发, 好像一只炸毛鸡。 print(msg) # 三引号里面写多行内容3、字符串的拼接#数字可以进行加减乘除等运算字符串呢让我大声告诉你也能what是的但只能进行相加和相乘运算。 namealbert age18 nametage #相加其实就是简单拼接 albert18 name*5 albertalbertalbertalbertalbert #注意1 字符串1字符串3并不会在字符串1的基础上加字符串3而是申请一个全新的内存空间存入字符串1和字符串3 相当字符串1与字符串3的空间被复制了一次 #注意2只能字符串加字符串不能字符串加其他类型 字符串拼接只能在字符串之间进行且只能相加或相乘)字符串类型只能存一个值是不可变类型可以哈希。4.字符串类型常用的方法1按照索引取值字符串是不可变类型并不能改变字符串的值取值时最多可以有三个参数分别是起始位置结束为止和步长可以正向取值反向取值起始位置大于结束位置或者没有起始位置与结束位置步长为-1表示从最后一个开始步长为负数)hobbies music basketball print(hobbies [0]) print(hobbies [l]) print(hobbies [5]) print(hobbies [0:5]) print(hobbies[:5]) print(hobbies[052l) #从第零个元素到第四个元素隔一个元素取一次 print(hobbies[05-2l) #取不到元素因为表示从第零个元素到第四个元素逆序-2为负数隔一个元素取一次 第零个元素前面没有元素了所以什么都取不出来 print(hobbies[11:5-2]) #从第11个元素到第六个元素逆序隔一个元素取一次 print(hobbies[-ll) # 取倒数第—个字符 print(hobbies[-2l) # 取倒数第二个字符2长度运算print(len(name)) #可用来求string类型、列表等的长度3成员运算print(a in Albert) #判断a是否在Albert中在则返回True否则返回False # False print(a not in Albert) # True4移除空白print( name.lstrip()) #移除左边空白 print(name .rstrip()) #移除右边空白 print( name .strip()) #移除两边空白5切分切分的作用比如给你一条数据“Kobe24Lakers你需要把Kobe的号码和所属球队都提取出来那么你可以用以下方式进行切分会返回一个列表。print(Kobe 24 Lakes.split( )) print(n a me.split(,)) print(n,a me.split(,)) print(n,/a /me.split(/,1)) #数字表示切割次数默认全部切割 print(n,a /me.split(/ )) print(alblc.rsplit(|1)) #从右边开始切割6组合print(a.join(1234)) print(a.join(bcde)) tag print(tag.join([I, say, hello, world])) #可迭代对象必须都是字符串7替换print(abc name id.replace(a, card)) #将前面字符串中的a全部替换为card name albert say :i have a dream,my name is albert #注意此时name原来的值并没有改变而是产生了一个替换之后新的值 print(name.replace(albert, Albert1)) #把name中的albert替換为albert只替換1次默认全部替换8字符串其他操作# find,rfind,index,rindex,count namealbert say hello print(name.find(o,1,3)) #顾头不顾尾找不到则返回-1不会报错找到了则显示索引 # print(name.index(e,2,4)) #同上但是找不到会报错 print(name.count(e,1,3)) #顾头不顾尾如果不指定范围则查找所有 # center,ljust,rjust,zfill namealbert print(name.center(30,-)) print(name.ljust (30, *)) print(name.rjust(30,*)) print(name.zfill(50)) #用0填充 # expandtabs namealbert\thello print(name) print(name.expandtabs (l)) # captalize,swapcase,title print(name.capitalize()) #首字母大写 print(name.swapcase()) #大小写翻转 msgalbert say hi print(msg.title()) #每个单词的首字母大写 #is数字系列 #在python3中 num1b4 # bytes num2u4 # #unicodePython3中无unicode num3四 # 中文数字 num4IV #罗马数字 # isdigit:bytes,unicode print(numl.isdigit()) #True print(num2.isdigit()) #True print(num3.isdigit()) #False print(num4.isdigit()) #False # isdecimal:uncicode #bytes类型无isdecimal方法 print(num2.isdecimal()) #True print(num3.isdecimal()) #Flase print(num4.isdecimal()) #Flase #isnumbericunicode中文数字罗马数字 #bytes类型无isnumberic方法 print(num2.isnumeric()) #True print(num3.isnumeric()) #True print(num4.isnumeric()) #True #三者不能判断浮点数 num54.3 print(num5.isdigit()) print(num5.isdecimal()) print(num5.isnumeric()) 总结: 最常用的是isdigit可以判断bytes和unicode类型这也是最常见的数字应用场景 如果要判断中文数字或罗马数字则需要用到isnumeric # is其他 print ( ) namealbl23ert print(name.isalnum()) #字符串由字母或数字组成 print(name.isalpha()) #字符串只由字母组成 print(name.isidentifier()) print(name.islower()) print(name.isupper()) print(name.isspace()) print(name.istitle())三、列表1、列表类型基本介绍在口内用逗号分隔可以存放n个任意类型的值用于标识存储多个值的情况比如一个人有多个爱好定义格式示例students[albert,james,kd,] # 或者studentslist[albert,james,kd,])列表可以存储多个值是有序的是可变类型不可以哈希。2、列表类型常用的方法1添加元素append方法 在列表最后追加元素ll [a, b, c, d, ] ll.append(e) print(ll) print(ll.append(e) ) #在队尾追加没有返回值 # [a, b, c, d, e] # Noneinsert方法在列表中插入元素ll [a, b, c, d, ] ll.insert(3x # 3 指定插入索引3这个位置就是d”这个位置把d′顶到了后面 print(ll) #insert可以指定插入的位置 # [a, b, c, x, d]extend方法 在列表中同时插入多个元素extend方法使用以及与append方法的区别append是整体添加ll [1, 2, 3, 4, 5, ] ll.append([6, 7, 8, 9, ]) # ll.append(*[6, 7, 8, 9, ]) #会报错 print(ll) ll.extend([6, 7, 8, 9]) print(ll)只能接收一个参数如果出现打散的情况还是会被识别成多个参数因为程序执行执行是从左到右从上倒下执行的当出现时这个列表已经被打散了因而会被程序识别成被传入了多个参数。extend是逐个添加ll [1, 2, 3, 4, 5,] ll.extend([6, 7, 8, 9]) print(ll) ll.extend(abc) print(ll) ll.extend(a) #也是可迭代对象 print(ll) # ll.extend(l) #报错不可迭代 print (ll)extend在执行添加的时候被传入的参数必须是可迭代对象这样通过迭代就解决了同时传入多个参数的问题如果你还不知道可迭代对象放心你很快就会知道的。2删除元素pop删除有返回值默认删除列表中最后一个指定删除索引值ll [1, 2, 3, 4, 5, 6, ] print(ll·pop()) # 移除列表中的某个元素默认是最后一个元素这个是有返回值的因为这是一个可迭代类型和我们前面的extend一类 print(ll) print(ll.pop(2)) #2指定是列表中的索引值 print(ll)remove 删除 没有返回值没有默认值指定被删除的元素111 [1, 2, 3, 4, 5, 6, ] print(ll.remove(2)) #注意这个2 是列表的元素2不是索引l值和上述pop区分清楚pop移除的是索引值所对应的元素 # print(ll.remove()) #报错 print(ll)clear删除 保留列表名称清空里面的值ll [a, a, c, d, e, b, c] ll.clear() print(ll)del删除 通用删除 但是一般不用ll [1, 2, 3, 4, 5, 6, ] del ll[2] # 按索引ll[0] 1, ll[1]2,11[2]3 print(ll) ll [1, 2, 3, 4, 5, 6, ] del # 在内存中删除11相当于没有定义l # print(ll) #报错3)更改元素作者注意与insert插入的不同都是以原来的为位置为参照insert是挤开本质是添加而这里是替换ll [1, 2, 3, ] ll[2] 4 #将索引2所代表的元素替换为4 print(ll)(4)查找元素按照索引或者指定列表中的元素查找ll [a, b, c, d, e, b, c] print(ll.index(a)) #返回a在ll的索引值 print(ll.index(b,1,4)) #两个数字分别对应起始位置和结束位置 print(ll[0:5]) #按照索引取值和字符串的用法相同 print(ll[:5]) print(ll[0:5:2]) print(ll[:-1]) print(ll[:-2]) print(ll[5:1:-2])把列表分段查找ll [a, b, c, d, e, b, c] a int(len(ll)/2) print(ll[:a]) #从中间位置开始列出前面所有的元素 print(ll[a:]) #从中间位置开始列出后面所有的元素使用enumerate对列表枚举ll [a, b, c, d, e] for i, x in enumerate(ll, l00): #100指定枚举开始的数字 print(i, x)(5统计长度print(len([l,2,3,4,]))(6统计元素个数print([a,b].count(a))(7) 排序reverse反序排序ll [a, 1, b, c, d, e, b, c] ll.reverse() print(ll)sort按照ascii码来进行排序ll [a, 1, b, c, d, e, b, A, Z, c] ll.sort() print(ll) ll.sort(reverseTrue) print(ll)(8复制列表ll [a, 1, b, c, d, e, b, A, Z, c] print(ll.copy())(9Python中的赋值浅拷贝与深拷贝区别赋值对于复制的操作最简单的就是赋值指的是新建一个对象的引用新建目标对象与原来的目标对象指向同一个内存地址赋值只相当于增加了一个引用并没有开辟新的内存空间。如下图所示用 id 验证下就知道list1 和 list2 仍然是同一个东西。那么他们内部的元素自然也是一样的对其中一个进行修改另一个也会跟着变list1 [1, 2, [3, 4], [5, [6, 7]]] print(listl:, id(listl)) print([id(i) for i in list1]) list2 list1 print(list2:, id(list2)) print([id(i) for i in list2]) print(list1 is list2) print(list1[0] is list2[0]) print(listl[2] is list2[2]) list2[0] -1 print(list1) list2[2][1] -1 print(list1)因此有人将此操作称为“旧瓶装旧酒”只是多贴了一层标签这不能达到我们的目的。要得到一个对象的“拷贝”我们需要用到copy方法。浅拷贝浅拷贝顾名思义就是拷贝的比较浅我们可以把赋值认为是新建了一个对象的引用把原来被对象内存空间的数据指向新的变量这时同一块内存空间指向两个变量。浅拷贝与赋值不同既然是拷贝那么就是要开辟一块新的内存空间复制的是原来被拷贝对象内多个元素对象的引用有几个元素对象就赋值几个元素对象的引用也有人把这种操作称为“新瓶装旧酒”。不过如果旧的酒瓶里面如果还套了一个酒瓶子那你就需要注意了。因此不论是对拷贝对象或者是被拷贝对象内一个可变类型元素内的元素的修改包含添加修改和删除都会引起另外一方的变化。但是如果是直接对对象内的一级元素当作一个整体进行修改这时对可变类型元素的元素只能是删除虽然他们的元素有共享的内存地址但是拷贝对象或者被拷贝对象元素内的引用都是独立的删除了其中一方的一个引用另外一方的引用依然存在。from copy import copy list1 [1, 2, [3, 4], [5, [6, 7]]] print(list1:, id(list1)) print([id(i) for i in list]) list2 copy(list1) print(list2:, id(list2)) print([id(i) for i in list2]) #1判断论证过程 print(list1 is list2) #id不同自然不是id用来形象表示内存地址 print(list1[0] is list2[0]) #两者之间对应的元素都指向同一个地址 print(list1[2] is list2[2]) #2对一级元素整体修改论证(其实此时可变类型元素也只能当作不可变来修改) list1[0] -1 #修改列表1或2都是单独变化的 print(listl) print(list2) list2[1] -2 print(listl) print(list2) list1[2] -3 print(list1) print(list2) list2[2] -30 print(list1) print(list2) #3给对象添加元素 list1.append(add1) print(list1) print(list2) list2.append(add2) print(list1) print(list2) #4删除 list1.pop() print(list1) print(list2) list2.pop() print(list1) print(list2) listl.pop() print(list1) print(list2) #5只有对对象内一个可变类型元素内的元素的修改包含添加修改和删除才会同步变化list2[-1][0] 5-55 print(list1) print(list2) ##换成1ist1也是一样但需要把上面的部分代码注释掉确保索引位置不会出错 #list1[3][0] 5-55000 # print(list1) # print(list2)深拷贝深拷贝其实与浅拷贝有本质的区别它不会复制任何的引用对象内的所有元素子元素孙子元素重孙元素曾孙元素的数据都是由复制而来因此这样的操作被称为“新瓶装新酒”。它的实现原理就是递归只要任意元素内仍然有子元素就会复制子元素的数据放到新的内存地址。既然这样在使用深拷贝后被拷贝对象的改变不会引起拷贝对象的任何改变。import copy list1 [1, 2, 3, 4, 5, [6, 7, 8, ]] list2 copy.deepcopy(list1) print(list1) print(list2) list1[5].append(9) print(list1) print(list2) list1.append (6) print(list1) print(list2) list1.pop( ) print(list1) print(list2)复制与深浅拷贝总结赋值新建一个原来对象内存地址的引用对象本身不开辟新的内存空间浅拷贝新建多个原来对象内一级子元素内存地址的引用对象本身需要开辟新的内存空间深拷贝复制原来对象内的所有级子元素的数据所有的数据都开辟新的内存空间。四、元组与列表类型相比非常类似只不过门换成作用用于存储多个值对比列表来说元组不可变是可以当做字典的key的不可更改主要是用来读。age(11,22,33,44,55) # 本质agetuple((11,22,33,44,55))元组可以存储多个值是有序的是不可变类型可以哈希。元组常用的方法请参考列表常用方法需要注意的是元组只能取值而不能改变元组的值五、字典1.字典类型基本介绍字典用于存放一个人的信息姓名性别年龄很明显是多个值既然是存多个值我们完全可以基于刚刚学习的列表去存放如下#既然如此我们为何还要用字典 info[albertmale,18] #定义列表的目的不单单是为了存储还要考虑取值如果我想取出这个人的年龄可以用 info[2] # 但这是基于我们已经知道在第3个位置存放的是年龄的前提下我们才知道索引2对应的是年龄即 # # name, sex, age info[albert,male,18] 而这完全只是一种假设并没有真正意义上规定第三个位置存放的是年龄 于是我们需要寻求一种即可以存放多个任意类型的值又可以硬性规定值的映射关系的类型 比如keyvalue这就用到了字典 字典用于标识存储多个值的情况每个值都有唯一一个对应的key可以更为方便高效地取值字典的定义格式如下:#在{}内用逗号分隔可以存放多个keyvalue的值key一般是字符串value可以是任意类型 info{name:albert,age:18sex:18} # infodict({name:albert,age:18,sex:18})字典可以存储多个值是无序的是可变类型不可哈希。2.字典类型常用的方法1)增加元素通过键值对的方式ll { name: albert, age: 18, gender: male } ll[hobbies] music print(ll)用fromkeys构造一个字典 第一个参数迭代循环的字典的key第二个参数表示value 可以多个key循环对应这个value也可以只有一个key也可以没有value a ll.fromkeys (ll, I am Albert) print(a) b dict.fromkeysname# 必须有一个可迭代类型作为字典的key print(b) b dict.fromkeys(e) #也可以迭代 print (b) # b dict.fromkeys(l) ##报错数字类型不可迭代 b dict.fromkeys([l,2,3,]) print (b)2删除元素del通过字典的key删除ll { name: albert, age: 18, gender: male } del ll[name] print(ll)pop 或者popitem删除ll { name:albert, age: 18, gender:male } res ll.pop(name) #删除指定key的value并拿到一个返回值 print(res) print(ll) res2 ll.popitem() #随机返回并删除字典中的一对键和值一般删除末尾对。 #如果字典已经为空却调用了此方法就报出KeyError异常。 print(res2) print(ll)3更改元素通过键值对的方式ll { name: albert, age: 18, gender male,3:3, } ll[name] 老胡 print(ll)通过setdefault 或者update操作两者使用和区别如下setdefault只添加不修改dl { name: albert, age: 18, } dl.setdefault(name, Albert) dl.setdefault(gender, male) print(dl)update既添加也修改1dl { name: albert, age 18, } dl.update({nameAlbert, gender: male }) #注意传参方式的不同 print(dl)(4)查找元素通过键值对查找ll { name: albert, age: 18, gender: male } a ll[name] print(a)通过get方法查找ll { name: albert, age: 18, gender: male } a ll.get(hobbies) #找不到不报错 print(a)通过enumerate 枚举dl { name: albert, age: 18, gender: male, 3:3, } for a in enumerate(dl): print(a)通过.keysO,values(,.items)等方法dl { name: albert, age: 18, gender: male, 3:3, } a dl.keys() print(a) print(list(a)[0]) a dl.values() print (a) print(list(a)[0]) a dl.items() print(a) print(list(a)[0])通过for循环遍历dl { name: albert, age: 18, gender: male, 3:3, } for k,v in dl.items(): print(k, v)5成员运算与长度运算参考列表的运算方法成员运算的依据是字典的key而不是value长度运算都可以作为参考的依据六、集合类型花括号内多个元素用逗号分割用来存储多个值并且是无序的那么这多个值不能用来取值但是我们可以使用它来进行去重(比如去掉列表中重复的元素)和关系运算。#集合的元素遵循三个原则 1每个元素必须是不可变类型 (可作为字典的key) 2没有重复的元素 3无序 #注意集合的目的是将不同的值存放到一起不同的集合间用来做关系运算无需纠结于集合中单个值集合类型可以存多个值是无序的是可变类型不可以哈希。关系运算练习有如下两个集合piano是报名钢琴课程的学员名字集合violin是报名小提琴课程的学员名字集合 piano{albert孙悟空周星驰朱茵林志玲} violin{猪八戒郭德纲林忆莲「周星驰} 1.求出即报名钢琴又报名小提琴课程的学员名字集合 2求出所有报名的学生名字集合 3.求出只报名钢琴课程的学员名字 4求出没有同时这两门课程的学员名字集合参考答案#求出即报名钢琴又报名小提琴课程的学员名字集合 print(piano violin) #求出所有报名的学生名字集合 print(piano | violin) #求出只报名钢琴课程的学员名字 print(piano - violin) #求出没有同时这两门课程的学员名字集合 print(piano ^ violin)七、布尔类型计算机俗称电脑即我们编写程序让计算机运行时应该是让计算机无限接近人脑或者说人脑能干什么计算机就应该能干什么人脑的主要作用是数据运行与逻辑运算此处的布尔类型就模拟人的逻辑运行即判断一个条件成立时用True标识不成立则用False标识。#布尔值一个тrue一个False a3 b5 ab #不成立就是False即假 Flase ab #成立就是тrue即真 True #接下来就可以根据条件结果来干不同的事情了 if a b: print(a is bigger than b ) else: print(a is smaller than b ) #上面是伪代码但意味着计算机已经可以像人脑一样根据判断结果不同来执行不同的动作。布尔类型的重点知识#所有数据类型都自带布尔值1、None0空空字符串空列表空字典等三种情况下布尔值为False2、其余均为真可变类型与不可变类型 重点#1.可变类型在id不变的情况下value可以变则称为可变类型如列表字典#2。不可变类型value一旦改变id也改变则称为不可变类型id变意味着创建了新的内存空间)八、collections容器数据类型1.namedtuple 命名元组from collections import namedtuple # 从collections库中导入namedtuple 导入外部库) #创建一个命名元组对象 point namedtuple(p, [x, y]) #p代表名称x和y为内容 p point(1, 2) print(p) print(p.x) #1 print(p·y) #22.deque 超级列表数据结构中比较常用的双向队列在python中可使用deque实现。from collections import deque #类似列表list的容器实现了在两端快速添加append和弹出pop) d deque(abcd) for i in d: print(i) print(d[0]) print(d[1]) d.append(e) #从右边加入 print(d) d.appendleft(x) #从左边加入 print(d) d.pop() #从右侧弹出 print(d) d.popleft() #从左侧弹出 print(d) deque(reversed(d)) #反转顺序 print(d) # d list(d) #转化成list # d list(reversed(d)) # print (d) d.extend(xyz) #从右侧添加 print(d) d.extendleft(nba) #从左侧添加 print(d) d.rotate(1) #把最右边的元素挪到最左边 print(d) d.rotate(-1) #把最左边的元素挪到最右边 print(d) d.clear() #清空 # d.pop() #报错3.ChainMap 链映射from collections import ChainMap 一个ChainMap类是为了将多个映射快速的链接到一起这样它们就可以作为一个单元处理。 它通常比创建一个新字典和多次调用update()要快很多。 这个类可以用于模拟嵌套作用域并且在模版化的时候比较有用。 #链映射的用法 dictl {name: Albert, age: 18} dict2 {weight: 65, height: 180} res list(ChainMap(dict1, dict2)) print(res)4.Counter计数字典from collections import Counter #计数 cnt Counter() for word in [red, blue, red, green, blue, blue]: cnt[word] 1 #对word的计数数量加 print(cnt) # Counter({blue: 3, red 2, green: l}) # 数学运算 C Counter(a3, bl) d Counter(al, b2) print(c d) #相同的部分相加 # Counter({a 4, b3 }) print(c - d) #相同的部分相减 # Counter({a 2}) print(c d) #相同的部分取最小 # Counter{a l, b 1}) print(c | d) #相同的部分取最大 # Counter({a 3, b2})Collections容器类型一共有9种除了上面介绍的4种之外还有OrderedDictdefaultdictUserDictUserListUserString他们的用法不是完全相同但是使用起来并不复杂更多Collections容器类型数据结构详见官方文档collections --- 容器数据类型 — Python 3.14.4 文档