版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Python程序设计基础及应用《Python程序设计基础及应用》配套课件第7章类和对象CONTENTS7.1类和对象的创建7.2封装7.3构造方法和析构方法7.4继承7.5多态7.6案例实战目录
Python程序设计基础及应用本章学习目标01.理解概念深入理解类的概念与特性,掌握对象的创建过程,学会实现类的继承。02.掌握封装理解类的封装特点,学会定义和使用类属性、实例属性、类方法、实例方法。03.熟练应用学会编写类的构造方法(`__init__`)和析构方法(`__del__`),理解类的多态性,并学会方法重写。Python程序设计基础及应用7.1类和对象的创建Python程序设计基础及应用1.定义类▍面向对象的编程方法把待解决的问题按照一定规则划分为多个独立的对象,通过调用对象的方法来实
现多个对象相互配合,完成程序的功能。当应用程序功能发生改变时,只需要修改个别的对象就可以,
从而使得代码容易得到维护。▍面向对象编程符合人们认识事物的规律,数据和操作封装为一体,安全性高,扩展性强。Python程序设计基础及应用1.定义类▍概念类(Class):对象的蓝图或模板,定义了对象的属性和方法,是一个抽象概念。同一种类型的对象进行分类、抽象后,得出共同的特征形成了类。对象(Object):类的具体实例,拥有类定义的属性和方法,是一个具体概念。客观世界里的任何实体都可以被看作是对象。面向对象程序设计的关键就是如何合理地定义类并且组织多个类之间的关系。▍组成创建类时用变量形式表示对象特征的成员称为数据成员(属性),用函数形式表示的对象行为的成员称为成员方法(方法),数据成员和成员方法统称为类的成员。属性:描述类的特征(数据成员),例如:姓名、年龄。方法:描述类的行为(方法成员),例如:运动、说话。Python程序设计基础及应用1.定义类▍类的定义class
<类名>[([父类])]:
<属性> <方法>类名:通常采用大驼峰命名法,首字母大写,例如`Student`。Python中,所有的类都是按新式类来处理,如果没有为一个新创建的类指明父类,则这个类默认从object类直接继承而来。也就是说,class类名(object)”、“class类名()”和“class类名”三种写法没有区别,都按照新式类来处理。Python程序设计基础及应用1.定义类▍对象实例化创建对象的过程称为实例化。创建一个对象时,Python解释器会自动为其在内存中分配空间,并隐式调用构造方法__init__()来初始化对象的属性。▍创建与访问语法创建:对象名=类名([参数...])访问:对象名.属性名|对象名.方法名(参数列表)Python程序设计基础及应用1.定义类classStudent:
def__init__(self,name,age,student_id):
=name #创建数据成员name
self.age=age #创建数据成员age
self.student_id=student_id #创建数据成员student_id
defintroduce(self): #定义方法成员
returnf"Hello,mynameis{},andIam{self.age}yearsold."#创建类的对象并访问其成员alice=Student("Alice",20,"S1001")alice.age=19 #修改对象的属性值print(roduce()) #调用对象的方法,无需传self#输出:Hello,mynameisAlice,andIam19yearsold.Python程序设计基础及应用7.2封装Python面向对象编程1.属性▍封装(Encapsulation)将对象的属性和方法视为一个整体,并隐藏内部实现细节,只暴露必要的接口。目的是实现信息隐藏,保护数据安全。
▍属性分类类属性:在类中所有方法之外定义,被所有实例共享。实例属性:在构造方法`__init__`中定义,以`self`为前缀,属于每个实例对象。
▍
访问控制机制公有属性:默认类型,类的内部和外部均可自由访问。私有属性:名称前加双下划线__,类外部不能直接访问,用于保护敏感数据。Python面向对象编程1.属性▍类属性定义类属性是该类所有对象共享的,不属于任何一个对象。类属性一般不在任何一个成员方法的定义中。▍类属性访问类数据成员属于类,在类外部可以通过类名访问。也可以通过对象名访问,但不建议通过对象名访问,这样做会造成类属性值不一致。▍实例属性定义属于对象的数据成员不需要在类中显示定义,一般在构造方法__init__()中定义,定义时以self(当前对象)作为前缀。当然也可以在其他成员方法中定义,但并不提倡这么做,所有的属性最好在__ini__()构造方法中给出。▍实例属访问实例方法中访问实例属性时以self作为前缀,在类的外部,只能通过对象名访问;Python面向对象编程1.属性如果需要在类外修改类属性,则必须先通过类对象去引用,然后进行修改。如果通过实例对象去引用类属性,则会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性。Python面向对象编程1.属性classStudent: school="华山学院" #类属性 def__init__(self,name,age): #构造方法 =name #公有实例属性 self.__age=age #私有示例属性 defintroduce(self): #公有方法 returnf"Hello,mynameis{},andIam{self.__age}yearsold,Iamin{self.school}"alice=Student("Alice",20) #创建Student类的一个实例print(alice.__age) #错误,不能在类外通过实例对象访问私有的类属性print(Student.school) #访问类属性,也可以alice.schoolprint() #访问实例属性Python程序设计基础及应用2.方法Python类的成员方法按照定义规则大致可以分为实例方法,类方法,静态方法。▍实例方法实例方法都必须至少有一个名为self的参数,并且必须是方法的第一个形参(如果有多个形参的话),self参数代表当前对象。在实例方法中访问实例成员时需要以self为前缀。可以通过对象名和类名调用实例方法。在外部通过对象名调用实例方法时并不需要传递self这个参数。如果在外部通过类名调用属于对象的实例方法,需要显式为该方法的self参数传递一个对象名,用来明确指定访问哪个对象的成员。Python程序设计基础及应用2.方法实例方法classRoot:__total=0 #类属性def__init__(self,v): #构造方法(特殊的实例方法,负责对属性初始化)self.__value=vRoot.__total+=1 #访问类属性 defshow(self): #普通实例方法print('self.__value:',self.__value)print('Root.__total:',Root.__total)Python程序设计基础及应用2.方法▍类方法类方法定义需要添加前缀“@classmethod”语句引导,第一个形参通常被命名为cls。类方法既可以通过类名,也可以通过对象名来调用。一个类的所有实例对象共享类方法。类方法是将类本身作为对象进行操作的方法。可以通过它来传递类的属性和方法。Python程序设计基础及应用2.方法classPerson(object):__number=0def__init__(self):Person.__number+=1@classmethoddefgetNumber(cls):returncls.__numberp=Person("张三") #实例化对象p.getNumber() #通过对象名访问类方法Person.getNumber() #通过类名访问类方法Python程序设计基础及应用2.方法▍静态方法静态方法的定义之前需要添加“@staticmethod”。静态方法定义时,不需要表示访问对象的self参数,形式上与普通函数的定义类似。静态方法只能访问属于类的成员,不能访问属于对象的成员。一个类的所有实例对象共享静态方法。使用静态方法时,既可以通过“对象名.静态方法名”来访问,也可以通过“类名.静态方法名”来访问。静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,逻辑上属于类,但是和类本身没有关系。静态方法是独立的、单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护。类方法用于对类成员的修改和传递。Python程序设计基础及应用2.方法▍静态方法#主程序p1=Person("Tom")p1.getName()p1.getNumber()Person.getNumber()p2=Person('Alice')p2.getName()p2.getNumber()Person.getNumber()p1.getNumber()MynameisTom总人数为:1总人数为:1MynameisAlice总人数为:2总人数为:2总人数为:2classPerson:number=0def__init__(self,name):=namePerson.number+=1defgetName(self):print('Mynameis',)
@staticmethod#声明静态defgetNumber():#静态方法没有selfprint("总人数为:",Person.number)Python程序设计基础及应用3.property属性▍作用property是Python中专门用于封装类属性的内置机制。核心作用是:把类的方法伪装成普通属性。既能像访问属性一样简洁操作,又能在背后执行自定义逻辑(校验、计算、修改等)。简单说:对外是属性,对内是方法。▍实现方式既可以使用@property装饰器,也可以使用property类。使用装饰器将方法伪装成属性,是Pythonic且最直观的实现方式。装饰器
作用
调用时机@property 定义读属性 obj.属性@属性名.setter 定义写属性 obj.属性
=
值@属性名.deleter 定义删属性 delobj.属性Python程序设计基础及应用3.property属性▍作用property是Python中专门用于封装类属性的内置机制。核心作用是:把类的方法伪装成普通属性。既能像访问属性一样简洁操作,又能在背后执行自定义逻辑(校验、计算、修改等)。简单说:对外是属性,对内是方法。▍实现方式既可以使用@property装饰器,也可以使用property类。使用装饰器将方法伪装成属性,是Pythonic且最直观的实现方式。装饰器
作用
调用时机@property 定义读属性 obj.属性@属性名.setter 定义写属性 obj.属性
=
值@属性名.deleter 定义删属性 delobj.属性Python程序设计基础及应用3.property属性▍@property必须遵守的规则三个方法名必须完全相同(比如都叫age)必须先写@property,才能写.setter/.deleter通常用下划线开头的变量存真实数据(_age),表示内部私有▍具体语法读取:@property修改:@属性名.setter删除:@属性名.deleterPython程序设计基础及应用3.property属性classPerson:def__init__(self,age):self._age=age #初始化私有属性#获取属性@propertydefage(self):returnself._age#设置属性(必须和上面方法名同名)@age.setterdefage(self,value):ifnotisinstance(value,int):raiseTypeError("年龄必须是整数")ifvalue<0orvalue>150:raiseValueError("年龄必须在0~150之间")self._age=value#删除属性(可选)@age.deleterdefage(self):print("删除年龄属性")delself._agep=Person(20)print(p.age)#读取,自动调用@property方法p.age=30#修改,自动调用@age.setter#p.age=200#报错:年龄非法delp.age#删除,自动调用@age.deleterPython程序设计基础及应用7.3构造方法和析构方法Python程序设计基础及应用1.构造方法▍构造方法__init__构造方法是类实例化过程中,对象分配内存空间后、正式投入使用前,由Python解释器自动触发执行的初始化特殊方法。▍触发时机调用类名类名()进行实例化(Instantiation)时自动执行;▍核心功能完成实例属性初始化、参数接收、成员变量赋值、依赖资源预加载(文件句柄、数据库连接初始化等);▍语法特征第一个形参固定为self,代表当前实例对象引用;可自定义形参列表;无返回值,禁止使用return返回自定义数据。Python程序设计基础及应用1.构造方法▍关键特性属于实例级方法,仅作用于单个对象;类可以重载自定义__init__,若未显式定义,Python提供默认空构造方法;职责仅限初始化资源,不负责对象内存分配(内存分配由__new__方法完成)。classStudent:#构造方法:实例初始化def__init__(self,sid,name):self.sid=sid #实例属性初始化=namePython程序设计基础及应用1.构造方法▍析构方法__del__析构方法是当实例对象引用计数(ReferenceCount)归0、即将被垃圾回收器(GC)销毁时,由Python解释器自动调用的资源释放魔术方法。▍触发时机对象无任何有效引用、被标记为垃圾对象,垃圾回收机制回收对象内存前自动执行;▍核心功能完成资源释放,如关闭文件流、断开网络/数据库连接、释放外部系统资源、清理临时缓存等;▍语法特征仅保留唯一形参self,无额外自定义参数;无返回值。Python程序设计基础及应用1.构造方法▍关键特性Python采用引用计数垃圾回收机制,__del__执行时机不确定,不由程序员手动控制精确调用;程序退出时,所有残留实例会被解释器统一回收,批量触发__del__;不建议主动手动调用__del__,违背生命周期设计范式;若存在循环引用,可能导致__del__无法被及时触发。classFileHandler:def__init__(self,path): #构造方法:占用资源self.f=open(path,"w")
def__del__(self): #析构方法:释放资源self.f.close()print("文件资源已释放")Python程序设计基础及应用1.构造方法▍对比维度
构造方法__init__ 析构方法__del__生命周期阶段
对象创建初始化阶段
对象销毁回收阶段调用逻辑
实例化时必然自动调用
引用计数为0时GC按需调用核心职责
实例属性初始化、资源申请
外部资源释放、善后清理执行可控性
时机固定、完全可控
时机异步、不可精确控制设计范式
主动初始化
被动回调销毁Python程序设计基础及应用7.4继承Python程序设计基础及应用1.单继承▍继承(Inheritance)允许一个类(子类/派生类)继承另一个类(父类/基类)的非私有属性和非私有方法。主要好处是实现代码复用,避免重复编写逻辑,同时也增强了代码的模块化。▍单继承指一个子类只继承自一个父类。这是继承中最简单、最常用的形式。Python语法格式:class子类名(父类名):▍重要注意事项父类中定义的私有属性(以双下划线“__”开头)和私有方法,子类是无法直接继承和访问的。Python程序设计基础及应用1.单继承#定义单一继承classAnimal(object): #父类def__init__(self,color):self.color=colordefrun(self):print("Animalisrunning...")classDog(Animal): #子类继承自Animal passdog=Dog("黑色")print("狗的颜色",dog.color)dog.run()Python程序设计基础及应用2.多继承▍多重继承指一个子类同时继承多个父类的属性和方法,它允许子类融合不同类的特性,在某些场景下能极大地提高代码复用性。▍方法解析顺序(MRO)当多个父类中存在同名方法时,Python解释器会按照特定的“方法解析顺序”查找并执行匹配的方法,避免调用冲突。先子类后父类,多继承从左往右,每个类只查一次,全局唯一顺序▍super()函数的作用用于在子类中显式调用父类的方法,常用于子类构造方法中初始化父类属性。它会自动遵循MRO顺序来调用对应的父类方法,是实现继承协作的关键工具。Python程序设计基础及应用1.单继承classA:deftest(self):print("A")classB(A):deftest(self):print("B")classC(A):deftest(self):print("C")classD(B,C): #多继承:先B,后Cpassd=D()d.test() #D→B→C→A→objectPython程序设计基础及应用3.小结优先单继承,能不用多重继承就不用(多重继承会产生菱形(钻石)继承歧义);严格控制继承层级,不搞深层嵌套多继承(代码可读性、可维护性急剧下降);父类尽量避免同名方法,减少覆盖冲突(方法名命名冲突风险高)多重继承复用强、扩展灵活;但易冲突、难读懂、调试复杂,工程中应谨慎慎用。Python程序设计基础及应用7.5多态Python程序设计基础及应用1.多态概述▍多态含义多态是面向对象三大核心特性(封装、继承、多态)之一,指同一接口、不同实现;父类定义统一规范接口,多个子类重写该接口方法;程序在运行时依据对象实际类型自动绑定对应子类实现,同一消息发送给不同对象,产生不同行为表现。要义:静态接口,动态绑定;一个接口,多种形态。Python不支持重载(同类中同名不同参),只支持重写。▍多态必要条件存在继承关系(子类派生自父类)子类重写(Override)父类同名方法通过父类引用指向子类实例运行时动态类型绑定Python程序设计基础及应用1.多态概述#多态统一接口classTest:@staticmethoddefanimal_sound(ani):
#同一行代码,不同对象执行不同实现ani.speak()#运行时自动绑定真实类型Test.animal_sound(Dog())Test.animal_sound(Cat())#父类/抽象规范classAnimal:defspeak(self):pass#子类重写classDog(Animal):defspeak(self):print("狗:汪汪汪")classCat(Animal):defspeak(self):print("猫:喵喵喵")Python程序设计基础及应用7.6案例实战Python程序设计基础及应用案例一:学生管理系统▍需求说明开发一个学生管理系统,包含学生信息的添加、删除和显示功能,以此实践面向对象编程的封装特性与类的职责划分。▍设计思路1.创建Student类:将学生的姓名、年龄、学号、班级设为私有属性进行封装,并对外提供获取完整信息的公有方法,以及用于识别学生的学号属性访问接口。2.创建StudentManager类:作为管理者类,内部维护一个学生对象列表,提供添加学生、根据学号删除学生、以及展示所有学生信息的管理方法。Python程序设计基础及应用案例一:学生管理系统#代码清单:实现学生信息管理系统的核心结构classStudent:def__init__(self,name,age,sid,grade):self.__name=name;self.__age=age;self.__sid=sid;self.__grade=gradedefget_info(self):returnf"姓名:{self.__name},学号:{self.__sid},年龄:{self.__age},班级:{self.__grade}"@propertydefsid(self):returnself.__sidclassStudentManager:def__init__(self):self.students=[]defadd_student(self,student):self.students.append(student)defremove_student(self,sid):self.students=[sforsinself.studentsifs.sid!=sid]defget_students(self):returnself.studentsPython程序设计基础及应用案例二:石头、剪刀、布游戏▍案例描述与规则任务:开发一个人机对战的石头、剪刀、布游戏。规则:玩家输入手势,电脑随机选择手势。胜负判定:布包石头、石头砸剪刀、剪刀剪布。▍面向对象解题思路1.定义Computer类:负责电脑随机选择角色并产生随机出拳。2.定义Person类:负责处理玩家的角色输入和手势选择。3.定义Game类:作为游戏控制器,负责初始化玩家、执行对战流程、判断胜负。▍核心代码结构#代码清单7-14实现石头、剪刀、布游戏
classComputer():
def__init__(self):...#随机选择角色
defshowQuan(self):...#随机出拳并返回
classPerson():
def__init__(self):...#玩家选择角色
defshowQuan(self):...#玩家出拳并返回
classGame():
def__init__(self):...#初始化游戏,创建玩家和电脑
defbegin(self):...#游戏主循环,处理对战逻辑Python程序设计基础及应用第七章:面向对象编程·核心回顾与总结▍本章核心知识点回顾●类与对象:类是创建对象的蓝图与模板,对象是类实例化后的具体实体。●封装:隐藏对象的内部状态,通过访问控制保护数据安全,并通过公开方法提供统一的操作接口。●继承:实现代码的层级复用,分为单继承和多继承,是建立类之间“is-a”关系的重要手段。●多态:同一接口可被不同对象实现,通过方法重写实现不同的具体行为,提高代码灵活性。●核心内置方法:`__init__`(构造方法,初始化对象),`__del__`(析构方法,回收对象),`super()`(调用父类属性与方法)。▍面向对象编程(OOP)的核心优势✅模块化:将复杂系统拆解为独立的对象单元,代码结构清晰,逻辑边界明确,易于理解与管理。
✅可复用性:通过继承与组合机制,大幅减少重复代码编写,提升开发效率。
✅可扩展性:新增功能时仅需新增或修改特定类,对现有系统的影响极小,符合“开闭原则”。
✅可维护性:封装特性将内部实现与外部调用解耦,修改内部逻辑无需改变外部接口,降低维护成本。《Python程序设计基础及应用》配套课件第八章
文件和目录8.1文件处理流程8.2文本文件读写8.4CSV和JSON文件读写8.5文件操作8.6目录操作8.7案例实战8.3二进制文件读写8.1文件处理流程1.文件概述为了长期保存数据以便重复使用、修改和共享,必须将数据以文件的形式存储到外部存储介质(如磁盘、U盘、光盘或云盘、网盘、快盘等)中。文件操作在各类应用软件的开发中均占有重要的地位:管理信息系统MIS是使用数据库来存储数据的,而数据库最终还是要以文件的形式存储到硬盘或其他存储介质上。应用程序的配置信息往往也是使用文件来存储的。图形、图像、音频、视频、可执行文件等等也都是以文件的形式存储在磁盘上的。1.文件概述文件不仅是数据的存储容器,还是程序执行、数据交换、配置管理等重要功能的实现基础。文件是数据持久化存储的基本单位,分为文本文件(如网页、源代码,存储字符序列,需特定编码)和二进制文件(如图像、音视频,存储字节序列,需专用软件解码)。文本文件存储字符序列,用特定编码方案转换为二进制数据。二进制文件包含任意类型数据,将对象内容以字节串(bytes)进行存储,无法用记事本或其他普通字处理软件直接进行编辑,通常也无法被人类直接阅读和理解,需要使用专门的软件进行解码后读取、显示、修改或执行。2.处理过程文件处理流程包含有建立文件、打开文件、读取数据、写入数据以及关闭文件。3.打开文件打开文件要用到Python的内置函数open(),其语法格式如下:open(filename,mode='rt',buffering=-1,ncoding=None,newline=None)filename:文件名称,建议使用原生字符串形式,或者路径分隔符使用“/”。mode:指定打开文件后的处理方式:只读,写入,追加等。所有可能取值见表9-1所示。这个参数是非强制的,默认文件访问模式为只读(r)。buffering:0表示不缓存,1表示缓存。大于1表示缓冲区的大小。-1表示缓冲区的大小为系统默认值。encoding:指定对文本进行编码和解码的方式,只适用于文本模式,可以使用Python支持的任何格式,如gbk、utf8、cp936等。默认使用的编解码方式和平台相关,可以使用locale.getpreferredencoding()查看,默认windows下cp936。newline:用来控制文本模式之下,一行的结束字符3.打开文件访问模式描述r默认模式,以只读方式打开文本文件,文件的指针将会放在文件的开头。w打开一个文本文件用于写入。如果该文件已存在则将其覆盖;如果该文件不存在,则创建新文件。a打开一个文本文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后;如果该文件不存在,则创建新文件进行写入。
b二进制模式(可与其他模式组合使用)
t文本模式(默认模式,可省略)
+读、写模式(可与其他模式组合使用)4.关闭文件close()
方法用于关闭一个已打开的文件,可以将缓冲的数据写入文件,然后关闭文件。关闭后的文件不能再进行读写操作,否则会触发
ValueError
错误。close()方法允许调用多次。flush()方法将缓冲的数据写入文件,但是不关闭文件。需要注意的是,即使写了关闭文件的代码,也无法保证文件一定能够正常关闭。例如,如果在打开文件之后和关闭文件之前发生了错误导致程序崩溃,这是文件就无法正常关闭。所以,在管理文件对象时推荐使用with关键字,可以有效避免这个问题。文件在读写结束后会自动关闭,即使是异常引起的也是如此。5.with语句with
语句被设计用于简化资源管理,特别是在处理文件、线程、数据库连接等需要明确关闭或释放资源的场景。对于文件操作来说,with
语句特别有用,它自动处理了文件的打开和关闭。with语句的用法如下。withopen("test.txt","r")asfile:content=file.read()8.2文本文件读写1.内容读取(1)read()方法read()方法读取从当前位置直到文件末尾的所有内容,并将其读取的内容作为一个字符串返回。参数size是可选参数,代表的是从文件中读取的字符数。read()方法的语法结构如下:1.内容读取(1)read()方法1.内容读取(2)readline()方法该方法每次读出一行内容,读取时占用内存小,比较适合大文件,返回一个字符串对象,内容是读取到的字符串。其语法格式如下:1.内容读取(2)readline()方法1.内容读取(3)readlines()方法readlines()方法读取从文件当前位置到文件末尾的所有行,返回一个以每行字符串组成的列表。其语法格式如下:1.内容读取(3)readlines()方法2.数据写入(1)write()方法write()
方法用于向一个打开的文件中写入指定的字符串,在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时在文件中看不到写入的内容。其语法格式如下:2.数据写入(1)write()方法2.数据写入(2)writelines()方法writelines()方法在文件中写入一个字符串列表。其语法格式如下:2.数据写入(2)writelines()方法8.3二进制文件读写1.内容读取二进制文件的读取,需要使用open()函数先把二进制文件打开,打开后调用read()方法进行读取。read()方法读取的是二进制的bytes字节串,不能直接显示内容,否则会出现乱码。2.数据写入通过write()方法,可以将字节串写入文件。3.struct模块读写文件struct模块在Python中是一个用于处理字节串与原生Python数据结构类型之间转换的模块。它能将Python的值打包成字节串(序列化),并且能够将字节串解包成Python的值(反序列化)。struct模块常用的函数是pack()和unpack()。pack()和unpack()的语法格式如下:3.struct模块读写文件struct模块代码举例如下:3.struct模块读写文件struct模块代码举例如下:4.pickle模块读写文件pickle是Python标准库中的一个模块,用于将Python对象进行序列化和反序列化。pickle模块拥有dump()和load()函数。dump()函数是将对象进行序列化写进文件中。而load()函数是从文件中读取数据进行反序列化。dump()函数和load()函数的语法格式如下:4.pickle模块读写文件pickle示例如下:8.4CSV和JSON文件读写1.CSV文件读写CSV(Comma-SeparatedValues,逗号分割值或者字符分割值)文件是一种逗号分隔的纯文本形式存储的表格数据。Python中的csv模块提供了reader()和writer()方法。csv模块中的writer类可用于读写序列化的数据,其语法格式如下:csv模块中的reader类用于读取文件中的数据,其语法格式如下:1.CSV文件读写CSV文件读写的案例2.JSON文件读写JSON(JavaScriptObjectNotation,JavaScript对象表示法)是一种轻量级的数据交换格式,采用了完全独立于语言的文本格式来存储和表示数据,是跨平台传输对象的首选数据格式。Python语言内置的json模块提供了对JSON数据的解析和生成的功能,json模块提供了四个主要的方法用来进行Python对象的编解码。2.JSON文件读写表json模块常用方法方法说明格式dump()将Python对象转化为JSON格式的字符串并写入文件,即序列化json.dump(data,file)load()读取文件中JSON格式的字符串并转化为Python对象,即反序列化json.load(file)dumps()将Python对象转换为JSON格式的字符串json.dumps(data)loads()读取JSON格式的字符串并转化为Python对象json.loads(json_data)2.JSON文件读写使用json模块进行序列化和反序列化8.5文件操作文件操作1.重命名文件os.rename()方法用于重命名文件或目录,如果dst是一个存在的目录,将抛出OSError异常。rename()方法的语法格式如下:2.删除文件os.remove()方法用于删除指定路径的文件,无法删除文件夹。如果指定的路径是一个目录,将抛出OSError异常。remove()方法语法格式:os.remove(path)path:要删除的文件路径(可以是相对路径、绝对路径)。文件操作使用rename()和remove()文件操作3.判断是否文件os.path.isfile(path)方法判断path是否是一个文件,返回值是True或者False。4.复制文件shutil.copy(src,dst)方法将文件src复制到文件或目录dst中,该函数返回目标文件名。5.检查文件是否存在os.path.exists(path)方法用于检查文件的存在性,返回一个布尔值(True、False)。6.获取绝对路径名os.path.abspath(path)方法返回path的绝对路径名。文件操作使用copy()、exists()和abspath()8.6目录操作目录操作创建目录os.mkdir(path)方法用于创建单层目录,目录存在时会抛出FileExistsError异常。os.mkdirs(path)创建多级目录结构,即使中间的某一级目录不存在也会被自动创建出来。2.获取当前目录os.getcwd()返回当前工作目录。3.改变当前目录os.chdir(path)改变当前工作目录。4.获取目录内容os.listdir(path)返回path指定的目录下包含的文件或子目录的名字列表。5.删除目录os.rmdir(path)删除path指定的目录,如果目录非空,则抛出一个OSError异常。目录操作6.判断是否为目录os.path.isdir(path)方法用于判断path是否为目录,返回一个布尔值。7.连接多个目录os.path.join(path,*paths)方法连接两个或多个path,形成一个完整的目录。8.分割路径os.path.split(path)方法对路径进行分割,以元组方式进行返回。os.path.splitext(path)方法从路径中分割文件的扩展名。os.path.splitdrive(path)从路径中分割驱动器名称。目录操作9.获取路径os.path.abspath(path)方法返回path的绝对路径;os.path.dirname(path)返回path的路径名部分;os.path.relpath(path,start=os.curdir)方法返回从基准路径start到目标路径path的相对路径字符串。10.遍历目录树os.walk(path)用于遍历指定路径下所有子目录和文件的函数,返回一个生成器。每次迭代中,生成器会依次访问指定目录下的每个子目录,包括指定目录的路径。目录操作批量修改文件和目录名8.7案例实战案例实战1.
案例描述(1)编写程序,将九九乘法表写入到“乘法口诀.txt”文件中。并从“乘法口诀.txt”文件中读取数据输出。(2)编写程序,实现备份指定目录下的所有文件和子目录。2.
案例实现(1)九九乘法表。编程思路:九九乘法表可以采用双循环方式生成,外层循环控制行,内层循环控制列。乘法表的每一行的行末要添加“\n”,然后写入文件。案例实战
读写九九乘法表案例实战读写九九乘法表案例实战2.备份目录下的文件和子目录。编程思路:使用shutil.copy()
复制文件,os.path.join()
拼接备份文件路径,os.makedirs()
创建备份目录,os.path.relpath()获取文件的相对路径,os.walk()递归获取子目录和文件。自动备份文件案例实战2.备份目录下的文件和子目录。自动备份文件Python程序设计基础及应用《Python程序设计基础及应用》配套课件第九章数据分析基础Python程序设计基础及应用目录9.1NumPy-科学计算的基石9.2Pandas-数据分析的瑞士军刀9.3数据清洗与聚合9.4数据的读取与存储9.5案例实战Python程序设计基础及应用9.1多维数组对象ndarrayNumpy提供了两种基本的对象:ndarray:英文全称为n-dimensionalarrayobject,称为多维数组,后统一称之为数组。ufunc:英文全称为universalfunctionobject,它是一种能够对数组进行处理的特殊函数。Numpy库的核心对象是n维数组对象ndarray,Python中所有的函数都是围绕ndarray对象进行的。ndarray数组能够对整块数据进行数学运算,通常来说,ndarray是存储单一数据的容器,即其中的所有元素都需要是相同的类型,和list不同,它能直接保存数据,而list保存的是对象的引用。1.创建数组(1)数组属性1.创建数组(2)数组的创建创建数组最简单的方法就是使用Numpy提供的array()函数,通过给array()函数传递序列对象来创建数组,如果传递的是多层嵌套的序列,则创建多维数据。创建数组时,numpy会为新建的数组推断出一个合适的数据类型,并保存在dtype属性中。importnumpyasnpdata1=[1,2,3,4]arr1=np.array(data1)print(arr1)array([1.,2.,3.,4.])1.创建数组data2=[[1,2,3],[4,5,6]]arr2=np.array(data2)print(arr2) #array([[1,2,3],[4,5,6]])print(arr2.ndim) #2print(arr2.shape) #(2,3)print(arr2.size) #6print(arr2.dtype) #dtype('int32')1.创建数组在对数组进行操作时,经常要改变数组的维度。可以通过修改数组的shape属性,在保持数组元素个数不变的情况下,改变数组每个轴的长度。arr2.shape=(3,2)print(arr2) #array([[1,2],[3,4],[5,6]])arr2.shape=(1,-1)print(arr2) #array([[1,2,3,4,5,6]])2.变换数组形状(4)自动生成数组numpy提供了很多专门用于创建数组的函数。arange()类似于内置函数range(),通过指定开始值、终值和步长来创建表示等差数列的一维数组,注意所得到的结果中不包含终值。
np.arange(10)
输出:array([0,1,2,3,4,5,6,7,8,9])np.arange(1,13,2)
输出:array([1,3,5,7,9,11])1.创建数组linspace()通过指定幵始值、终值和元素个数来创建表示等差数列的一维数组,可以通过endpoint参数指定是否包含终值,默认值为True,即包含终值。np.linspace(1,10,10)
输出:array([1.,2.,3.,4.,5.,6.,7.,8.,9.,10.])np.linspace(1,10,10,endpoint=False)
输出:array([1.,1.9,2.8,3.7,4.6,5.5,6.4,7.3,8.2,9.1])3.自动生成数组logspace()和linspace()类似,通过指定开始指数、结束指数和元素个数来创建表示等比数列的一维数组,可以通过指定base参数来确定底数,默认为10,还可以通过endpoint参数确定是否包括结束指数,默认为True,表示包含。np.logspace(0,3,4)输出:array([1.,10.,100.,1000.])np.logspace(0,3,4,base=2)输出:array([1.,2.,4.,8.])3.自动生成数组numpy提供了强大的生成随机数的功能,然而,真正的随机数很难获得,实际中使用的都是伪随机数。大部分情况下,伪随机数就能满足要求。与随机数相关的函数都在random模块中,其中包含了可以生成服从多种概率分布随机数的函数。4.随机数函数(5)随机数函数4.随机数函数(1)
一维数组的索引和切片一维数组的索引类似于Python中的列表,可以使用和列表相同的方式对数组的元素进行存取。和列表不同的是,通过切片获取的新的数组是原始数组的一个视图,它与原始数组共享同一块数椐存储空间,这就意味着在视图上的操作都会使得原始数组发生改变。如果需要的并非视图而是要复制数据,则可以通过copy()方法来实现,这时新旧两个数组不共享同一块数据存储空间。arr4[0:2]=10,11输出:array([10,11,3,4,5,6,7,8,9])arr5=arr4[2:4]输出:array([3,4])5.索引和切片(2)
二维数组的索引与切片对于二维数组,可以在单个或者2个轴向上完成切片,也可以和整数索引一起混合使用。当使用整数列表对数组元素进行存取时,将使用列表中的每个元素作为下标,这种索引称为“花式索引”。注意:使用列表作为下标得到的数组不和原始数组共享数据。arr=np.arange(32).reshape((8,4))#输出:array([[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14,15],[16,17,18,19],[20,21,22,23],[24,25,26,27],[28,29,30,31]])arr[[1,5,7,2],[0,3,1,2]]#输出:array([4,23,29,10])5.索引和切片Python程序设计基础及应用9.2数组运算通用函数(ufunc)是一种对数组中每个元素进行操作的函数,用法也很简单。通用函数支持全部的四则运算(+、-、*、/、**),并且保留习惯的运算符,但是需要注意,操作的对象是数组。数组间的四则运算表示对每个数组中的元素分别进行四则运算,所以进行四则运算的两个数组的形状必须一致。通用函数也支持比较运算(>、>=、<、<=、==、!=、all、any),返回结果是一个布尔数组,其每个元素对应元素的比较结果。1.通用运算a=np.arange(1,10,1).reshape(3,3)b=np.arange(10,19,1).reshape(3,3)b-a #输出:array([[9,9,9],[9,9,9],[9,9,9]])b/a #输出:array([[10.,5.5,4.],[3.25,2.8,2.5],[2.28571429,2.125,2.]])a[0]=20a>=b #输出:array([[True,True,True],[False,False,False],[False,False,False]],dtype=bool)1.通用运算2.统计函数在统计分析和数据挖掘中,经常会使用到统计运算。Python程序设计基础及应用9.3Pandas数据结构Series类似于一维数组,由一组数据(可以是任意的Numpy数据类型)和一组称之为数据标签的索引组成。(1)Series对象的创建通过列表数据产生frompandasimportSeries #导入pandas库中Series模块pds1=Series([1,2,3,4])#输出01122334dtype:int641.Series(序列)(1)Series对象的创建通过指定索引的方式pds2=Series([1,2,3,4],index=['a','b','c','d'])#输出a1b2c3d4dtype:int641.Series(序列)(1)Series对象的创建通过字典方式创建data={"i1":1,"i2":2,"i3":3,"i4":4}ps3=Series(data,index=['i1','i2','i3','i4'])#
字典是无序的,因此指定索引排列顺序#输出i11i22i33i44dtype:int641.Series(序列)DataFrame是一种类似于关系表的表格型数据结构,DataFrame对象是一个二维表格,其中,每列中的元素类型必须一致,而不同的列可以拥有不同的元素类型。它是数据科学中最为广泛使用的数据结构之一。Pandas提供了将其它数据结构转换为DataFrame的方法,还提供了众多的输入输出函数来将各利文件格式转换成DataFrame。使用DataFrame前,需要导入pandas库中的DataFrame模块(frompandasimportDataFrame)。创建DataFrame的方法有很多,最常用的是传入二维数组、由数组、Series、列表或者元组组成的字典给DataFrame()。2.DataFrame(数据框)data={"name":["王晓明","李静","田海"],"sex":["男","女","男"],"aged":[20,19,21]}#
字典是无序的,因此需要通过columns指定列索引的排列顺序df=DataFrame(data,columns=["name","sex","aged"])DataFrame数据有列索引和行索引,行索引类似于关系表中每行的编号(未指定行索引的情况下,会使用0到N-1作为行索引),列索引类似于表格的列名(也称为字段)。df1=DataFrame(data,columns=["name","sex","aged"],index=["L1","L2","L3"])2.DataFrame(数据框)重新索引就是对索引进行重新排序,而索引对象是无法修改的。1)Series对象的重新索引通过Series的reindex()方法可以调整index的次序,但不是定义一个全新的index,也就是说调整后的index必须为已经存在的index,只是改变了原有index顺序而已,否则自动增加index,对应的元素值为NaN(notanumber)缺失值。可以通过Series对象的isnull()方法或者notnull()方法来寻找缺失值。注意:使用reindex()方法不改变原来对象。3.重新索引重新索引就是对索引进行重新排序,而索引对象是无法修改的。1)Series对象的重新索引通过Series的reindex()方法可以调整index的次序,但不是定义一个全新的index,也就是说调整后的index必须为已经存在的index,只是改变了原有index顺序而已,否则自动增加index,对应的元素值为NaN(notanumber)缺失值。可以通过Series对象的isnull()方法或者notnull()方法来寻找缺失值。注意:使用reindex()方法不改变原来对象。obj.reindex(index=["b","c","a","d","e","n"])#使用reindex方法调整index顺序3.重新索引重新索引就是对索引进行重新排序,而索引对象是无法修改的。
(2)DataFrame对象的重新索引df=DataFrame(np.arange(9).reshape(3,3),index=["L1","L2","L3"],columns=["id1","id2","id3"])#
对df重新索引,新增的L4行标签对应的缺失值通过fill_value参数指定为9df2=df.reindex(index=["L1","L2","L3","L4"],columns=["id3","id2","id1"],fill_value=9)3.重新索引有时我们希望将列数据作为行索引,这时可以通过set_index()方法来更换索引,生成一个新的DataFrame,原来DataFrame不会发生变换。与set_index()方法相反的方法是reset_index()。data={"name":("张三","李四","王五","赵六"),"sex":("男","女","女","男"),"aged":(20,19,20,21),"score":(80,60,70,90)}df=DataFrame(data)#使用字典创建DataFrame对象df1=df.set_index("name")#使用name列更换默认行索引4.更换索引Python程序设计基础及应用9.4数据选择和运算(1)Series对象的索引和切片Series对象有两个特殊的属性index:由ndarray数组继承的Index索引对象,保存标签信息。values:保存元素值的ndarry数组,numpy的函数都对此数组进行处理。Series对象中元素的索引支持位置下标和标签下标两种形式。Series对象还支持位置切片和标签切片位置切片遵循Python的切片规则,包括起始位置,但不包括结束位置;但标签切片则同时包括起始标签和结束标签。1.索引和切片(1)Series对象的索引和切片Series对象有两个特殊的属性index:由ndarray数组继承的Index索引对象,保存标签信息。values:保存元素值的ndarry数组,numpy的函数都对此数组进行处理。Series对象中元素的索引支持位置下标和标签下标两种形式。Series对象还支持位置切片和标签切片位置切片遵循Python的切片规则,包括起始位置,但不包括结束位置;但标签切片则同时包括起始标签和结束标签。1.索引和切片(2)DataFrame索引和切片相比一维数组的数列Series数据选取,二维数组的数据框DataFrame数据选取更复杂,选取列和行都有具体的使用方法。DataFrame有两个索引对象:索引行标签的index和索引列标签的columns。使用索引对象的values()方法可以获取对应标签的数组对象,这些对象可以供numpy使用。通过列索引标签或者以属性的方式可以单独获取DataFrame的列数据,返回的数据为Series结构,通过标签列表可以获取多个列的数据。通过行索引标签或者行索引位置(0到N-1)的切片形式可以选取行数据。位置切片遵循Python的切片规则,包括起始位置,但不包括结束位置。标签切片则同时包括起始标签和结束标签。两种形式的切片返回结果都为DataFrame的子集。1.索引和切片(2)DataFrame索引和切片df["name"] #选取name列,也可以使用,返回一个Series对象,等价于df[["name","sex"]]#选取name、sex列,返回一个DataFrame对象1.索引和切片(1)增加行增加行数据可以通过append()函数传入字典数据即可。append_data={"name":"朱八","sex":"男","aged":23,"score":65}new_df=df.append(append_data,ignore_index=True)2.操作行和列(2)增加列增加列可以直接通过标签索引方式进行,当新增的列中的数值不一样时,可以传入列表或者数组结构进行赋值。new_df["city"]=["北京","西安","长春","珠海","昆明"]2.操作行和列(3)删除使用drop()函数可以删除指定轴上的信息,原来的DataFrame数据不会删除。new_df.drop(2)#删除行索引是2的信息2.操作行和列3.函数应用和映射在数据分析时,常常会对数据进行较复杂的数据运算,这时需要定义函数。定义好的函数可以应用到pandas数据中,其中有3种方法:map()函数,将函数应用到Series的每个元素中apply()函数,将函数应用到DataFrame的行与列上applymap()函数,将函数应用到DataFrame的每个元素上3.函数应用和映射data={"name":["张三","李四","王五"],"length":["172cm","175cm","168cm"]}df=DataFrame(data)deff(s):returns.split("cm")[0]df["length"]=df["length"].map(f)#在length列(Series对象)上的每个元素应用map函数3.函数应用和映射df1=pd.DataFrame(np.random.rand(3,3),columns=["a","b","c"])f=lambdax:x.mean()#定义lambda表达式,求均值df1.apply(f,axis=0)#沿列方向应用f,求每列的均值a0.304962b0.496319c0.570561dtype:float644.排序在Series中,通过sort_index()方法对索引进行排序,默认为升序;通过sort_values()方法对值进行排序,默认是升序。对于DataFrame数据而言,通过指定轴方向,使用sort_index()方法可以对行或者列索引进行排序。要根据列进行排序,可以通过sort_values()方法,把列名传给by参数即可。frame=DataFrame(np.arange(8).reshape((2,4)),index=['two','one'],columns=['d','a','b','c'])frame.sort_index()#默认axis=0,按照纵轴行索引升序排列5.统计信息在DataFrame数据中,通过sum()方法可以对每列进行求和和汇总,还可以指定要汇总的轴方向,方法返回一个Series对象。df=DataFrame([[1.4,np.nan],[7.1,-4.5],[np.nan,np.nan],[0.75,-1.3]],index=['a','b','c','d'],columns=['one','two'])6.唯一值和计数通过Series对象的unique()方法可以获取不重复的数据,而通过Series对象的values_counts()方法可以统计每个值出现的次数。df=DataFrame({'Va1':[1,3,4,3,4],'Va2':[2,3,1,2,3],'Va3':[1,5,2,4,4]})Python程序设计基础及应用9.5数据清洗1.处理缺失值现实中通过各种方式收集到的数据可能是“肮脏”的,使用前需要进行数据的清洗。数据清洗包括缺失值处理、重复数据的处理和替代值处理等具体操作。(1)处理缺失值在大多数的数据分析应用程序中,缺少数据是常见的,缺少的值被pandas标注为np.nan也就是缺失值NaN。设计pandas的目标之一是使处理丢失的数据尽可能的轻松。在Python基
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 酒吧积分活动方案策划(3篇)
- 银行手机客户营销方案(3篇)
- 马云农业营销方案(3篇)
- 第11课《依法从事民事活动》第1框《民事活动要守法》-【中职思政】《职业道法与法治》课件(高教版2023基础模块)
- 贵金属首饰机制工创新实践竞赛考核试卷含答案
- 20专项训练题组2 技术图样设计综合题组
- 碳汇计量评估师风险评估考核试卷含答案
- 改性塑料配制工常识竞赛考核试卷含答案
- 合成橡胶生产工岗前实操知识能力考核试卷含答案
- 音圈绕制工岗前核心管理考核试卷含答案
- 北师大版数学一年级上册期末试卷及参考答案(3套卷)
- 3输变电工程施工质量验收统一表式(变电工程电气专业)-2024年版
- 冲压设备的维护与保养
- 消防职业道德教育课件
- 数学史全套课件
- 2021市政工程资料表格填写范例样本
- 高空作业专项施工方案
- 成都建筑装饰装修工程设计收费标准
- GB/T 6117.1-1996立铣刀第1部分:直柄立铣刀的型式和尺寸
- GB/T 16301-2008船舶机舱辅机振动烈度的测量和评价
- GB/T 1185-2006光学零件表面疵病
评论
0/150
提交评论