Python程序设计基础 课件 第5章 函数_第1页
Python程序设计基础 课件 第5章 函数_第2页
Python程序设计基础 课件 第5章 函数_第3页
Python程序设计基础 课件 第5章 函数_第4页
Python程序设计基础 课件 第5章 函数_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

第五章函数

目录1.函数的概念2.参数与返回值3.参数的类型4.lambda函数5.变量的作用域6.递归1当程序的长度在几十行甚至超过百行时,如果不划分模块,程序的可读性是非常糟糕的。解决这一问题的最好的方法就是一段程序划分为若干个短小的程序段,每一段完成一个功能。函数就是这种程序段的具体实现。

函数的概念1Python中的函数包括内置函数、标准库函数、第三方库、用户自定义函数等。内置函数:Python提供的,安装Python后即可直接使用的函数,如print()、int(),len()等。标准库函数:通过import导入对应库即可使用,如math库,random库。第三方库:需要先安装,然后import导入,然后使用,如jieba库。用户自定义函数:需程序员通过def关键字先定义该函数,并编写对应功能的实现代码,然后才可以通过调用语句进行使用。

函数的概念1函数必须“先定义,后使用”。对函数进行定义,指定它的名字、函数返回值类型、函数实现的功能以及参数的个数与类型。在程序执行自定义函数时,按照定义时所指定的功能执行。1.1函数的定义和调用

函数的概念11.1函数的定义和调用Python使用def保留字定义一个函数,语法形式如下:

def<函数名>(<形参列表>):<函数体>return<返回值>def是关键字,用于定义一个函数;函数名可以是任何有效的Python标识符;形参列表是调用函数时传递给它的值,可以有零个、一个或者多个,当参数为多个时,参数之间用逗号隔开;

函数的概念11.1函数的定义和调用Python使用def保留字定义一个函数,语法形式如下:

def<函数名>(<形参列表>):<函数体>return<返回值>函数体是指每次调用函数执行的代码,由一行或者多行代码组成。当函数需要返回值时,用return保留字和返回值组成,返回值表示调用该函数返回的值;当函数不需要返回值时,函数中没有return保留字和返回值。

函数的概念1示例:定义一个函数求两个点的欧氏距离:importmathdefdistance(point1,point2): #定义函数 x1,y1=point1 #获取点坐标 x2,y2=point2 d=math.sqrt((x2-x1)**2+(y2-y1)**2) returnd #返回两点距离

上述代码表示定义了一个函数名为distance的函数,形参列表为point1,point2两个参数,函数体为获取两点的坐标、计算两点之间的欧式距离并将结果赋值给distance,返回值为distance。

函数的概念11.2调用函数的调用的格式如下:函数名([<实参列表>])<实参列表>为待传递给函数执行的数据。函数只有被调用后,函数才会开始执行。每调用一次函数,函数中定义的函数体执行一遍。如果需要多次执行函数的功能,只需要多次调用该函数即可。

函数的概念1.1对上述定义的求欧式距离函数distance进行调用,下面演示调用两次:pointA=(1,2) #指定点A坐标pointB=(4,6) #指定点B坐标d1=distance(pointA,pointB) #调用函数,计算AB两点距离print(d1) #打印AB两点距离pointC=(-1,-2) #指定点C坐标pointD=(6,4) #指定点D坐标d2=distance(pointC,pointD)#调用函数,计算CD两点距离print("%.2f"%d2) #打印CD两点距离,并保留两位小数

====================RESTART:D:/python/ch5/1.py=====================59.22

函数的概念11.2函数的调用过程在程序中调用函数需要执行以下四个步骤。调用处暂停:在需要使用该函数的地方,可以直接使用函数名称后加圆括号来调用函数,原程序处暂停执行。传递参数:如果函数有参数,需要在函数调用时传递相应的参数。执行函数体代码:函数被调用时,程序会从函数定义的地方开始执行函数体内的代码。返回结果:函数执行完成后,可以通过return语句返回一个结果,如果没有return语句,则返回None。

函数的概念11.2函数的调用过程程序调用的分解图如图1所示,1表示调用distance函数,程序暂停,2表示将实参赋值给形参,3表示执行函数体中的内容,4表示返回值赋值给d1,程序回到暂停处并继续执行下面程序。图1函数的调用过程

