Python深度学习及智能车竞赛实践 课件 4-函数和类_第1页
Python深度学习及智能车竞赛实践 课件 4-函数和类_第2页
Python深度学习及智能车竞赛实践 课件 4-函数和类_第3页
Python深度学习及智能车竞赛实践 课件 4-函数和类_第4页
Python深度学习及智能车竞赛实践 课件 4-函数和类_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章函数和类Python深度学习及智能车竞赛实践010203代码复用和模块化设计函数面向对象和类目录第2页010203代码复用和模块化设计函数面向对象和类目录第3页代码复用把代码当成资源进行抽象代码资源化:程序代码是一种用来表达计算的"资源"代码抽象化:使用函数等方法对代码赋予更高级别的定义代码复用:同一份代码在需要时可以被重复使用1.代码复用和模块化设计函数和对象是代码复用的两种主要形式函数:将代码命名defa(n):在代码层面建立了初步抽象对象:属性和方法<a>.<b>和<a>.<b>()在函数之上再次组织进行抽象抽象级别1.代码复用和模块化设计代码复用模块化设计通过函数或对象封装将程序划分为模块及模块间的表达具体包括:主程序、子程序和子程序间关系一种分而治之、分层抽象、体系化的设计思想1.代码复用和模块化设计代码复用紧耦合:两个部分之间交流很多,无法独立存在松耦合:两个部分之间交流较少,可以独立存在模块内部紧耦合、模块之间松耦合1.代码复用和模块化设计模块化设计代码复用010203代码复用和模块化设计

函数面向对象和类目录第8页02函数2.1函数的定义和调用2.2函数的参数传递和返回值2.3局部变量和全局变量2.4函数的递归2.5lamda函数2.6实例-单层感知器模型目录第9页函数的定义函数是一段具有特定功能的、可重用的语句组函数是一种功能的抽象,一般函数表达特定功能两个作用:降低编程难度和代码复用2.1函数的定义和调用def<函数名>(<参数(0个或多个)>)

:<函数体>

return

<返回值>defmax1(a,b):

ifa>b:

returna

else:returnb例:求最大数值函数函数名参数返回值函数体函数的定义2.1函数的定义和调用y

=max1(a,b)函数定义时,参数是输入、函数体是处理、结果是输出(IPO)函数定义时,所使用的参数是一种占位符函数定义后,如果不经过调用,不会被执行函数的定义2.1函数的定义和调用defmax1(a,b):

ifa>b:

returna

else:returnbprint(max1(5,10))函数的定义函数的调用调用时要给出实际参数实际参数替换定义中的参数函数调用后得到返回值函数的调用:运行函数代码的方式2.1函数的定义和调用defmax1(a,b):

ifa>b:

returna

else:returnbprint(max1(5,10))102.1函数的定义和调用函数的调用过程02函数2.1函数的定义和调用2.2函数的参数传递和返回值2.3局部变量和全局变量2.4函数的递归2.5lamda函数2.6实例-单层感知器模型目录第15页函数的参数#实例4.3distance.py汽车行驶里程计算carspeed

=

30cartime=20def

get_distance(speed,time):

distance

=

speed

*

time

print(distance)get_distance(carspeed,cartime)实际参数:函数调用的时候使用的参数形式参数:定义函数的时候在括号中的参数2.2函数的参数传递和返回值函数可以有参数,也可以没有,但必须保留括号def<函数名>()

:<函数体>

return

<返回值>deffact():

print("强国有我")函数的参数2.2函数的参数传递和返回值函数调用时,参数可以按照位置或名称方式传递Speed:30Time:20Distance:600函数的参数传递的两种方式2.2函数的参数传递和返回值Speed:30Time:20Distance:600Speed:30Time:20Distance:600函数调用时,参数可以按照位置或名称方式传递函数的参数传递的两种方式2.2函数的参数传递和返回值可选参数:函数定义时可以为某些参数指定默认值def<函数名>(<非可选参数>,<可选参数>)

:<函数体>

return

<返回值>2.2函数的参数传递和返回值可选参数传递Speed:30Time:20Distance:600Speed:10Time:20Distance:2002.2函数的参数传递和返回值可选参数传递函数定义时可以设计可变数量参数,既不确定参数总数量def<函数名>(<参数>,*b)

:<函数体>

return

<返回值>2.2函数的参数传递和返回值可变参数传递参数前面加“*”表示可变参数数量1号赛车速度是50,里程是10002号赛车速度是60,里程是12003号赛车速度是70,里程是14002.2函数的参数传递和返回值可变参数传递函数可以返回0个或多个结果

return保留字用来传递返回值

