4.3.3字典类型的方法values()方法功能获取字典中的所有值d{202101:张三,202102:李四,202103:王五} print(d.values())代码执行结果dict_values([张三, 李四, 王五])items()方法功能获取字典中的所有键值对信息d{202101:张三,202102:李四,202103:王五} print(d.items())代码执行结果dict_items([(202101, 张三), (202102, 李四), (202103, 王五)])pop参数方法功能删除字典中的数据参数是键时删除字典中对应的键值对d{202101:张三,202102:李四,202103:王五} ad.pop(202102) print(d.a){202101: 张三, 202103: 王五} 李四4.3.4字典的遍历访问字典内容用for循环遍历d {202101:张三,202102:李四,202103:王五} for a in d: print(a)代码执行结果202101202102202103由于for循环的循环内容为字典d,由于字典d中的每个数据都包含键和值因此循环时只能遍历到对应的键而无法获取值的信息获取字典中键对应的值在print中加入d[a]d {202101:张三,202102:李四,202103:王五} for a in d: print(a,d[a])代码执行结果202101 张三202102 李四202103 王五如果同时获取字典中的键信息和值信息可以用下面代码d {202101:张三,202102:李四,202103:王五} for a in d.items(): print(a)代码执行结果:(将每个键值对信息以元组的形式返回(202101, 张三)(202102, 李四)(202103, 王五)4.3.4数据维度一维数据一行数据ls[34,67,89]二维数据是一个表格ls [[日期, 芯片, 手机, 智能设备],\ [1日, 4556.448898, 1412.691145, 1070.940706],\ [2日, 5857.880571, 1103.11709, 742.1934921],\ [3日, 1435.169954, 672.2047677, 74.65002242],\ [4日, 1448.831392, 437.9865427, 10.04904148]] print(ls[3][2])获取该二维数据中的某个元素可以用ls[1][2]代码。三维数据data { 北京总营收: [[日期, 芯片, 手机, 智能设备],\ [1日, 5982.271554, 667.7469328, 681.8992432],\ [2日, 947.6723447, 1342.564086, 624.4761491],\ [3日, 1972.280153, 196.8478844, 407.7039686],\ [4日, 5689.629183, 88.427656, 868.5242993]],\ 上海中部营收: [[日期, 芯片, 手机, 智能设备],\ [1日, 2560.440986, 642.8313724, 506.758806],\ [2日, 2030.521018, 551.9430133, 1348.007136],\ [3日, 2783.338123, 1361.787513, 144.9933128],\ [4日, 5889.517584, 401.0775644, 363.2010706]],\ 深圳南部营收: [[日期, 芯片, 手机, 智能设备],\ [1日, 4556.448898, 1412.691145, 1070.940706],\ [2日, 5857.880571, 1103.11709, 742.1934921],\ [3日, 1435.169954, 672.2047677, 74.65002242],\ [4日, 1448.831392, 437.9865427, 10.04904148]],\ 四川西部营收: [[日期, 芯片, 手机, 智能设备],\ [1日, 697.6905941, 1001.156037, 1297.117534],\ [2日, 248.3548823, 1205.078142, 2905.572037],\ [3日, 1042.229159, 167.3207017, 5067.674268],\ [4日, 1399.68792, 233.1417131, 1870.897907]] }项目案例实现统计学生信息任务设计一个用于自动统计各班长候选人的总得票数的程序Ddict() ls[王五,张三,李四,李四,李四,朱七,李四,王五,张三,张三] for vote in ls: D[vote]D.get(vote,0)1 print(D)项目实现结果{王五: 2, 张三: 3, 李四: 4, 朱七: 1}从统计结果看出李四的最高每个人都来进行投票不确定候选人是谁单纯的统计谁的票最高增加2~7行代码这一部分主要用于自动登记学生投票的过程将每一位学生输入的信息都保存到列表ls中,代码如下ls[] while True: name input(请输入您要投票的内容) if name !结束: ls.append(name) else: break D dict() for vote in ls: D[vote] D.get(vote,0)1 print(D)代码运行结果请输入您要投票的内容王五请输入您要投票的内容张三请输入您要投票的内容李四请输入您要投票的内容李四请输入您要投票的内容李四请输入您要投票的内容朱七请输入您要投票的内容李四请输入您要投票的内容王五请输入您要投票的内容张三请输入您要投票的内容张三请输入您要投票的内容结束{王五: 2, 张三: 3, 李四: 4, 朱七: 1}5.函数5.1.1函数介绍略5.1.2函数的定义def 函数名(参数): 代码块 return 返回值def:保留字不能忽略def最后面冒号,def后面要注意缩进创建一个简单的函数def fun1(): for i in range(10): print(i,end) fun1()5.1.3函数的调用形式函数名参数def fun1(): for i in range(10): print(i,end) fun1()5.1.4函数的复用不需要重复写复杂代码代码实现计算多个数值的阶乘之和def fun3(n): b1 for i in range(1,n1): bint(i)*b return b bfun3(7)fun3(8)fun3(9) print(b)代码执行结果408240def fun5(name math,computer): average (mathcompute)/2 print(name,:\t数学成绩:,math,\t计算机成绩:,computer,\t平均成绩:,average) fun5(张三,90,89) fun5(李四,98,84) fun5(王五,91,80)张三 : 数学成绩: 90 计算机成绩: 89 平均成绩: 89.5李四 : 数学成绩: 98 计算机成绩: 84 平均成绩: 91.0王五 : 数学成绩: 91 计算机成绩: 80 平均成绩: 85.5仅用1行调用函数即可实现输出一名学生的信息提高了代码编写效率降低代码编写中的出错率。5.1.5return返回值1.定义函数中带return语句返回数据到调用函数def fun2(): ls[张三李四] a len(ls) return a print(fun2())2.定义中不带return语句定义函数代码全执行完后调用函数的代码将默认一个空值即none.def fun1(): for i in range(10): print(i,end) print(fun1())代码执行结果0123456789None3.定义函数带return语句且返回多个值。一般以元组形式返回所有值。def fun2(): ls[张三李四] a len(ls) b ls.pop() return a,b print(fun2())代码执行结果(1, 张三李四)4.定义函数中return语句位于非末尾行且返回多个值return语句返回调用函数时表示函数已执行结束将不继续执行return后面的语句。def fun2(): ls[张三李四] a len(ls) return a b ls.pop() if a 2: return b else: return a,b print(hello world) print(fun2())5.2函数的参数5.2.1形参和实参定义函数中的参数为形参调用函数时填入的参数称为实参def 函数名(形参1,形参2,...): 代码块 return 返回值 函数名(实参1,实参2) def fun3(n): b1 for i in range(1,n1): bint(i)*b return b ainput(请输入一个数字) print(a,的阶乘,fun3(int(a)))5.2.2默认参数定义函数的的形参中“形参2数据2”’数据2为具体数据值赋值给形参2形参2也被称为默认参数。形参有默认参数和必填参数时先填必填参数再写默认参数形参r是必填参数不能与pi交换否则会引发语法错误。def 函数名(形参1形参2数据2): 代码块 return语句 #示例代码,计算圆的面积 def circle_s(r,pi3.14):#pi的值默认为3.14 return r*r*pi a circle_s(3) b circle_s(5) print(ab)5.2.3可变参数def 函数名形参1,*形参2:可变参数以元组的形式接收数据可变参数必须位于必填参数的右边以*开头·必须保证必填参数先收到数据再将剩余的数据传递给可变参数。def fun3(a,*b): print(b) c0 for i in b: c a*i return c print(fun3(3,1,2,3))5.2.4关键字参数def 函数名(形参1**形参2):关键字参数以字典的形式接收数据可变参数必须位于必填参数的右边以**开头·必须保证必填参数先收到数据再将剩余的数据传递给可变参数传递给关键字参数的数据包含键和值其中键和值之间使用等号连接。#代码示例 def fun4(a,**b): print(a,课程考试成绩:) print(b) fun4(Python,zhangsan90,lisi95)代码执行结果Python 课程考试成绩:{zhangsan: 90, lisi: 95}5.3函数变量的作用范围根据变量的作用范围可以将函数变量分为局部变量和全局变量局部变量只能在局部范围内使用函数中的形参变量和函数内部代码块中的变量都是局部变量#定义函数fun5中创建了一个变量d,变量d也属于局部变量只能在fun5()函数内部使用 def fun5(a,b,c10): da*ab*bc*c return d fun5(1,2,3) print(a)代码执行结果NameError: name a is not definedfun5()函数中有形参变量a,b,c,但a,b,c只能在函数内部使用因此在执行第五行代码Print(a)时会出现异常错误在fun5()函数外部代码中并没有对变量a进行赋值即没有定义a全局变量可以在整个代码文件范围内使用函数内部代码也可以使用外部定义的全局变量def fun5(a,b,c10): da*ab*bc*ce return d e100 print(fun5(1,2,3)) #运行结果114代码执行结果114e赋值为100fun5函数内部的第二行代码使用了变量e这里的e使用的是第四行的e5.3.1函数中使用全局变量存在的问题对局部变量进行赋值时在内部重新创建一个新的局部变量而不是直接使用全局变量a不是函数内部的变量外部代码对a进行赋值a属于全局变量所以函数可以直接使用全局变量a读取使用时函数可以无障碍地“看”到全局变量但在写入赋值时函数默认只在内部“折腾”自己的局部变量除非你明确告诉它使用global关键字否则它绝不会去动全局变量。def fun7(b): print(ab的值:,ab) print(ab的值:,ab) a3 fun7(13) print(a的值:,a)代码执行结果ab的值: 16ab的值: 16a的值: 3将a重新赋值为2代码如下def fun7(b): print(ab的值:,ab) a2 print(ab的值:,ab) a3 fun7(13) print(a的值:,a)代码执行结果Traceback (most recent call last):File C:\Users\Dell\PycharmProjects\pythonProject2\main.py, line 475, in modulefun7(13)File C:\Users\Dell\PycharmProjects\pythonProject2\main.py, line 471, in fun7print(ab的值:,ab)UnboundLocalError: local variable a referenced before assignment报错信息局部变量a没有分配值在函数中对a重新赋值时系统默认在函数中创建了一个局部变量aa的值为2第二行代码a没有任何的赋值信息也不会使用到全局变量的值所以出错。示例代码​def fun7(b): a2 print(ab的值:,ab) a3 fun7(13) print(a的值:,a) ​代码执行的结果ab的值: 15a的值: 3fun7中输出信息的a的值为2第六行代码输出的a的值为3,表明了函数内部的变量a和函数外部的变量a不是同一个变量。5.3.2global声明全局变量global 关键字 告诉 Python 解释器在函数内部操作的这个变量是全局变量而不是创建一个新的局部变量。需要函数内外部用同一个函数可以用global关键字对变量进行声明def fun7(b): global a print(a的值:,a) a2 print(ab的值,ab) a3 fun7(13) print(a的值,a)执行结果ab的值: 15a的值: 35.3.3*变量为可变数据根据是否改变内存空间将数据分为可变数据和不可变数据a4 b[2,3] print(id(a),id(b)) a5 b.append(5) print(id(a),id(b))通过id()函数获取当前变量的数据值所在的内存空间编号。执行结果3044877166992 30448823948803044877167024 3044882394880a的内存空间编号改变b的内存空间不变说明append(),pop()方法修改后内存空间始终保持不变但是对列表b进行赋值b的内存空间就被改变了。代码如下a4 b[2,3] print(id(a),id(b)) a5 b[2,3,5] print(id(a),id(b))代码执行结果1140156033424 11401613268481140156033456 11401613354885.3.4函数中的可变数据当可变数据为全局变量时在函数中对可变数据进行修改会改变全局变量def fun10(): a.reverse() print(a) a[2,3,4] fun10() print(a) #运行结果 #[4, 3, 2] #[4, 3, 2]在代码中多次调用具有可变数据的函数def func(): ls.append(1) return ls ls[] a func() b func() print(a,b) #运行结果[1, 1] [1, 1]5.4导入其他模块中的函数5.4.1导入文件模块import 文件名导入当前文件夹内的文件模块在同一个目录下文件名.函数名(参数)a.pydef fun6(n): b1 for i in range(1,n1): bint(i)*b return bb.pyimport a print(a.fun6(6))运行结果720import a将同文件夹下的a.py文件内容导入import a处导入多个文件模块import a,b,c5.4.2导入文件中的指定函数from 和import 组合的形式导入文件中的指定函数from 文件名 import 函数名 #函数使用形式 函数名参数#b1.y from a1 import fun6 print(fun6(6))#a1.y def fun6(n): b 1 for i in range(1,n1): b int(i)*b return b def fun7(n): return n*n def fun8(n): return n*(n-1)*(n-2)5.4.3导入文件中的全部函数from 文件名 import * #函数使用形式 函数名参数from a1 import * print(fun6(6))5.4.4给导入的函数设置别名from 文件名 import 函数名 as 新的函数名 import 文件名 as 新模块名 新的函数名(参数) 新模块名.函数名 #代码示例 from a import fun6 as f6 print(t,fun6(6)) import a as t print(t.fun6(6))5.4.5*__name__属性b5.py import a5 as t print(t.fun6(6)) print(__name__)a5.py def fun6(n): b1 for i in range(1,n1): bint(i)*b return b__name__ 是 Python 模块系统的“身份证”。记住这个公式if __name__ __main__:用来包裹那些只在脚本直接运行时才执行的代码如测试、主逻辑入口保护你的模块在被导入时保持安静5.6匿名函数lambda1.lambda做函数函数名lambda 参数函数内代码 #示例代码 fun1lambda x,y:xy #等效以下代码 def fun1(x,y): return yx2.Lambda做函数的参数#iterable:表示可迭代的数据对象例如字符串列表或元组 #key表示比较函数其值可以为lambda语句 #reverse:指明排序顺序若值为False表示从小到大排序若值为tTrue表示从大到小排序 sorted(iterable,keyNone,reverseFalse) #示例代码1 a[3,7,9,4,0,2] bnfweubv csorted(a)#默认按照从小到大 dsorted(a,reverseTrue)#按照从大到小 esorted(b)#默认从小到大字母的Unicode值按照顺序依次增大 print(c,d,e) #示例代码2 a[3,7,9,4,0,2] bsorted(a,keylambda x: abs(x-5))#absx-5表示计算将每一个元素减去5后的绝对值[2,2,4,1,5,3] print(b)6.类6.1类的介绍6.1.1对象概念对象是核心概念它是类的具体实例代表着内存中一个具体存在的实体。6.1.2创建类self.属性名表示类的属性import time class Microwave():#定义了一个名为“微波炉”的蓝图 微波炉类的文档说明 def __init__(self, name): # 类的初始化 self.name name#self.name这是给这个微波炉对象赋予了属性名字 self.time time.strftime(%Y-%m-%d %H:%M:%S, time.localtime())# self.time这是给这个微波炉对象赋予了属性购买时间 print(你好) def print_info(self):#形参self将初始化的self属性信息传递到print_info()方法中 print(微波炉的名字, self.name, \n, 购买时间, self.time) def bread(self, temp3): self.temp temp print(开始烤面包时长, self.temp, 分钟) pass#代表忽略的意思6.1.3创建对象import time class Microwave():#定义了一个名为“微波炉”的蓝图 微波炉类的文档说明 def __init__(self, name): # 类的初始化 self.name name#self.name这是给这个微波炉对象赋予了属性名字 self.time time.strftime(%Y-%m-%d %H:%M:%S, time.localtime())# self.time这是给这个微波炉对象赋予了属性购买时间 print(你好) def print_info(self): print(微波炉的名字, self.name, \n, 购买时间, self.time) def bread(self, temp3): self.temp temp print(开始烤面包时长, self.temp, 分钟) pass#代表忽略的意思 a Microwave(zhangsan) # 由类Microwave创建出来的对象 a.print_info() a.bread()1.import time因为代码中使用了 time.strftime 来获取当前时间所以必须在文件开头导入 time 模块否则会报错。2. self这是 Python 的约定。在类的方法中第一个参数必须是 self它代表当前这个具体的对象本身。通过 self方法才能知道是操作哪一个微波炉的数据。3. 默认参数bread(self, temp3) 中的 3 是一个很好的编程习惯它让函数调用更灵活不传参数时有默认值。这段代码很好地体现了面向对象的思想把数据name, time和操作数据的方法print_info, bread封装在一起6.2类的属性6.2.1属性的使用类的属性是指给每个对象赋予的标签信息。#对象.属性 #示例代码 aMicrowave(zhangsan) print(a.name,a.time) print(a.temp) #获取对象a的属性temp,必须要在调用了a.bread方法之后才能获取 #示例代码 aMicrowave(zhangsan) a.bread() print(a.temp)6.2.2初始化其他方法在类的定义中__init__()初始化方法也可以调用类中定义的其他方法#示例代码 imort time class Microwave(): 微波炉类的文档使用说明 def __init__(self,name); self.namename self.time time.strftime(%Y-%m-%d %H:%M:%S, time.localtime())# self.time这是给这个微波炉对象赋予了属性购买时间 self.bread() def print_info(self): print(微波炉的名字, self.name, \n, 购买时间, self.time) def bread(self, temp3): self.temp temp print(开始烤面包时长, self.temp, 分钟) pass#代表忽略的意思通过类创建对象并获取属性aMicrowave(zhangsan) print(a.name,a.time) print(a.temp)如下代码第七行使用self.bread(10)方法调用了类Microwave中的bread()方法并传递了参数10#示例代码 imort time class Microwave(): 微波炉类的文档使用说明 def __init__(self,name); self.namename self.time time.strftime(%Y-%m-%d %H:%M:%S, time.localtime())# self.time这是给这个微波炉对象赋予了属性购买时间 self.bread(10) def print_info(self): print(微波炉的名字, self.name, \n, 购买时间, self.time) def bread(self, temp3): self.temp temp print(开始烤面包时长, self.temp, 分钟) pass#代表忽略的意思6.2.3属性的修改属性的值可以通过对象来修改a Microwave(zhangsan)#创建对象a,用初始化的方法使得a的属性获得了相应的值。 a.name lisi#对name进行新的赋值 a.time 2022年6月7日#对time进行新的赋值覆盖原来的值 print(a.name, a.time)#输出a的属性6.2.4获取类的文档说明获取类的文档说明可以使用__doc__属性实现。示例代码aMicrowave(zhangsan) print(a.__doc__)6.3类的承方式6.3.1类的继承class 子类名(父类名):#class后面的括号用于继承父类并且不接收参数 def __init__(self, 子参数): super().__init__(父参数)#对父类进行初始化 代码块 def 方法1(): ... import time class Microwave(): 微波炉类的文档说明 def __init__(self, name): self.name name self.time time.strftime(%Y-%m-%d %H:%M:%S, time.localtime()) def print_info(self): print(微波炉的名字是, self.name, \n, 购买时间是, self.time) def bread(self, temp3): self.temp temp print(开始烤面包时长为, self.temp, 分钟) pass class New_Microwave(Microwave):#子类 从Microwave继承的子类 def __init__(self, name, light): # 参数是包含了子类和父类的全部参数 super().__init__(name) # 父类进行初始化 self.light light a New_Microwave(zhangsan, 100) a.print_info() # 子类也可以执行父类中的全部方法 ​子类继承注意以下两点1.通过子类创建的对象可以使用子类和父类中的所有属性和方法2.但是通过父类创建的对象只能使用父类中的属性和方法而不能使用子类中的属性和方法。6.3.2在子类中添加方法class Microwave(): 微波炉类的文档说明 def __init__(self, name): self.name name self.time time.strftime(%Y-%m-%d %H:%M:%S, time.localtime()) def print_info(self): print(微波炉的名字是, self.name, \n, 购买时间是, self.time) def bread(self, temp3): self.temp temp print(开始烤面包时长为, self.temp, 分钟) pass class New_Microwave(Microwave): # 子类 从Microwave继承的子类 def __init__(self,name, light): # 参数是包含了子类和父类的全部参数 super().__init__(name) # 父类进行初始化 self.light light def set_light(self,add_light): self.lightself.lightadd_light print(当前灯光强度,self.light) pass a New_Microwave(zhangsan, 100) a.print_info() # 子类也可以执行父类中的全部方法子类中可以添加新的方法但是在子类中新创建的方法无法在父类中使用而父类中创建的方法可以在子类中使用6.3.3覆盖父类中的方法需要对父类的方法进行修改时可以通过子类重新编写父类中的方法在执行子类中的方法时会自动覆盖父类中相应的方法。如下代码通过子类覆盖父类Microwave中的print_info()方法class New_Microwave(Microwave): # 子类 从Microwave继承的子类 def __init__(self,name, light): # 参数是包含了子类和父类的全部参数 super().__init__(name) # 父类进行初始化 self.light light def print_info(self): print(微波炉的名字:,self.name,\n,购买时间:,self.time,\n,当前灯光强度:,self.light) aNew_Microwave(zhangsan,100) a.print_info()6.4导入其他文件中的类6.4.1导入类当需要再d.py文件中使用c.py文件中的类Microwave时必须保证两个文件处在同一个文件夹内否则将无法导入文件内容1.导入文件d.py代码文件中使用import导入了c.py文件因此后面在使用Microwave时需要在Microwave前面加上引导符“c”c.py和d.py文件代码如下#c.py import time class Microwave(): 微波炉类的文档说明 def __init__(self,name): self.namename self.timetime.strftime(%Y-%m-%d %H:%M:%S, time.localtime()) def print_info(self): print(微波炉的名字是,self.name,\n,购买时间是:,self.time) def bread(self,temp3): self.temptemp print(开始烤面包时长为:,self.temp,分钟) pass#d.py import c a c.Microwave(zhangsan) a.print_info()2.导入文件中的指定类d.py中代码如下from c impor Microwave aMicrowave(zhangsan) a.print_info()3.导入文件的全部类在d.py文件中的代码如下from c import * aMicrowave(zhangsan) a.print_info()4.给导入的类设置别名在d.py文件中的代码如下:from c import Microwave as Mw a Mw(zhangsan) a.print_info()6.4.2在类中使用另一个类的方法可以参考前面创建类对象和使用类方法的步骤。以同以文件夹中的三个代码文件分别为e.py,f.py,g.py代码文件示例代码e.py代码文件class Bluetooth():#定义了类Bluetooth,用于模拟连接手机蓝牙 用于连接手机蓝牙 def __init__(self,yorn):#接受一个参数yorn self.yorn yorn def con(self):#创建了con()方法用于模拟判断当前是否需要连接手机蓝牙 if self.yorn y: print(开始连接手机蓝牙) elif self.yorn n: print(断开手机蓝牙) else: print(设置错误)示例代码(f.py代码文件import time import e#导入e.py文件 class Microwave(): 微波炉类的文档说明 def __init__(self,name): self.namename self.timetime.strftime(%Y-%m-%d %H:%M:%S, time.localtime()) def print_info(self): print(微波炉的名字是,self.name,\n,购买时间是:,self.time) def bread(self,temp3): self.temptemp print(开始烤面包时长为:,self.temp,分钟) pass def con_bluetooth(self,yorn):#定义con_bluetooth()方法用于模拟手机通过蓝牙控制微波炉 bluetooth e.Bluetooth(yorn)#通过类Bluetooth创建了蓝牙对象bluetooth bluetooth.con()#执行con()操作实现了模拟手机蓝牙和微波炉的连接示例代码g.py代码文件import f af.Microwave(zhangsan) a.print_info() a.con_bluetooth(y)执行结果总之当需要在类a中使用另一个类b中的方法时是通过在类a中创建类b的实例化对象再调用类b中的实例化对象中的方法来实现的。