函数的概念2参数与返回值形式参数(Parameters)是在函数(也称为被调函数)定义时声明的变量,用于接收函数(也称为主调函数)调用时传递的值,简称“形参”。形参的作用是定义函数需要接收的数据类型和数量,以及参数的名称。实际参数(Arguments)是在函数调用时实际传递的值,用于给形参赋值,简称“实参”。实参的作用是提供给函数执行所需的具体数据。2.1实参与形参2参数与返回值2.2实参与形参的传递实参和形参的内存地址不会直接改变。当传递一个对象作为参数时,实参与形参将引用同一个对象的内存地址。这意味着在函数内部对该对象的任何修改都会影响到实参。当传递的值是不可变的对象(例如整数、字符串和元组)时,如果函数体不修改变量的值,那么实参和形参指向同一内存地址,即实参与形参相统一。2参数与返回值示例:不可变对象实参与形参相统一当调用函数newa=func(origa,origb),将两个实参origa和origb分别传给形参a、b,由于func函数体未对第一个变量进行修改,因此,origa和a指向相同的内存地址,如图2所示,此时称为实参与形参相统一。图2不可变类型实参与形参相统一示意图2参数与返回值示例:不可变对象实参与形参不统一图3不可变类型实参与形参不统一当函数体执行b=a+b时,变量b发生变化并指向新的内存地址,如图3所示,此时内存地址已发生改变,origb和b指向不同的内存地址,此时称为实参与形参不统一。2参数与返回值当传递的值是可变的对象(例如列表、字典等)时,如果实参和形参指向相同的内存地址,则称为实参与形参相统一。示例:可变类型实参和形参相统一在函数体中,虽然对列表进行添加操作,但是并未改变列表的内存地址,因此,仍称实参和形参相统一。2参数与返回值示例:可变类型实参和形参不统一在函数体中,对传入的列表进行重新赋值,改变了列表的内存地址如图4所示,此时称实参和形参不统一。图4可变类型实参和形参不统一2参数与返回值2.3函数的返回值Python函数的返回值指的是被调函数在执行完毕后通过return语句返回的值。返回值可以是任意类型的对象,包括数字、字符串、布尔值、列表、字典、元组等。函数也可以没有返回值。即完成某项任务后就结束。2参数与返回值示例:两个数的加法并将结果返回add()函数接收两个参数a和b,将它们相加得到result,然后使用return语句将result作为返回值返回给调用者。2参数与返回值示例:函数返回多个值calculate()函数接收两个参数a和b,然后计算它们的和sum和差diff,最后使用return语句返回一个包含sum和diff的元组。2参数与返回值2.4无参函数无参函数是指在定义函数时,函数名后面括号中没有参数列表,即函数没有参数。无参函数可以用来执行一些不需要输入参数的操作,例如,打印输出、获取当前时间等。语法格式:2参数与返回值示例:定义一个函数实现程序初始化。welcome()函数没有任何参数,调用时,会执行函数体的内容,打印输出。2参数与返回值示例:定义一个函数实现获取当前时间get_current_date()函数没有任何参数,当调用时会返回当前的日期。3参数的类型Python中可使用不同的参数类型来调用函数。参数类型包括:位置参数、默认值参数、关键字参数和可变长度参数。3.1位置参数函数调用时的参数一般采用按位置匹配的方式,即在函数调用时,实参按顺序传递给函数定义时相应位置的形参,两者的数目和顺序必须完全一致。2参数与返回值示例:位置参数greet()函数接受两个位置参数name和age。在调用函数时,按照定义的顺序传递相应的参数值。调用greet()函数:2参数与返回值示例:位置参数如果在调用函数时不按照定义的顺序传递参数值,将会导致错误。3参数的类型3.2默认参数默认参数是指在函数定义时给参数设置一个默认值,执行函数时如果没有传入该参数的值,则使用默认值。默认参数的定义方式是在函数定义时,使用赋值操作符“=”为参数设置默认值。3参数的类型示例:默认参数greeting()函数有两个参数,name和age。age参数是一个默认参数,其默认值为20。当调用函数时只传入一个参数name时,age参数会使用默认值20。3参数的类型示例:默认值必须从最右边开始默认值必须从最右边开始。第一次函数调用使用位置参数,依次给a,b,c赋值为1,2,3。第二次只有两个参数,按默认从最右边开始的原则,c取默认值2,a,b分别被赋值为10,20。第三次调用进a被赋值为55,b,c均使用了默认值。3参数的类型示例:默认值参数的应用运行结果:第一次调用时没有实参,使用默认值参数,形参s默认为"Python"。第二次调用时有实参则使用位置参数,形参s被赋值为"ourcountry”。3参数的类型3.3关键字参数关键字参数是指通过参数名来传递参数值,而不是通过顺序来传递参数值。关键字参数的优点是可以不按照函数定义时的参数顺序进行传值,而是通过参数名来指定传值的参数,因此可以跳过某些参数或脱离参数的顺序。关键字参数与默认参数区别:关键字参数作用于函数调用处。默认参数作用于形参。3参数的类型示例:关键字参数greeting()函数有两个参数,name和age,函数调用时,给age传参数值为25,给name传参数值为“Amy”。当使用关键字参数调用函数时,可以通过参数名来指定传入的参数值的顺序。3参数的类型3.4可变长度参数在程序设计中,可能会遇到函数的参数个数不固定的情况,这是就需要用到可变长度的参数来实现预定功能。Python提供了两种类型的可变长参数:*args和**kwargs。*args用于传递不确定数量的非关键字参数,它将参数打包成一个元组(tuple)的形式,在函数体内可以使用这个元组进行迭代或操作。**kwargs用于传递不确定数量的关键字参数,它将参数打包成一个字典(dict)的形式,在函数体内可以使用这个字典进行访问或操作。3参数的类型示例:元组作为唯一参数示例:元组不作为唯一参数元组可变长度参数,需要在参数名前加*,可接收多个实参并将其放入一个元组中。3参数的类型示例:元组作为可变长度参数的应用计算一组数的平均数。输入一组不定长的数字,求出它们的平均值并返回。3参数的类型示例:字典作为可变长度参数字典可变长度参数,需要在参数名前加**,可以接收多个实参。3参数的类型示例:购物车计算购物清单中所有物品的总价格。购物清单是一个字典,其中键是物品的名称,值是物品的价格。购物清单的长度和内容是不固定的。3参数的类型示例:print函数的可变长参数内置函数print也可以看做是可变长参数函数。3参数的类型示例:几种参数类型的综合应用,求参数的和运行结果:524lambda函数匿名函数又称lambda函数。匿名函数并非没有名字,而是将函数名作为函数结果返回。