函数可以有返回值,也可以没有,可以有return,也可以没有return可以传递0个返回值,也可以传递任意多个返回值2.2函数的参数传递和返回值函数的返回值return可以返回1个值S=6002.2函数的参数传递和返回值函数的返回值return可以返回多个值一个元组类型数据3020600(30,20,600)2.2函数的参数传递和返回值函数的返回值02函数2.1函数的定义和调用2.2函数的参数传递和返回值2.3局部变量和全局变量2.4函数的递归2.5lamda函数2.6实例-单层感知器模型目录第27页全局变量:函数之外定义的变量,在程序执行全过程有效。局部变量:函数内部使用的变量,仅在函数内部有效,当函数调用结束时变量将不存在。2.3局部变量和全局变量<语句块1>def<函数名>(<参数>)

:<函数体>

return

<返回值><语句块2>函数局部变量程序全局变量n,s=5,10deffact(n):s=1

foriin

range(1,n+1):s*=i

returnsprint(fact(n),s)#n和s是全局变量运行结果>>>12010#fact()函数中的n和s是局部变量#此处是全局变量n和s2.3局部变量和全局变量规则1:局部变量和全局变量是不同变量局部变量是函数内部的占位符,与全局变量可能重名但不是同一变量;函数运算结束后,局部变量被释放;可以使用global保留字在函数内部使用全局变量。2.3局部变量和全局变量n,s=5,10deffact(n):s=1

foriin

range(1,n+1):s*=i

returnsprint(fact(n),s)运行结果>>>12010fact()函数中s是局部变量与全局变量s不同此处局部变量s是120此处全局变量s是102.3局部变量和全局变量n,s=5,10deffact(n):

globals

foriin

range(1,n+1):s*=i

returnsprint(fact(n),s)运行结果>>>12001200fact()函数中使用global保留字声明此处s是全局变量s此处s指全局变量s此处全局变量s被函数修改2.3局部变量和全局变量ls=["S","T"]deffunc(a):ls.append(a)

returnfunc("D")print(ls)运行结果>>>['S','T','D']此处ls是列表类型,未真实创建则等同于全局变量通过使用[]真实创建了一个全局变量列表ls全局变量ls被修改规则2:局部变量为组合数据类型且未创建,等同于全局变量2.3局部变量和全局变量ls=["S","T"]deffunc(a):ls=[]ls.append(a)

returnfunc("D")print(ls)运行结果>>>['S','T']此处ls是列表类型,真实创建ls是局部变量通过使用[]真实创建了一个全局变量列表ls局部变量ls被修改2.3局部变量和全局变量局部变量和全局变量使用规则基本数据类型,无论是否重名,局部变量与全局变量不同可以通过global保留字在函数内部声明全局变量组合数据类型,如果局部变量未真实创建,则是全局变量2.3局部变量和全局变量02函数2.1函数的定义和调用2.2函数的参数传递和返回值2.3局部变量和全局变量2.4函数的递归2.5lamda函数2.6实例-单层感知器模型目录第36页递归:函数定义中调用函数自身的方式2.4函数的递归递归的两个关键特征:链条:计算过程存在递归链条基例:存在一个或多个不需要再次递归的基例def

fact(n):

if

n==0:

return1

else:

returnn*fact(n-1)2.4函数的递归递归的实现:函数+分支语句递归本身是一个函数;函数内部采用分支语句对输入参数进行判断,基例和链条,分别编写代码;递归的调用过程fact(5)递归调用def

fact(n):

if

n==0:

return1

else:

returnn*fact(n-1)n=5def

fact(n):

if

n==0:

return1

else:

returnn*fact(n-1)n=4n=4n=5def

fact(n):

if

n==0:

return1

else:

returnn*fact(n-1)n=3n=3def

fact(n):

if

n==0:

return1

else:

returnn*fact(n-1)n=2n=2def

fact(n):

if

n==0:

return1

else:

returnn*fact(n-1)n=1n=1def

fact(n):

if

n==0:

return1

else:

returnn*fact(n-1)n=0n=01126241202.4函数的递归递归的使用分析下面函数的结果defreverse(s):ifs=="":returnselse:returnreverse(s[1:])+s[0]print(reverse(“XYZ"))>>>defreverse(s):returnreverse(s[1:])+s[0]>>>

reverse(“XYZ")RecursionError:maximumrecursiondepthexceededs[0]是首字符,s[1:]是剩余字符串,将它们反向连接,可以得到反转字符串。2.4函数的递归将字符串s反转后输出s[::-1]def

rvs(s):

if

s=="":

returns

else:

returnrvs(s[1:])+s[0]2.4函数的递归递归的使用:字符串反转02函数2.1函数的定义和调用2.2函数的参数传递和返回值2.3局部变量和全局变量2.4函数的递归2.5lamda函数2.6实例-单层感知器模型目录第42页lambda函数是一种匿名函数,即没有名字的函数使用lambda保留字定义,函数名是返回结果lambda函数用于定义简单的、能够在一行内表示的函数2.5lambda函数<函数名>=lambda<参数>:<表达式>def<函数名>(<参数>)

:<函数体>

return

<返回值>等价于运行结果>>><class'function'>6002.5lambda函数lambda函数的应用lambda函数主要用作一些特定函数或方法的参数,比如在机器学习或深度学习方法中的参数;一般情况,建议使用def定义普通函数。2.5lambda函数02函数2.1函数的定义和调用2.2函数的参数传递和返回值2.3局部变量和全局变量2.4函数的递归2.5lamda函数2.6实例-单层感知器模型目录第46页w0w1w2wnΣ

Φ生物神经元结构人工网络神经元结构2.6实例:单层感知器模型输入节点:x1,x2,x3输出节点:y权向量:w1,w2,w3偏置因子:b激活函数:sign(x)=1 x>=0-1 x<0单层感知器(SingleLayerPerceptron)是最简单的神经网络。它包含输入层和输出层,而输入层和输出层是直接相连的。2.6实例:单层感知器模型问题分析需求:用程序写出单层感知器模型输入信息:信号信息输出结果:-1,1该怎么做呢?2.6实例:单层感知器模型基本思路步骤1:定义神经元净活值函数-

步骤2:定义神经元激活函数y=f(z)=sign(z)2.6实例:单层感知器模型程序设计(4.16neuron.py)2.6实例:单层感知器模型010203代码复用和模块化设计

函数面向对象和类目录第52页03面向对象和类3.1面向对象基本概念3.2python类的定义与使用3.3类变量和实例变量3.4类的属性和方法3.5类的继承3.6实例:智能车自动巡航类创建目录第53页如:汽车是拥有外形、尺寸、颜色等外部特性,行驶、停车、转向、刹车等功能的实体,而这样一个实体在面向对象的程序中,就可以表达成一个计算机可理解、可操纵、具有一定属性和行为的对象。对象:现实世界中某个具体的物理实体的逻辑表示(抽象)或者包含有内部状态的概念。3.1面向对象基本概念面向对象的方法,使我们分析、设计和实现一个系统的方法尽可能自然地使用我们在生活中用到的以对象为中心的思想。面向对象和面向过程都是一种思想面向过程强调的是功能行为;面向对象将功能封装进对象,强调具备了功能的对象;面向对象是基于面向过程的;从执行者变成指挥者。3.1面向对象基本概念掌握面向对象的困难之处在于思路的转换,以对象世界的思维方式来思考问题;定义类和建立对象是面向对象编程的主要任务。3.1面向对象基本概念面向对象编程的主要特点封装性(Encapsulation):

实现模块化和信息隐藏,有利于程序的可移植性;继承性(Inheritance):

可以定义一套对象之间的层级关系,下层的对象继承了上层对象的特性,籍此可以实现程序代码重用,并且有效地组织整个程序;多态性(Polymorpyism):

根据程序运行时对象的实例类型来选择不同的信息处理,籍此可以提高程序的灵活性。3.1面向对象基本概念面向对象编程特点–封装性封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。3.1面向对象基本概念什么是子类?自然界通过继承而繁衍发展;程序中的继承是通过子类向父类继承实现的。子类是作为父类的扩充或修正所定义的一个类。面向对象编程特点–继承性3.1面向对象基本概念继承是子类利用父类中定义的方法和变量,就像它们属于子类本身一样;继承关系是可以传递的:若类C继承类B,类B继承类A时,则类C既有从类B继承下来的属性和方法,也有从类A继承下来的属性和方法,还可以有自己新定义的属性和方法。面向对象编程特点–继承性3.1面向对象基本概念继承简化了人们对事物的认识和描述,能清晰体现相关类间的层级结构关系;提供软件复用功能,若类B继承类A,建立类B时只需要再描述与基类(类A)不同的少量特征(数据成员和方法),可减少代码和数的冗余度,大大增加程序的重用性。面向对象编程特点–继承性3.1面向对象基本概念多态即“有多种形式”,可以根据对象(类)类型的不同而表现出不同的行为;多态即多种形态,在运行时确定其状态,在定义阶段无需确定其类型;Python中的变量是弱类型的,在定义时不能指明其类型,它会根据需要在运行时确定变量的类型;Python中很多地方体现多态的特性,比如内置函数len(object),len函数不仅可以计算字符串的长度还可以计算列表、元组等对象的元素个数。面向对象编程特点–多态性3.1面向对象基本概念封装和多态区别封装可以让用户不关心对象如何构建而直接进行使用;多态可以让用户对于不知道什么类(对象类型)的对象进行方法调用。3.1面向对象基本概念类(Class)是用来描述具有相同属性(Attribute)和方法(Method)对象的模板对象(Object)是类(Class)的具体实例。比如赛车都有校名和比赛成绩等,他们有着共同的属性。这时我们就可以设计一个赛车类,用于记录赛车的校名和成绩等,并自定义方法打印出他们的名字和方法。属性:类里面用于描述所有对象共同特征的变量或数据,比如赛车的竞赛排名。方法:类里面的函数,用来区别类外面的函数,用来实现某些功能,比如赛车中用来打印出赛车的校名和成绩的函数。类和对象的关系3.1面向对象基本概念03面向对象和类3.1面向对象基本概念3.2python类的定义与使用3.3类变量和实例变量3.4类的属性和方法3.5类的继承3.6实例:智能车自动巡航类创建目录第65页Python完全采用了面向对象程序设计的思想,是真正面向对象的高级动态编程语言,完全支持面向对象的基本功能;与其他面向对象程序设计语言不同的是,Python中对象的概念很广泛,Python中的一切内容都可以称为对象,例如,字符串、列表、字典、元组等内置数据类型都具有和类完全相似的语法和用法;创建类时用变量形式表示的对象属性称为数据成员或成员属性,用函数形式表示的对象行为称为成员函数或成员方法,成员属性和成员方法统称为类的成员。3.2python类的定义与使用Python使用class关键字来定义类,类名的首字母一般要大写(非语法要求)。Python类的定义创建类class

ClassName:

‘类的帮助信息’

#类文档字符串

class_suite#类体,由类成员,方法,数据属性组成例如创建Car类此时只定义了一个抽象的类,电脑并没有分配什么存储空间。3.2python类的定义与使用定义了类之后,可以用来实例化对象,并通过“对象名.成员”的方式来访问其中的数据成员或成员方法,例如下面的代码:Python使用内置方法isinstance()来测试一个对象是否为某个类的实例。完成类的实例化(Instance)时,电脑才会创建一个具体的对象(Object),并为之分配存储空间。所以对象(Object)是类(Class)的一个实例;Car是类,car是对象Python类的定义3.2python类的定义与使用Python提供了一个关键字“pass”,类似于空语句,可以用在类和函数的定义中或者选择结构中。当暂时没有确定如何实现功能,或者为以后的软件升级预留空间,或者其他类型功能时,可以使用该关键字来“占位”。例如下面的代码都是合法:>>>

class

A:

pass>>>

def

demo():

pass>>>

if5>3:

passpass的使用3.2python类的定义与使用Python会自动调用默认的__init__初始构造函数来生成具体的对象。标识符self是个非常重要的参数,代表创建的对象本身。3.2python类的定义与使用4.18RacingCar203面向对象和类3.1面向对象基本概念3.2python类的定义与使用3.3类变量和实例变量3.4类的属性和方法3.5类的继承3.6实例:智能车自动巡航类创建目录第71页sumnumber不属于某个具体赛车,而属于RacingCar类的,所以被定义为类变量(classvariables)。而赛车号、速度和转向属于每个赛车对象的,所以定位为实例变量(instancevariables),也被称为对象变量(objectvariables)。3.3类变量和实例变量4.19RacingCar303面向对象和类3.1面向对象基本概念3.2python类的定义与使用3.3类变量和实例变量3.4类的属性和方法3.5类的继承3.6实例:智能车自动巡航类创建目录第73页注意:python类并没有真正的私有属性,用__定义的属性,只是一种程序员约定俗称的规定,加了就表示私有变量,但是你如果要在外部调用的话,还是可以调用的。1.类的公有属性

public_attrs:符合正确的变量命名规则,开头没有下划线,类外部可以直接进行访问。如上例中的name、age等。2.类的私有属性

__private_attrs:由两个下划线开头,声明该属性为私有,在类内部的方法中使用时的格式为self.__private_attrs。类的属性和方法3.4类的属性和方法3.类的构造方法

__init__:叫作构造函数或者构造方法,它在生成一个对象时被自动调用。在上例子中Student(“John”,100)语句就是调用__init__方法将参数传递给和self.score。4.类的公共方法

public_method:在类的内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数。self在Python里不是关键字,self代表当前对象的地址,类似于Java语言中的this。类的属性和方法3.4类的属性和方法5.类的私有方法

__private_method:由两个下划线开头,声明该方法为私有方法,不能在类的外部调用。在类的内部调用时格式为self.__private_methods。

在面向对象的编程中,通常情况下很少让外部类直接访问类内部的属性和方法,而是向外部类提供一些按钮,对其内部的成员进行访问,以保证程序的安全性,这就是封装性。4.19RacingCar3-2类的属性和方法3.4类的属性和方法类的专有方法专有方法专有方法说明__init__构造函数,在生成

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论