《第6章 函数教学课件PPT.pptx》由会员分享,可在线阅读,更多相关《第6章 函数教学课件PPT.pptx(63页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第6章 函数 函数的定义与调用 函数的参数传递 变量作用域 函数的特殊形式 Python常用内置函数第6章 函数u掌握函数的定义与调用。u掌握函数的参数传递方式。u掌握局部变量和全局变量的使用。u熟悉匿名函数与递归函数的使用。u了解常用的内置函数。第一部分定义函数思考:什么是函数?函数的定义5函数指被封装起来的、实现某种功能的一段代码。Python安装包、标准库中自带的函数统称为内置函数,用户自己编写的函数称为自定义函数,不管是哪种函数,其定义和调用方式都是一样的。函数的定义6def 函数名(参数列表): 函数文档字符串 函数体 return语句接收传入函数中的数据,可省略接收传入函数中的数据
2、,可省略函数的说明信息,可省略函数的说明信息,可省略将结果返回给函数调用者将结果返回给函数调用者uPython中使用关键字def定义函数。函数的定义7def weather(): print(* * 13) print(日期:4月8日) print(温度:1428) print(空气状况:良) print(* * 13)u若函数的参数列表为空,这个函数称为无参函数。函数的定义8def modify_weather(today, temp, air_quality): print(*13) print(f日期:today) print(f温度:temp) print(f空气状况:air_qual
3、ity) print(* * 13)形式参数形式参数u函数定义之时可以设置参数列表,以实现更灵活的功能。函数的定义9函数名(参数列表)u定义好的函数直到被程序调用时才会执行。函数的调用格式如下:函数的调用10weather()*日期:4月8日温度:1428空气状况:良*u例如,调用刚刚定义的weather()函数。函数的调用11modify_weather(4月6日, 1530, 优)*日期:4月6日温度:1530空气状况:优*u调用带有参数的函数时需要传入参数,传入的参数称为实际参数,实际参数是程序执行过程中真正会使用的参数。函数的调用12课堂练习上机练习1:编写一个display_mess
4、age()的函数u 需求说明n编写一个名为display_message()的函数,它打印一个句子,指出你在本章学的是什么。n调用这个函数,确认显示的消息正确无误。13课堂练习本实例要求编写程序,实现计算器的四则运算功能。上机练习2:计算器u 需求说明n计算器极大地提高了人们进行数字计算的效率与准确性,无论是超市的收银台,还是集市的小摊位,都能够看到计算器的身影。14第二部分函数的参数传递 位置参数位置参数 关键字关键字参数参数 默认值默认值参数参数 不定长不定长参数参数u函数的参数传递是指将实际参数传递给形式参数的过程。根据不同的传递形式,函数的参数可分为:位置参数16def divisio
5、n(num_one, num_two): print(num_one / num_two)division(6, 2)u调用函数时,编译器会将函数的实际参数按照位置顺序依次传递给形式参数。位置参数17def info(name, age, address): print(f姓名:name) print(f年龄:age) print(f地址:address)info(name=李婷婷, age=23, address=山东) u关键字参数通过“形式参数=实际参数”的格式将实际参数与形式参数相关联,根据形参的名称进行参数传递。关键字参数18使用参数的默认值未给默认参数传值使用实际参数的值给默认参数
6、传值u定义函数时可以指定形式参数的默认值。调用函数时,可分为以下两种情况:默认参数19def connect(ip, port=3306): print(f连接地址为:ip) print(f连接端口号为:port) print(连接成功)connect(127.0.0.1)connect(ip=127.0.0.1, port=8080)默认参数20 def 函数名(formal_args, *args, *kwargs): 函数_文档字符串 函数体 return语句* *argsargs和和* * *kwargskwargs都是不定长参数,都是不定长参数,它们它们可搭配使用,可搭配使用,亦可单
7、独使用。亦可单独使用。u若要传入函数中的参数的个数不确定,可以使用不定长参数。不定长参数也称可变参数,此种参数接收参数的数量可以任意改变。不定长参数21def test(*args): print(args)test(1, 2, 3, a, b, c)(1, 2, 3, a, b, c)u*argsn不定长参数*args用于接收不定数量的位置参数,调用函数时传入的所有参数被*args接收后以元组形式保存。不定长参数22def test(*kwargs): print(kwargs)test(a=1, b=2, c=3, d=4)c: 3, d: 4, a: 1, b: 2u*kwargsn*k
8、wargs用于接收不定数量的关键字参数,调用函数时传入的所有参数被*kwargs接收后以字典形式保存。不定长参数23课堂练习上机练习3:T恤尺码和字样u 需求说明n编写一个名为make_shirt()的函数,它接受一个尺码以及要印到T恤上的字样。n这个函数应打印一个句子,概要地说明T恤的尺码和字样。n使用位置实参调用这个函数来制作一件T恤;再使用关键字实参来调用这个函数。24第三部分变量作用域思考:什么是变量作用域?局部变量26变量的作用域是指变量的作用范围。根据作用范围,Python中的变量分为局部变量与全局变量。局部变量27def use_var(): name = python # 局部
9、变量 print(name) # 函数内访问use_var()print(name) # 函数外访问pythonNameError: name name is not definedu局部变量是在函数内定义的变量,只在定义它的函数内生效。局部变量28局部变量只能在函数内部使用,不能在函数外部使用。结 论 局部变量29count =10 # 全局变量def use_var(): print(count) # 函数内访问use_var()print(count) # 函数外访问1010u全局变量是在函数外定义的变量,它在程序中任何位置都可以被访问。全局变量30count = 10def use_v
10、ar(): count = 0 # 修改全局变量use_var()print(count)10全局变量的值仍然是10。u函数中只能访问全局变量,但不能修改全局变量。全局变量31count = 10def use_var(): global count # 声明全局变量 count = 0use_var()print(count)0全局变量的值变为全局变量的值变为0 0。u若要在函数内部修改全局变量的值,需先在函数内使用关键字“global”进行声明。全局变量32课堂练习上机练习4:学生信息管理系统u 需求说明n学生信息管理系统具备学生信息的查找、修改、增加和删除功能,利用该系统可实现学生信息管
11、理的电子化,提高信息管理效率。33本实例要求编写程序,实现学生信息管理系统。第四部分返回值u下面来看一个函数,它接收名和姓并返回整洁的姓名:n函数get_formatted_name()的定义通过形参接收名和姓(见)。它将姓和名合而为一,在它们之间加上一个空格,并将结果存储在变量full_name中(见)。然后,将full_name的值转换为首字母大写格式,并将结果返回到函数调用行(见)。n调用返回值的函数时,需要提供一个变量,用于存储返回的值。在这里,将返回值存储在了变量musician 中(见)。返回简单值35def get_formatted_name(first_name, last_
12、name): # 返回整洁的姓名 full_name = first_name + + last_name# return full_name.title()# musician = get_formatted_name(San, Zhang) # print(musician)San Zhangu有时候,需要让实参变成可选的,这样使用函数的人就只需在必要时才提供额外的信息。可使用默认值来让实参变成可选的。n例如,假设我们要扩展函数get_formatted_name(),使其还处理中间名。n为此,可将其修改成类似于下面这样:n只要同时提供名、中间名和姓,这个函数就能正确地运行。它根据这三部分
13、创建一个字符串,在适当的地方加上空格,并将结果转换为首字母大写格式。让实参变成可选的36def get_formatted_name(first_name, middle_name, last_name): 返回整洁的姓名 full_name = first_name + + middle_name + + last_name return full_name.title()musician = get_formatted_name(john, lee, hooker)print(musician)John Lee Hookeru函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。n例如
14、,下面的函数接受姓名的组成部分,并返回一个表示人的字典:n函数build_person()接受名和姓,并将这些值封装到字典中(见)。n存储first_name的值时,使用的键为first,而存储last_name的值时,使用的键为last。n最后,返回表示人的整个字典(见)。返回字典37def build_person(first_name, last_name): 返回一个字典,其中包含有关一个人的信息 person = first: first_name, last: last_name # return person # musician = build_person(jimi, hen
15、drix)print(musician) # first: jimi, last: hendrixu可将函数同本书前面介绍的任何Python结构结合起来使用。n例如,下面将结合使用函数get_formatted_name()和while循环,以更正规的方式问候用户。下面尝试使用名和姓跟用户打招呼:结合使用函数和while循环38def get_formatted_name(first_name, last_name): 返回整洁的姓名full_name = first_name + + last_name return full_name.title()# 这是一个无限循环!while Tru
16、e:print(nPlease tell me your name:) #f_name = input(First name: )l_name = input(Last name: )formatted_name = get_formatted_name(f_name, l_name)print(nHello, + formatted_name + !)课堂练习上机练习5:城市名u 需求说明n编写一个名为city_country()的函数,它接收城市的名称及其所属的省份。这个函数应返回一个格式类似于下面这样的字符串。u 长沙,湖南n至少使用三个城市-省份对调用这个函数,并打印它返回的值。39第
17、五部分传递列表u 向函数传递列表很有用,这种列表包含的可能是名字、数字或更复杂的对象(如字典)。u 将列表传递给函数后,函数就能直接访问其内容。u 下面使用函数来提高处理列表的效率。n假设有一个用户列表,我们要问候其中的每位用户。n下面的示例将一个名字列表传递给一个名为greet_users()的函数,这个函数问候列表中的每个人:传递列表41def greet_users(names): 向列表中的每位用户都发出简单的问候 for name in names: msg = Hello, + name.title() + ! print(msg)usernames = 张三, 李四, 王五 #g
18、reet_users(usernames)u 将列表传递给函数后,函数就可对其进行修改。u 在函数中对这个列表所做的任何修改都是永久性的,这让你能够高效地处理大量的数据。n来看一家为用户提交的设计制作3D打印模型的公司。n需要打印的设计存储在一个列表中,打印后移到另一个列表中。在函数中修改列表42# 首先创建一个列表,其中包含一些要打印的设计unprinted_designs = iphone case, robot pendant, dodecahedroncompleted_models = # 模拟打印每个设计,直到没有未打印的设计为止# 打印每个设计后,都将其移到列表completed
19、_models中while unprinted_designs: current_design = unprinted_designs.pop()#模拟根据设计制作3D打印模型的过程print(Printing model: + current_design)completed_models.append(current_design)# 显示打印好的所有模型print(nThe following models have been printed:)for completed_model in completed_models: print(completed_model)u有时候,需要禁止
20、函数修改列表。n例如,假设像前一个示例那样,你有一个未打印的设计列表,并编写了一个将这些设计移到打印好的模型列表中的函数。p你可能会做出这样的决定:即便打印所有设计后,也要保留原来的未打印的设计列表,以供备案。但由于你将所有的设计都移出了unprinted_designs,这个列表变成了空的,原来的列表没有了。p为解决这个问题,可向函数传递列表的副本而不是原件;这样函数所做的任何修改都只影响副本,而丝毫不影响原件。p要将列表的副本传递给函数,可以像下面这样做:p用切片表示法:创建列表的副本。禁止函数修改列表43function_name(list_name:)课堂练习上机练习6:显示学生名单u
21、 需求说明n创建一个包含学生名字的列表,并将其传递给一个名为show_students()的函数,这个函数打印列表中每个学生的名字。44第六部分函数的特殊形式lambda arg1 ,arg2,.argn:expressionarg1 ,arg2,.argn表示匿名函数的参数,expression是一个表达式。u匿名函数是无需函数名标识的函数,它的函数体只能是单个表达式。Python中使用关键字lambda定义匿名函数。匿名函数46普通函数普通函数匿名函数匿名函数需要使用函数名进行标识无需使用函数名进行标识函数体中可以有多条语句函数体只能是一个表达式可以实现比较复杂的功能只能实现比较单一的功能
22、可以被其它程序使用不能被其它程序使用u匿名函数与普通函数主要有以下不同:匿名函数47area = lambda a, h: (a * h) * 0.5print(area(3, 4)6.0u为了方便使用匿名函数,应使用变量记录这个函数。匿名函数48思考:什么是递归?递归函数49递归是一个函数过程在定义中直接调用自身的一种方法,它通常把一个大型的复杂问题层层转化为一个与原问题相似,但规模较小的问题进行求解。递归函数50 递归函数只需少量代码就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。u如果一个函数中调用了函数本身,这个函数就是递归函数。递归函数51递归公式是递归求解过程中的
23、归纳项,用于处理原问题以及与原问题规律相同的子问题。递归公式边界条件即终止条件,用于终止递归。边界条件u函数递归调用时,需要确定两点:一是递归公式,二是边界条件。递归函数52def factorial(num): if num = 1: return 1 else: return num * factorial(num - 1)u阶乘是可利用递归方式求解的经典问题。递归函数53课堂练习上机练习7:实现数字1100之间的累加u 需求说明n使用递归实现数字1100之间的累加。54课堂练习上机练习8 :汉诺塔u 需求说明:n汉诺塔源于印度一个古老传说:大梵天创造世界的时候做了三根金刚石柱子,一根柱子
24、上从下往上按照从大到小的顺序摞着64片黄金圆盘,大梵天命令婆罗门把圆盘从下面开始按照从大到小的顺序重新摆放在另一根柱子上,并规定:小圆盘上不能放大圆盘,三根柱子之间一次只能移动一个圆盘。55本实例要求编写程序,实现输出汉诺塔移动过程的功能。课堂练习F(1)=1, F(2)=1, F(n)= F(n-1) + F(n-2) (n=3,nN*)上机练习9:斐波那契数列u 需求说明:n斐波那契数列又称为兔子数列,因数学家列昂纳多斐波那契以兔子繁殖为例子引入,这个数列中的数据满足以下公式:56本实例要求编写程序,实现根据用户输入的数字输出斐波那契数列的功能。第五部分Python常用内置函数uPytho
25、n内置了一些实现特定功能的函数,这些函数无需由Python使用者重新定义便可直接使用。Python常用内置函数58abs()函数用于计算绝对值,其参数必须是数字类型。如果参数是一个复数,那么abs()函数返回的绝对值是此复数与它的共轭复数乘积的平方根。print(abs(-5)print(abs(3.14)print(abs(8 + 3j)53.148.54400374531753uabs()函数Python常用内置函数59ord()函数用于返回字符在Unicode编码表中对应的码值,其参数是一个字符。print(ord(a)print(ord(A)9765uord()函数Python常用内置函数60chr()和ord()函数的功能相反,可根据码值返回相应的Unicode字符。chr()函数的参数是一个整数,取值范围为0255。print(chr(97)print(chr(65)aAuchr()函数Python常用内置函数61u本章主要介绍了Python中的函数,包括函数的定义和调用、函数的参数传递、变量的作用域、匿名函数、递归函数,以及Python常用的内置函数。u通过本章的学习,希望读者能够灵活地定义和使用函数。本章小结62小 结问题及作业集中问题&课后作业
限制150内