语法格式:等价于:4lambda函数Python匿名函数的特性如下:1)lambda函数可以接受任意数量的参数,但只能有一个表达式。这个表达式的结果就是这个函数的返回值。2)lambda函数不需要通过def定义,无需提供函数名。这也是其“匿名函数”的本质所在。3)lambda函数可以很方便地定义在需要使用的地方,无需提前定义。4lambda函数示例:使用lambda函数实现两个数求和示例:使用lambda函数实现两个数求和4lambda函数示例:使用lambda函数实现列表排序其中,stulist为学生成绩列表,每个元素均为一个元组,元组中的元素依次为姓名,语文成绩,数学成绩,英语成绩。若需根据语文成绩降序进行排列,则可执行语句:##结果为张峰',96,86,90),李硕',90,70,100),王涵',89,90,若需根据英语成绩升序进行排列,则可执行语句:##结果为[('张峰',96,86,90),('李硕',90,70,100),('王涵',89,90,98)]4lambda函数若需根据总成绩降序进行排列,则可执行语句:##结果为王涵',89,90,98),张峰',96,86,90),李硕',90,70,也可以用:5变量的作用域Python变量的作用域是由变量被定义的位置决定的。变量根据其作用范围可以分为局部变量和全局变量。1.局部变量函数内部定义的变量称为内部变量,也称为局部变量,只能在函数内部访问。当函数执行结束后,局部变量的作用域也就结束了,变量的生命周期也随之结束。示例:局部变量5变量的作用域2.全局变量全局变量是在函数外部定义的变量,在整个程序中都可以访问。全局变量在任何地方都可以引用。示例:全局变量5变量的作用域3.global关键字在函数中只能访问函数内部定义的变量(局部变量),无法直接修改外部的全局变量。但是,使用global关键字可以在函数内部修改全局变量的值。示例:global的应用在以上程序中,定义了一个全局变量x,并赋值10,因此在函数体中也可以访问此变量,但在函数内部没有使用global关键字就想修改全局变量的值x+=n,发生异常。5变量的作用域在函数体内修改全局变量的值可以使用global关键字对该变量进行声明,然后再修改其值。5变量的作用域4.同名变量当局部变量和全局变量的变量名一样时,以作用域小的(即局部变量)为优先。示例:同名变量6递归函数内部可以调用其他函数,以实现较为复杂的功能。如果在一个函数中,直接或间接的调用函数自身,这个函数就称为递归函数。递归函数是一种非常实用的程序设计技术。许多问题都具有递归的特性,在某些情况下,使用其他方法很难解决的问题,利用递归可以很轻松解决。1.递归定义6递归示例:求数的阶乘阶乘是指一个数连乘自己和自己的前面所有整数的积,通过可将阶乘的求解分解为n(n-1)!,当n=1,直接定义阶乘的结果为1,具体见公式5-1所示。如果要计算4的阶乘,根据阶乘的定义,4!=4×3!,3!=3×2!,2!=2×1!,1!=1,因此,可求得4!=4×3×2×16递归示例:求数的阶乘在该例中,定义一个Fact()函数来求解正整数的阶乘。当“n=1”时,函数直接返回值“1”,当“n>1”时,调用n*Fact(n-1)。6递归下面将以求解正整数4的阶乘来说明函数的递归调用过程。2.递归调用过程递推过程是递归算法中的关键步骤,它将原始问题分解为一个或多个相似但规模较小的子问题。在递推过程中,通常会调用相同的函数,使用不同的参数,参数被修改以处理规模较小的子问题,以便在每次递归调用中接近问题的解决。如图5所示,1—4是递推过程,将求解Fact(4)问题分解为求多个功能相似但规模较小的子问题。图5

