1、PythonPython4PythonPython函数定义函数定义与使用与使用第章本章内容本章内容4 4.1.1 定义函数定义函数4.24.2 函数调用函数调用4.3 4.3 匿名函数匿名函数4.4 4.4 函数的变量函数的变量本章小结本章小结4.1 定义函数定义函数v 函数是可重用的程序代码段,用于在程序中分离不同的任务,使用函数可以提高编程效率。v 在Python程序开发过程中,将完成某一特定功能并经常使用的代码编写成函数,放在函数库(模块)中,在需要使用时直接调用,这就是程序中的函数。v 合理的函数规划不但可以使程序容易编写、阅读、调试、修改与维护,还充分体现着程序开发人员解决问题思路的
2、清晰性、严密性。v 在Python语言中,通常包括内置函数、标准库函数、第三方库函数及用户自定义函数。4.1 定义函数定义函数v 4.1.1 定义函数v 函数定义的基本形式如下:def 函数名(形式参数列表):#形式参数可以有0到多个函数体return 表达式或数值#不是所有函数都必须该语句v 函数定义的第一行称为函数签名,函数签名由关键字def开始,并指定函数名称以及函数的每个形式参数变量名称。4.1 定义函数定义函数v 注意:使用def关键字进行函数的定义,不用指定函数返回值的类型。定义函数时,可以声明函数的参数,形式参数的个数可以是多个,也可以没有,多个形式参数之间用逗号隔开。同样地,函
3、数参数也不用指定参数类型。函数体是复合语句,函数体语句需要采用缩进书写规则。如果函数有返回值,返回值是通过函数体中的return语句获得的,return语句可以在在函数体内任何地方出现,表示函数调用执行到此结束;如果没有return语句,会自动返回空值(None),如果有return语句但return后面没有接表达式或者值得话也是返回None值。4.1 定义函数定义函数v 4.1.2 函数调用v 当调用一个函数时,程序的控制权会转移到被调用的函数中,执行被调用函数中的语句实现具体的功能。但执行完该被调函数,程序的控制权又回到调用函数中。v 调用函数时,可以根据需要指定实际传入的参数值。函数的调
4、用语法格式如下:函数名(实际参数列表)4.1 定义函数定义函数v 注意:函数名是当前作用域中已经存在的函数,存在的函数可以是内置函数、标准库函数或用户自定义的函数。另外,调用函数应该位于定义函数之后,否则程序会报错。实际参数列表必须与函数定义的形式参数列表一一对应。函数调用是表达式。如果函数有返回值,可以在表达式中直接使用;如果函数没有返回值,则可以单独作为表达式语句使用。4.1 定义函数定义函数v 4.1.3 函数的返回值v 函数使用return语句带回返回值,该返回值由函数名带回,并结束函数的执行。不论return语句出现在函数的什么位置,一旦得到执行将直接结束函数的执行。v 如果函数没有
5、return语句或者执行了不返回任何值的return语句,Python将认为该函数以return None结束,即返回空值。也可以将Lambda表达式作为函数的返回值,关于Lambda表达式将在后面的章节中介绍。4.1 定义函数定义函数v 4.1.4 导入模块v Python语言中,包含Python代码的源文件称为模块,模块内部能定义函数、类和变量。v 模块能够有逻辑地组织Python代码段,把相关的代码分配到一个模块里能让代码更好用,更易懂。模块里包含用户自定义的函数、类和变量,其扩展名是“.py”。v Python中的模块和C语言中的头文件以及Java中的包很类似,比如在Python中要调
6、用sqrt函数,必须用import关键字引入math这个模块。4.1 定义函数定义函数v 在Python中,用关键字import来导入某个模块。方式如下:import 模块名v 在调用模块中的函数及变量时,可以这样调用:模块名.函数名(实参列表)模块名.常量名4.1 定义函数定义函数v 当在程序中导入一个模块,Python解析器对模块位置的搜索顺序是:v 1)当前目录;v 2)在PYTHON PATH环境变量下的每个目录;v 3)安装过程决定的默认目录。v 模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录、PYTHON PATH环境变量下的每个目录和安装过程决定的
7、默认目录。4.2 函数参数函数参数v 在C语言中,调用函数时必须依照函数定义时的参数个数以及类型来传递参数,否则将会发生错误,这个是严格进行规定的。但是在Python中函数参数定义和传递的方式相比而言就灵活多了。v 函数的参数有很多种,主要可以分为普通参数、默认值参数、关键字参数、可变长度参数等。另外在函数定义时对参数的设置也很灵活,在定义函数时不需要指定形式参数的类型,形参的类型完全由调用者传递的实参类型以及Python解释器的理解和推断来决定;同样也不需要指定函数的返回值类型,这将由函数中的return语句来决定。4.2 函数参数函数参数v 函数参数有形式参数(形参)和实际参数(实参)的区
8、别。在函数定义里关键字def定义函数时函数名后面括号里声明的参数是形参,形参的个数可以为0个或多个,如果没有形参,声明函数时函数名后的括号也不能够省略,当形参的个数多于1个时各参数之间用逗号隔开。v 函数调用时在函数名后括号中提供的数值为实际参数,在调用函数时,将实参的值传递给形参,函数中参与运算等操作的数据是实参,所以只有函数的实参才是正真起作用的值,而函数的形参不代表任何具体的值,仅仅是为了实现函数的某种功能。4.2 函数参数函数参数v 4.2.1 位置参数v 在调用函数时,需要将实参值传递给形参,在函数内使用实参的值代替形参进行运算。v 实参有2种类型:位置参数和关键字参数,即函数实参是
9、作为位置参数和关键字参数被传递的。v 当使用位置参数时,实参必须和形参在顺序、个数和类型上意义匹配。前面的实例中函数调用中使用的均是位置参数。4.2 函数参数函数参数v 4.2.2 默认值参数v 默认值参数在于它能够给函数参数提供默认值,在定义函数时,Python支持默认值参数,即在定义函数时为形参设置默认值。v 调用带有默认值参数的函数时,可以不用为设置了默认值的形参传值,此时函数将会直接使用函数定义时所设置的默认值。在调用函数的时候也可以对默认值参数设置实参值,则将实参的值传递给该形参。设置默认值参数的格式为:def 函数名(形参名1=默认值1,形参名2=默认值2,)4.2 函数参数函数参
10、数v 4.2.3 关键字参数v 在Python中还有一种是通过参数名来匹配的,不需要严格按照参数定义时的位置来传递参数,这种参数叫做关键字参数。v 关键字参数主要指调用函数时的参数传递方式,而与函数定义无关。通过关键字参数可以按参数名字传递值,实参顺序可以和形参顺序不一致,但不会影响参数的传递结果,避免了用户要牢记参数位置和顺序的麻烦,使得函数的调用和参数传递更加灵活方便。4.2 函数参数函数参数v 4.2.4 可变长度参数v 一般情况下在定义函数时,函数参数的个数是确定的,但是在编程的过程中,可能会遇到函数参数个数不固定的情况。这时就需要使用可变长度的函数参数来实现其功能。v 比如编写一个函
11、数实现传入一个学生参加各科目考试的成绩,求出平均分,如2个学生参加考试科目数不同,因此传入的参数个数就会不同,遇到这种情况,可以在定义函数的时候使用“可变长参数”。“可变长参数”就是向一个函数传入不定个数的参数。4.2 函数参数函数参数v 在Python中,可变长度参数在定义函数时主要有2种形式,分别是元组(非关键字参数,在参数前添加1个“*”)和字典(关键字参数,在参数前添加2个“*”)。v 前者用来接收任意多个实参并将其放在一个元组中,后者接收类似于关键参数一样显示赋值形式的多个实参并将其放入字典中。v 其调用方式是:func(*tuple_grp_nonkw_args,*dict_grp
12、_kw_args)4.3 匿名函数匿名函数v 在Python中有2种函数,一种是用def定义;另一种是Lambda函数,也叫Lambda表达式,可以用来声明匿名函数,即没有函数名字的临时使用的小函数。v 前面已经介绍过用def定义函数,Lambda函数是一种简便的、在同一行中定义函数的方法,就像一个表达式,Lambda实际上生成一个函数对象,即匿名函数,匿名函数是没有函数名字的临时使用的小函数。4.3 匿名函数匿名函数v Lambda表达式只可以包含一个表达式,不允许包含其他复杂的语句,但在表达式中可以调用其他函数,并支持默认值参数和关键字参数,该表达式的计算结果就是函数的返回值。v Lamb
13、da表达式的基本格式为:lambda arg1,arg2,:v 其中arg1、agr2为函数的参数,为函数的语句,其结果为函数的返回值。4.3 匿名函数匿名函数v Lambda表达式只可以包含一个表达式,不允许包含其他复杂的语句,但在表达式中可以调用其他函数,并支持默认值参数和关键字参数,该表达式的计算结果就是函数的返回值。v Lambda表达式的基本格式为:lambda arg1,arg2,:v 其中arg1、agr2为函数的参数,为函数的语句,其结果为函数的返回值。4.3 匿名函数匿名函数v 匿名函数(lambda)一般应用于函数式编程中,可以将Lambda表达式作为列表的元素,从而实现跳
14、转表的功能,也就是函数的列表。v Lambda表达式列表的定义方法为:列表名=(Lambda表达式1),(Lambda表达式2),v 调用列表中Lambda表达式的方法为:列表名索引(Lambda表达式的参数列表)4.4 函数的变量函数的变量v 变量起作用的范围称为变量的作用域,一个变量在函数外部定义和在函数内部定义,其作用域是不同的,不同作用域内同名变量之间互不影响。v 变量声明的位置不同,其可以被访问的范围也不同。一个变量在函数外部定义和在函数内部定义,其作用域是不同的。v 函数内部定义的变量一般为局部变量,而不属于任何函数的变量一般为全局变量。v 一般而言,局部变量的引用比全局变量速度快
15、,应优先考虑使用。4.4 函数的变量函数的变量v 除非真的有必要,否则应尽量避免使用全局变量,因为全局变量会增加不同函数之间的隐式耦合度,从而降低代码可读性,并使得代码测试和纠错变得很困难。v 如果用特殊的关键字定义一个变量,也会改变其作用域。变量按其作用域的不同大致可以分为:全局变量、局部变量和类型成员变量。4.4 函数的变量函数的变量v 4.4.1 局部变量v 在函数内定义的变量只在该函数内起作用,称为局部变量,局部变量的作用域为函数体内,函数运行结束时,在该函数内部定义的局部变量会被自动删除。它们与函数外具有相同名的其他变量没有任何关系,即变量名称对于函数来说是局部的。4.4 函数的变量
16、函数的变量v 4.4.1 全局变量v 全局变量,它是在函数外部定义的,作用域是整个程序。全局变量可以直接在函数里使用,在函数内部定义的全局变量当函数结束以后仍然存在并且可以访问,但是如果要在函数内部改变全局变量值,必须使用global关键字进行声明。4.4 函数的变量函数的变量v 如果一个变量已在函数外定义,在函数内需要修改这个变量值并将这个赋值结果反映到函数之外,可以在函数内使用关键字global声明这个变量为全局变量,明确声明要使用已定义的同名全局变量。v 在函数内部直接使用global关键字将一个变量声明为全局变量,即使在函数外没有定义该全局变量,在调用这个函数之后,将自动增加新的全局变
17、量。4.4 函数的变量函数的变量v 在函数内如果只引用某个变量的值而没有为其赋新值,该变量为隐式的全局变量;如果在函数内任意位置有为变量赋新值的操作,该变量即被认为是隐式的局部变量,除非在函数内显示地用关键字global进行声明。v 如果一个局部变量和一个全局变量重名,则局部变量会“屏蔽”全局变量,也就是局部变量起作用。v 主要介绍了函数的定义及调用等基本语法、函数参数、函数的返回、匿名函数和函数参数等。v 函数是由关键字def开头,接下来是函数名、括号、形参(可以没有或者多个)和冒号,接下来是为了完成某种功能的多个语句构成的函数体;函数可以有返回值也可以没有返回值;函数通过return语句返
18、回值,如果函数没有返回值可以不用return语句,另外在函数中可以有多个return语句,当程序执行到return语句时将程序的控制权返回给函数的调用者,除此之外一个return语句可以返回一个到多个返回值,当有多个返回值时,返回值是元组。4.6本章小结本章小结v 函数参数可以当做位置参数或关键字参数传递,还允许使用默认值参数定义函数,当无参数调用函数时,则默认值传递给形参。4.6本章小结本章小结实践与练习实践与练习v 一、填空题v 1、如果要为定义在函数外的全局变量赋值,可以使用_语句,表明该变量是在外面定义的全局变量。v 2、变量按其作用域大致可以分为_和_。v 3、在Python中,函数
19、参数的类型大致有_、_、_和_。v 4、Python通过_返回值。v 5、如果函数没有return语句或者return语句不带任何返回值,那么该函数的返回值为_。v 6、Python通过_导入模块,导入模块的方式有_、_。实践与练习实践与练习v 二、简答题v 1、Python如何定义一个函数。v 2、什么是匿名函数。v 三、编程题v 1、编写函数,接收一个整数t为参数,打印杨辉三角的前t行。v 2、编写一个判断完数的函数。完数是指一个数恰好等于它的因子之和,如6=1+2+3,所以6是完数。实验指导实验指导题目1:编写函数,可以接收任意多个整数,并输出其中的最大值和所有整数的和。v 1 任务描述
20、 对于一串正整数,找出其中的最大值,并计算所有整数的和。v 2 任务要求 1)能够自定义函数完成某种功能。2)能够熟练使用可变长参数。3 知识点提示实验指导实验指导v 本任务主要用到以下知识点:1)函数定义;2)函数调用;3)可变长参数的使用;v 4 操作步骤提示v 简单提示一下操作步骤:1)定义函数,函数的参数为可变长参数。2)在函数体中通过for循环遍历列表,在遍历的过程中查找最大值并求和。实验指导实验指导题目2:编写函数,由键盘输入一个正数,如果该数是偶数,则将该数分解为2个素数的和。如有多组符合条件的素数,则全部输出。v 1 任务描述 从键盘输入一个正整数,先判断该整数是奇数还是偶数,
21、如果输入的正整数是奇数则给出提示信息。如果输入的正整数是偶数,则对该正整数进行分割,分割为2个素数的和,并输出该组素数,如果存在多个符合条件的组合,则输出所有的组合。v 2 任务要求 1)能够自定义函数完成某种功能。2)能够熟练进行函数调用。3)能够熟悉模块的导入。实验指导实验指导v 3 知识点提示v 本任务主要用到以下知识点:1)函数定义;2)函数调用;3)模块导入;v 4 操作步骤提示v 简单提示一下操作步骤:在主函数中利用输入语句获得一个正整数;对该正整数进行判断,如果是奇数,给出提示信息,并提示用户重新输入一个正整数,直到输入的正整数为偶数;当输入的正整数为偶数时,调用分解该偶数的函数进行分解,并输出素数组合;在分解偶数为素数的函数内部调用判断一个数是否为素数的自定义函数。