专题十二 函数(讲义)-《Python程序设计》职教高考备考讲练测(安徽省)

2025-04-01
| 11页
| 108人阅读
| 2人下载
精品

内容正文:

专题十二 函数 [考纲要求] 1.理解函数的概念; 2.掌握提取代码并建立函数的方法。 3.认识函数的定义格式; 4.掌握函数的定义过程 5.掌握函数的调用及参数传递; 6.理解不同的参数分类对应不同的调用方式。 7.理解变量作用域的概念 8.了解局部变量和全局变量的差别 9.学会定义局部变量和全局变量 10.了解模块的导入 11.掌握递归函数的应用 12.了解高阶函数的简单使用 [课时安排] 2课时 [知识梳理] 函数的概念 函数是指通过专门的代码组织,用来实现特定功能的代码段,它具有相对独立性,可供其他代码重复调用。 前面其实已经接触过很多函数了,比如print函数,获取列表长度的len函数,用于删除对象的del函数等等。 函数的作用 从代码角度来看,借助函数使代码逻辑可以得到优化(不能提升代码执行速度),便于阅读。 从程序员角度来看,借助函数可以提高代码编写效率和质量,便于测试和更新。 函数的定义 函数由def关键字、函数名、[函数参数]、函数体、[函数返回值]组成。其中的函数参数和函数返回值是可选项。 def 函数名([形式参数1, 形式参数2…]): 函数体 [返回值] 定义函数时以def关键字开头,后接函数名、圆括号和冒号;圆括号内可以用于定义形式参数(简称形参),形参是可选的,形参必须放在圆括号内,形参之间用逗号分隔。函数体向右缩进(一般空4个空格),第一行可以选择性地使用文档字符串,用于存放函数说明,文档字符串通常使用多行字符串;在函数体中可以使用return [表达式]来返回函数的值,如果未使用return语句,系统则默认返回None。 函数的调用 调用函数时,直接在语句中输入函数名并在后面的圆括号内传入实际参数(简称实参),多个参数之间用逗号分隔,其语法格式如下: 函数名(实际参数列表) 此时提供的实际参数应当与定义该函数时指定的形式参数按顺序一一对应,而且参数的数据类型要保持兼容。调用无参数函数时,可以使用以下语法格式: 函数名( ) 注意:函数名后面的圆括号不能省略。 【示例】判断列表[16,27,53,78]中哪些数能被4整除,哪些数能被6整除。 def zc(n, m): if n % m == 0: print(f"{n}可以被{m}整除") lst = [16, 27, 53, 78] for i in lst: zc(i, 4) zc(i, 6) 函数的参数 在Python中,调用函数可以传入的参数类型有:位置参数、关键字参数、默认值参数、不定长参数(元组类型和字典类型的不定长参数) 位置参数 在调用函数时,传递的参数必须与函数定义的参数一一对应(参数个数一致,位置一致)标准自定义函数中,函数调用时,参数默认采用按照位置顺序的方式传递给函数。 def test(name, age): print(f"我的名字{name},我的年纪{age}") test("张三", 18) # 我的名字张三,我的年纪18 关键字参数 在调用时,采用”参数名=值”的方式,可以无须考虑函数定义中参数的位置顺序(关键字参数必须位于位置参数的最右端) def test(name, age,height): print(f"我的名字{name},我的年纪{age},我的身高:{height}") test("张三",height=180,age=18) # 我的名字张三,我的年纪18,我的身高:180 test(age=18, name="张三",180) # SyntaxError: positional argument follows keyword argument 注意:关键字参数必须位于位置参数的最右端 若考题中涉及到“无须考虑参数位置”等类型的提示语则指得就是关键字参数 默认参数 在函数定义的时候,为参数设置默认值,当在调用函数的时候,没有给该参数传值时,该参数自动选择默认值。 def hello(name, age=18): print(f"我的名字{name},我的年纪{age}") hello("张三") # 我的名字张三,我的年纪18 hello("张三", 19) # 我的名字张三,我的年纪19 注意:默认参数必须放在位置参数的最右端。 不定长参数 在调用函数的时候,有的参数个数是不固定的,因此我们在定义函数的时候,可以引入不定长参数。元组不定长参数就是将参数封装为元组,字典不定长参数就是将参数封装为字典 元组不定长参数 *args 下面的示例代码: def test(name, age, *hobbys): print(f"我的名字{name},我的年纪{age}") if hobbys: print("我的爱好:",end="") for i in hobbys: print(i, end=" ") test("张三", 18, "唱歌", "跳舞", "画画") 字典不定长参数 **kwargs 下面的示例代码: def test(name, age, *hobbys, **info): print(f"我的名字{name},我的年纪{age}") if hobbys: print("我的爱好:", end="") for i in hobbys: print(i, end=" ") print() if info: print("我的其他信息:") for i, j in info.items(): print(f"{i}:{j}") test("张三", 18, "唱歌", "跳舞", "画画", height=180, weight=75) 注意:不定长参数必须放在位置参数的最右端。 总结:关键字参数、默认参数、不定长参数必须放在位置参数的最右端 函数参数的调用方式 局部变量和全局变量 定义函数时所指定的形参并不是具有值的变量,它所起的作用类似于占位符,只有在调用函数时,调用函数将实参的值传递给被调用函数的形参,形参才具有确定的值。要正确地传递参数,一般要求形参和实参数目要相等,而且数据类型要保持兼容。 局部变量: 在一个函数体或语句块内部定义的变量称为局部变量。局部变量的作用域就是定义它的函数体或语句块,只能在这个作用域内部对局部变量进行存取操作,而不能在这个作用域外部对局部变量进行存取操作。对于带参数的函数而言,其形参的作用域就是函数体。 如果在函数外部引用函数的形参或函数体中定义的局部变量,则会出现NameError的错误 全局变量: 在所有函数外部定义的变量称为全局变量,它可以在当前模块范围中被所有函数引用。如果要在函数内部修改全局变量的值,则应使用global关键字对变量声明。 a = 1 def test(): x = a + 1 return x print(test()) # 2 使用关键字global a = 1 def test(): global a a = a + 1 test() print(a) # 2 实参和形参 实参:调用函数的时候,传入的参数就是实参。其实实参就是值。 形参:函数的参数就是形参,形参其实就是变量 在python中,如果参数属于可变对象,则在函数内部对形参变量的修改会影响到函数外部的实参边变量,这相当于引用传递方式;如果参数属于不可变对象,则在函数内部对形参变量的修改将不会影响到函数外部的实参变量,这相当于值传递方式。 接下来我们探讨一下什么是引用传递方式和值传递方式? 1)值传递方式 对被调用函数的形参变量重新分配存储空间,用于存放传递过来的实参变量的值,从而形成实参变量的副本。被调用函数中对形参变量的任何操作仅限于该函数内部,而不会对调用函数中的实参变量产生影响。传入的参数是不可变数据类型。 2)引用传递方式 对被调用函数的形参变量分配存储空间,用于存储由调用函数传递过来的实参变量的地址。被调用函数中对形参变量的任何操作将会对调用函数中的实参变量产生影响。传入的参数是可变数据类型。 1.不可变数据类型的数据其实是复制了值再传入到函数的 a = 1 def test(a): a += 1 test(a) print(a) 2.可变的数据类型其实是将地址传入到函数的参数里面,函数内部修改也会修改函数外的数据 lst = [1, 2, 3] def test1(x): x.append("hello") test1(lst) print(lst) 注意:如果将可变数据类型作为函数的默认参数时,所遇到的问题? 可变数据类型作为默认参数的值时,调用函数时,可变数据只被创建一次 def demo(newwitem,old_list=[]): old_list.append(newwitem) return old_list def main(): print(demo('a')) print(demo('b')) main() 运行结果: ['a'] ['a','b'] 函数模块的调用 Python中,模块分为标准模块和用户自定义模块。 用户自定义模块就是用户自己编写的Python程序文件 1 导入模块方式1: import 模块名1 [as 别名1], 模块名2 [as 别名2],… 例如: import tkinker import tkinter as tk import time,random 2 导入模块方式2: 从模块里面导入函数1,函数2,… from 模块名 import 函数1[,as 别名1],函数2[,as 别名1],... 从模块里面导入所有函数 from 模块名 import * 例如: 将tkinter模块里面的所有函数导入 from tkinter import * 从tkinter模块里面导入ceil,floor函数 from math import ceil,floor lambda函数(匿名函数) 什么是匿名函数:匿名函数是指没有名称的函数,它只能包含一个表达式,而不能包含其他语句,该表达式的值就是函数的返回值。 什么时候使用匿名函数:如果某项计算功能只需要临时使用一次而不需要在其他地方重复使用,则可以考虑通过定义匿名函数来实现这项功能。 1.匿名函数的定义 匿名函数通过关键字lambda来定义,因此也称为lambda函数其语法格式如:lambda 参数列表:表达式 参数列表中的参数之间用逗号分隔,冒号后面的表达式用于确定匿名函数的返回值,表达式的值就是匿名函数的返回值。 2.匿名函数的调用 在程序中可以将匿名函数赋值给一个变量,然后通过该变量来调用匿名函数。例如: >>> f=lambda x,y:x+y >>> f(3,5) 8 与标准函数类似,使用匿名函数时可以使用默认值参数和关键字参数,例如: >>> f=lambda x,y=2:x+y >>> f(1) 3 >>> f(1,3) 4 递归函数 如果一个函数在内部直接或间接地调用该函数本身,则这个函数就是递归函数。 递归函数的特点:必须有一个明确的递归结束条件(基例),每当进入更深一层递归时,问题规模相比上次递归都应有所减少;相比两次重复之间有紧密的联系,前一次要为后一次做准备,通常前一次的输出会作为后一次的输入。 递归函数的优缺点: 优点:代码简洁、清晰,并且容易验证正确性。 缺点:递归函数的代码执行效率较低 递归函数的要求:至少有一个基例(递归终止条件) 【例1】键盘输入n,使用递归函数计算n以内的累加和 n = eval(input("请输入n:")) def getSum(n): if n == 0: return 0 else: return n + getSum(n - 1) print(getSum(n)) 【例2】使用递归函数打印出前20项斐波那契数列,每个数字之间空格隔开。 def f(n): if n<=2: return 1 else: return f(n-1)+f(n-2) for i in range(1,21): print(f(i),end=' ') 高阶函数 map 函数 map(映射)函数是Python中常用的高级函数之一,其作用是对一个序列中的每个元素进行指定函数的操作,返回一个map对象。 map函数的函数参数如下: map(function, sequence) 参数说明: function是操作函数 sequence是序列 【例1】将lst=[1,2,3,4,5]里面的每个元素转为字符类型 lst=[1,2,3,4,5] obj=map(str,lst) print(list(obj)) 【例2】将lst=[1,2,3,4,5]里面的每个元素改为该数字的平方 def func(n): return n ** 2 lst = [1, 2, 3, 4] obj=map(func,lst) lst=list(obj) print(lst) zip 函数 zip( ) 函数(’拉链’函数)用于将可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回zip对象。 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同, 我们来看一下zip函数的案例: a = [1, 2, 3] b = [4, 5, 6] print(list(zip(a, b))) # [(1, 4), (2, 5), (3, 6)] print(tuple(zip(a, b))) # ((1, 4), (2, 5), (3, 6)) print(dict(zip(a, b))) # {1: 4, 2: 5, 3: 6} print(set(zip(a, b))) # {(2, 5), (3, 6), (1, 4)} 如果a,b列表的长度不一致,则以较短的列表的长度为主 a = [1, 2, 3] b = [4, 5, 6, 7] print(list(zip(a, b))) # [(1, 4), (2, 5), (3, 6)] filter 函数 其作用是从一个序列中过滤出符合条件的元素,将结果以一个filter类型返回。 filter函数的参数如下: filter(function, sequence) function是过滤函数 sequence是序列 filter函数会对序列中的每个元素依次调用function函数,将返回True的元素组成一个Filter类型对象输出。 我们来看一下filter函数的案例: def is_even(n): return n % 2 == 0 oldLst = [1, 2, 3, 4, 5, 6, 7, 8, 9] newLst = list(filter(is_even,oldLst)) print(newLst) 上面这个例子中,我们定义了一个is_even函数用于判断一个数是否为偶数。然后我们用filter函数对oldLst中的元素依次进行判断,将所有偶数提取出来,最终得到一个新的列表newLst。 [限时练习] 1.下列选项中,不属于函数优点的是( )。 A. 减少代码重复 B. 便于程序模块化 C. 便于发挥程序员的创造力 D. 便于代码阅读 【答案】C 【解析】发挥创造力是解决问题的算法,而非函数 2.下列属于自定义函数时非必要的是( )。 A. 函数名称 B. 函数体 C. 返回值 D. 关键字def 【答案】C 【解析】返回值是非必要的,若不指定返回值默认返回None 3.下列函数调用中,正确的是( )。 A. fun(1,2,3) B. fun(a=1,b=2,c=3) C. fun(1,b=2,c=3) D. 以上都是 【答案】D 【解析】上面的都是正确的函数调用 4.下列属于函数参数调用中的可变参数的是( )。 A. 字符串 B. 列表 C. 元组 D. 数字 【答案】B 【解析】列表是可变数据类型,而字符串、元组、数字都是不可变数据类型 5.下列关于函数的说法中,错误的是( )。 A. 自定义函数时,函数参数和返回值是可选的 B. Python 中,def 关键字用于定义函数 C. 一个函数中可以有多个 return 语句 D. 函数定义时,参数顺序无关紧要 【答案】D 【解析】函数定义时,位置参数的顺序必须一一对应 6.下列做法会造成程序错误的是( )。 A.函数没有写return B.函数没有参数 C.函数调用的时候不写括号 D.函数有多个return 【答案】B 【解析】函数定义和调用时,圆括号都不能省略 7.下列错误的函数定义是( )。 A. def fun(a,b): B. def fun(a,b): C. def fun(a,*b): D. def fun(*a,b): 【答案】D 【解析】定义函数时,不定长参数必须放在位置参数的右端 [归纳小结] 学科网(北京)股份有限公司 $$

资源预览图

专题十二 函数(讲义)-《Python程序设计》职教高考备考讲练测(安徽省)
1
专题十二 函数(讲义)-《Python程序设计》职教高考备考讲练测(安徽省)
2
专题十二 函数(讲义)-《Python程序设计》职教高考备考讲练测(安徽省)
3
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。