Fact函数递归调用过程6递归2.递归调用过程回归过程是递归算法的基本情况或终止条件,它指定了在某些条件下递归应该停止。当问题被分解到足够小的规模时,回归过程会提供问题的直接解决方案,而不需要进一步的递归。回归过程的目的是防止递归无限进行。如图5所示,在递推过程中,将求解的问题划分到最小规模Fact(1)=1,步骤5—8直接返回每个子问题的结果。图5

Fact函数递归调用过程6递归根据上述的递归调用过程可以得出,所有的递归函数必须满足下列两点:(1)递归出口,递归必须有终止条件和终止值,在求解阶乘的例子中,“n==1”是递归的终止条件,“1”是终止值。(2)递归方向,向终止条件的方向发展。在求解阶乘的例子中,“Fact(n-1)”,规定了递归方向,不管n是多大,最终都会递减到1。6递归3.递归的实现递归一般由函数+分支语句组成,递归本身是一个函数,所以需要用函数定义方式去描述;在函数内部,采用分支语句对输入参数进行判断,根据递归出口和方向,分别编写对应代码。6递归猴子一天采摘若干个桃子,现在每天吃现有桃子数的一半多一个,第7天早上只剩下1个桃子,问猴子一共采摘了多少个桃子。分析:设第n天桃子数量=(第n+1天桃子数量+1)×2,而第7天桃子数量为1,可用公式5-2表示。递归出口:第7天桃子数量为1。递归方向:桃子数量从第1天到第7天递减。6递归3.Fibonacci数列在自然界中的许多地方都会出现Fibonacci数列(斐波那契数列),例如,蜂巢中蜂的繁殖模式,花朵的花瓣数,贝壳的螺旋线等。此外,斐波那契数列在计算机编程和金融市场预测等领域也有应用。Fibonacci数列的数学表示方式如公式5-3所示。前几项是:1、1、2、3、5、8、13、21等。从第三项开始,每一项都等于它前面的两项之和。6递归3.1多变量迭代实现在多变量迭代方法中,可以采用三个变量f0、f1、f2完成。第一次迭代:给f0和f1赋值为1,由于每个元素是前两个元素的和,推出第三个元素值为:f2=f1+f0。第二次迭代:将f1(1)的值传递给f0,f2(1)的值传递给f1,再通过f2=f1+f0获取第四个元素的值。第三次迭代:将f1(2)的值传递给f0,f2(2)的值传递给f1,再通过f2=f1+f0获取第五个元素的值。其过程如图6所示:图6Fibonacci数列多变量迭代过程(前5项)6递归多变量迭代实现代码:多变量迭代版本的优点是代码简单、执行速度快,因为它只做了简单的加法运算,没有涉及到复杂的数据结构。代码简化:这里,巧妙地使用Python中元组功能,直接将原来的f1值作为新的f0,原来的f0+f1作为新的f1,省略了f2变量的使用6递归代码实现:列表可以有序地存放多个元素。首先定义一个列表存放第一个和第二个值“[1,1]”,从第三个值开始,每增加一个元素都是前两个元素的和。列表迭代版本的优点是逻辑清晰,容易理解,但是空间复杂度较高,每次迭代都会在列表末尾添加一个新元素,当n很大时,会消耗很多内存。3.2列表元素迭代6递归递归出口:n=0,1。递归方向:由待求解的第n项向第二项递减。3.3递归实现代码实现:6递归在采用递归思想解决实际问题时,代码编写非常简单,但效率不一定高,在递归过程中,存在着大量的重复计算。如图7所示,计算Fib(4)时,会计算Fib(3)和Fib(2),计算Fib(3)时,会计算Fib(2)和Fib(1),其中计算Fib(2)被计算了两次,如果计算的n值非常大,将会产生大量的重复计算,导致大量的内存开销。3.3递归实现图7Fibonacci数列递归实现过程综合以上分析,Fibonacci数列的实现使用多变量迭代和列表元素迭代两种方案效率都很好,使用递归的方法实现对系统的时间和空间都有过大的消耗,并不适合使用。7综合示例去重指去除列表中的重复数据,每个元素只保留一次。可以使用不同的方法来解决这个问题。1.去

温馨提示

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

评论

0/150

提交评论