内容正文:
安徽省计算机类高考技能教学
自定义函数
一、教学目标
【知识目标】
1.理解函数的概念;
2.掌握提取代码并建立函数的方法。
3.认识函数的定义格式;
4.掌握函数的定义过程
5.掌握函数的调用及参数传递;
6.理解不同的参数分类对应不同的调用方式。
7.理解变量作用域的概念
8.了解局部变量和全局变量的差别
9.学会定义局部变量和全局变量
【能力目标】
培养学生读懂并分析代码,进而建立函数的能力
培养学生读懂并分析代码,进而定义函数的能力
培养学生读懂并分析代码,进而调用函数的能力
培养学生读懂并分析代码,进而掌握优化代码的能力
【素养目标】
培养分析思维,学会合理调用函数来解决实际问题
二、基本知识讲解
什么是函数
函数是指通过专门的代码组织,用来实现特定功能的代码段,它具有相对独立性,可供其他代码重复调用。
前面其实已经接触过很多函数了,比如print函数,获取列表长度的len函数,用于删除对象的del函数等等。
函数的作用
从代码角度来看,借助函数使代码逻辑可以得到优化(不能提升代码执行速度),便于阅读。
从程序员角度来看,借助函数可以提高代码编写效率和质量,便于测试和更新。
函数的定义
函数由def关键字、函数名、[函数参数]、函数体、[函数返回值]组成。其中的函数参数和函数返回值是可选项。
def 函数名([形式参数1, 形式参数2…]):
函数体
[返回值]
定义函数时以def关键字开头,后接函数名、圆括号和冒号;圆括号内可以用于定义形式参数(简称形参),形参是可选的,形参必须放在圆括号内,形参之间用逗号分隔。函数体向右缩进(一般空4个空格),第一行可以选择性地使用文档字符串,用于存放函数说明,文档字符串通常使用多行字符串;在函数体中可以使用return [表达式]来返回函数的值,如果未使用return语句,系统则默认返回None。
函数的调用
调用函数时,直接在语句中输入函数名并在后面的圆括号内传入实际参数(简称实参),多个参数之间用逗号分隔,其语法格式如下:
函数名(实际参数列表)
此时提供的实际参数应当与定义该函数时指定的形式参数按顺序一一对应,而且参数的数据类型要保持兼容。调用无参数函数时,可以使用以下语法格式:
函数名( )
注意:函数名后面的圆括号不能省略。
【示例1】判断列表[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)引用传递方式 对被调用函数的形参变量分配存储空间,用于存储由调用函数传递过来的实参变量的地址。被调用函数中对形参变量的任何操作将会对调用函数中的实参变量产生影响。传入的参数是可变数据类型。
# 不可变数据类型的数据其实是复制了值再传入到函数的
a = 1
def test(a):
a += 1
test(a)
print(a)
# 可变的数据类型其实是将地址传入到函数的参数里面,函数内部修改也会修改函数外的数据
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']
三、例题讲解
1.求1!+3!+5!+7!的累加和
def jie(n):
if n==1:
return 1
else:
return n*jie(n-1)
s=0
for i in range(1,8,2):
s+=jie(i)
print(s)
2.使用递归函数求1/1+1/2+2/3+3/5+5/8+...的前10项之和,计算结果保留两位小数
def f(n):
if n<=2:
return 1
else:
return f(n-1)+f(n-2)
s=0
for i in range(1,11):
s+=f(i)/f(i+1)
print("%.2f"%s)
3.找出100-1000之间所有的水仙花(1**3+5**3+3**3==153)其中判断是否为水仙花的部分使用函数封装的方法
def sxh(n):
flag=False
bw,sw,gw=n//100,n//10%10,n%10
if bw**3+sw**3+gw**3==n:
flag=True
return flag
for i in range(100,1000):
if sxh(i):
print(i)
四、课堂小结
学习自定义函数是Python编程中的重要一步,它可以帮助你将代码模块化、提高代码的复用性和可读性。如何更好的理解和应用自定义函数:
1. 理解函数的基本概念
2. 掌握函数的基本语法
3. 从简单例子入手
4. 理解函数的返回值
5. 动手实践
6. 多使用print()函数打印输出辅助理解
7. 逐步挑战复杂问题
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$$