函数创建&调用
介绍— “去吧,愿你一生平安,桥都稳固,隧道都光明”
函数是一段可重复使用的、封装好的代码块,可以在代码的不同位置随时调用,它接受输入合规的参数,可以执行特定的任务,或者返回一个想要的结果。
假如有一个糕点师傅正在制作糕点,那么函数就可以想象为制作糕点的烤箱,在烤箱中放入奶油、面粉、糖等原材料就可以制作出美味的糕点,这些原材料可以想象为传递给函数的参数,制作出来的糕点就是这个函数输出的结果。
函数可以理解为把内容输入给一个黑匣子,让它内部处理消化,然后输出我们想要的内容。
在 Python 中,函数具有以下几个特点:
特点 | 描述 |
---|---|
模块化 | 函数是将一段代码块封装起来,形成一个独立的模块,让程序结构更清晰。 |
灵活性 | 函数将复杂的问题分解为更小的单元,可以根据不同的需求,调整函数的行为和输出结果。 |
易管理 | 不同的函数负责不同的任务,可以将所有的函数放在单独的文件中,使主程序更加简洁易读。 |
像我们之前一直接触到的 print 函数就是一个封装好的函数,用于将内容打印在输出框中。
函数的创建和调用
在 Python 中,创建一个函数通常会用到以下几个要素:def 关键词 和 参数 和 函数主体 和 返回值。 其中,参数 和 返回值可以根据情况选择是否省略。
名称 | 描述 |
---|---|
def 关键词 | 用于定义函数名称,使用def关键词后向程序声明要创建一个新的函数。 |
参数 | 参数是函数的输入值,它是函数执行任务所需的信息。参数可以是一个或多个,也可以没有。 |
函数主体 | 函数主体是函数定义中的代码块。它是函数的实际执行部分。 |
返回值 | 函数可以有返回值,用于返回函数执行的结果,当函数执行到 return 时,函数将停止执行。 |
在程序中,函数的写法结构如下:
# 使用 def 定义函数名称,后面传入参数,可以传入一个或者多个,也可以不传
def
函数名
(参数1,参数2,参数3,·······):# 函数主体
·······
# 返回结果
return
待返回的结果函数的调用可以通过函数名称后跟一对括号完成,括号内可以传递函数所需的参数。
来看一个简单的示例方便理解:
【示例】我们来创建一个简单的函数,这个函数不传入任何参数,不返回任何结果
# 定义一个 print_hello 函数
def
print_hello
():# 输出一段话
print
('Hello World'
)# 调用这个创建好的函数
print_hello
()运行代码,结果如下:
Hello World
这个函数没有参数也没有 return 的值,只是单纯的完成了输出 Hello World 这段话到输出框中,这是一个最基础的函数创建的示例,因为函数在创建时没有设定传入参数,所以这个函数在调用时无法传入任何参数,所以括号中是空的,下面我们来看带参数的函数。
【示例】我们创建一个带参数的函数
# 定义一个 welcome_someone 函数
def
welcome_someone
(name):# 根据输入的参数整理出一段话
"你好"
+ name + '!'
print
(word)print
('欢迎您来到这里!'
)# 调用这个创建好的函数,输入参数
welcome_someone
('牧旗'
)运行代码,结果如下:
你好牧旗!
欢迎您来到这里!
我们换一个名字试一下:
welcome_someone
('小明'
)运行代码,结果如下:
你好小明!
欢迎您来到这里!
可以看出,我们创建的函数 可以根据传入的参数变化,输出不同的内容,这就是函数中参数的作用,可以根据使用者的需求,灵活变化想要的过程和结果。
下面我们看一个带 return 返回值的例子:
【示例】我们创建一个可以计算三角形面积的函数
# 定义一个 triangle_area 函数计算三角形面积,设定传入的参数是底和高
def
triangle_area
(bottom,height):# 三角形的面积是底乘高除2
0.5
return
area# 调用这个创建好的函数,输入底和高
triangle_area
(6
,8
)# 输出结果
print
('三角形的面积是:'
,my_area)运行代码,结果如下:
三角形的面积是: 24.0
在这个示例中,我们定义的 triangle_area 函数接收两个参数,并使用了 return 返回了一个值,因为有了 return ,所以后面调用 triangle_area 函数的时候会有一个结果,我们将这个结果赋予给变量 my_area 就可以在后面调用了。
最开始的两个示例中并没有 return 存在,所以没有返回任何值,如果将没有 return 的函数赋给变量,那么这个变量将会是空值。
参数的使用
函数的参数是用于接收函数调用时传递给函数的值。当定义函数时,我们可以在函数名后面的圆括号中定义参数。这些参数允许我们在函数内部使用调用函数时提供的值。
调用参数
在 Python 中,当函数创建好之后,参数有两种方式可以进行调用,一种是 按照对应位置传入参数,一种是 使用关键词参数。
按照对应位置传入参数是指在调用函数时,按照函数设定的参数顺序写入参数值,使用关键词参数是指调用函数时,向参数名称进行赋值,这样就不需要按照顺序来传参了。
让我们通过一个简单的示例来理解这两种方式的含义和区别:
# 定义一个函数计算两个数的和
def
add
(x,y):# 计算输入的参数的和
return
result# 方式一:按照函数定义时的参数顺序输入参数
add
(1
,2
)# 方式二:使用关键词传入参数,有一一对应关系,这样就不需要按照顺序来传
add
(x = 1
, y = 2
)定义参数
在上面的教程中我们了解到了两种调用函数的方式,一种是 按照对应位置传入参数,一种是 使用关键词参数 这两种调用方式,在定义参数时有以下几种方法可以进行选择:
名称 | 描述 |
---|---|
默认参数 | 函数创建者可以在函数中提前对参数进行赋值,如果使用者没有指定参数则会自动使用这个默认值。 |
可变参数 | 函数创建者在不确定使用者传入的参数数量时,可以设定可变参数变量,允许函数接受任意数量的参数。 |
可变关键词参数 | 函数创建者在不确定使用者传入的关键字参数数量时,可以设定可变关键词参数,允许函数接受任意数量的关键词参数。 |
-
默认参数
默认参数是在函数定义时指定的参数默认值,如果在函数调用时没有传递该参数的值,则会按照默认值来赋予给这个参数。
# 定义一个函数计算一个数除另一个数
def
div
(a,b =10
):# 计算输入的参数的和
result = a / breturn
result# 如果不传入参数 b ,那就会默认按照 b 的默认值 10 来计算
result1 =div
(a =10
)# 如果传入参数 b ,那就会按照传入的 b 值计算
result2 =div
(a =10
, b =5
)# 输出结果
print
(result1)print
(result2)运行代码,结果如下:
1.0
2.0 -
可变参数
可变参数允许函数接受任意数量的参数,不限制使用者传入的参数数量,函数内部会将传递的多个参数作为一个元组处理。函数定义可变参数时使用特殊符号 * 表示。
# 定义一个函数计算传入的多个参数的总和
def
add
(*number):# 计算元组的总和,number 是一个元组的数据结构
result =sum
(number)return
result# 任意输入一堆参数测试
result1 =add
(1
,3
,5
)# 任意输入一堆参数测试
result2 =add
(2
,4
,8
,12
,14
,20
,25
)# 输出结果
print
(result1)print
(result2)运行代码,结果如下,可见无论我们输入多少参数,这个函数都是可以接受的。
9
85 -
可变关键词参数
可变关键词参数允许函数接受任意数量的关键字参数,并将这些参数作为一个字典进行处理。在函数定义时,可以使用特殊符号 ** 来表示关键字可变参数。
# 定义一个函数计算传入的多个关键词参数
def
my_info
(**info):# 用户输入的关键词会被转换为一个字典数据结构
for
key,valuein
info.items():print
(key,value)# 任意输入一堆参数测试
my_info
(name='牧旗教程'
,age=27
,school='浙江大学'
)print
('---------------------------'
)# 任意输入一堆参数测试
my_info
(smoke=False
,hobby='游泳'
,education='研究生'
)运行代码,结果如下:
name 牧旗教程
age 27
school 浙江大学
---------------------------
smoke False
hobby 游泳
education 研究生
函数作用域
函数作用域指的是在程序中定义的变量的使用范围。比如 变量在该函数内部定义时只能在函数内部使用,在函数外部不可访问 ,第一次读到这个概念的新手可能有点懵,但是看完后面的例题后就会有所了解,在 Python 中,有以下两种类型的作用域:
-
局部作用域
局部作用域是指在函数内部定义的变量,只能在函数内部访问,并且在函数执行结束后被销毁,只在函数内部有效。这就意味着其他函数或全局变量无法直接访问或修改该内部变量。
来看一个简单的示例方便理解:
【示例】在函数外面定义一个变量,然后在函数内部试着修改这个变量,看看效果
# 定义一个变量
my_value =10
# 定义一个函数,在内部定义一个变量
def
my_function
():my_value =20
print
(my_value)# 输出定义好的变量
print
(my_value)# 调用我们定义好的函数
my_function
()运行代码,结果如下:
10
20【分析】可以看出,我们运行程序后输出 my_value 的变量结果依然是 10 ,说明函数中修改 my_value 变量并没有影响到外部的 my_value 变量,也就是说函数里的变量和函数外部的变量是没有关系的
-
全局作用域
在函数外部定义的变量属于全局作用域,可以在整个程序中访问。
如果在函数中想修改全局变量,需要用到 global 关键词。
来看一个简单的示例方便理解:
【示例】在函数外面定义一个全局变量,然后创建一个函数,内部使用 global 关键词修改这个变量,看看效果。
# 定义一个全局变量
my_value =10
# 定义一个函数,在内部使用 global 修改全局变量
def
my_function
():# 声明 my_value 变量为全局变量,不再是局部变量
global
my_value# 修改全局变量
my_value =20
# 输出定义好的变量
print
(my_value)# 调用函数
my_function
()# 再次输出定义好的变量
print
(my_value)运行代码,结果如下:
10
20【分析】可以看出,在使用第一个 print(my_value) 输出变量时,结果是 10 ,在运行 my_function() 功能函数后输出变量的结果是 20,说明 my_function() 函数修改了外部的 my_value 变量,这就是 global 关键词发挥的作用。
例题
【例题1】编写一个函数,用于根据各科的成绩分数计算平均分,并根据得分判断分级,允许用户同时录入多个科目得分和其他信息。
【分析】这个例题涉及到了函数、条件判断、循环的相关知识,在设定程序的时候使用可变参数和可变关键词参数,允许用户输入多个科目的成绩和自定义信息。
# 规定输入姓名,输入任意数量的分数,任意数量的其他信息
def
report
(name,*scores,**other_info):print
('--------开始生成报告---------'
)# 输出姓名
print
('姓名:'
,name)print
('-----------------'
)# 输出个人其他信息
for
key, value in
other_info.items():print
(str
(key)+":"
+str
(value))print
('-----------------'
)# 计算平均分
sum
(scores)/len
(scores)print
('您的平均分是'
+str
(score)+'分'
)# 根据平均分判断成绩分级
if
90
<= score :'优秀'
elif
80
<= score < 90
:'良好'
elif
70
<= score < 80
:'及格'
else
:'不及格'
# 输出成绩和分级结果
for
i in
range(0,len(scores)):print
("科目"
+str
(i+1
)+"的分数是:"
+ str
(scores[i])+"分"
)print
("您的成绩分级是"
+ result)这样我们就完成定义了我们想要的函数,接下来我多次调用这个函数,并按照规则输入参数来试试:
report
('李明'
,80
,80
,90
,78
,90
,姓别='男'
,年级='高三'
,班级='二班'
)report
('王华'
,89
,82
,94
,70
,80
,姓别='女'
,学校='阳光高中'
,政治面貌='团员'
)report
('小红'
,71
,82
,84
,姓别='女'
,出生年月='20010502'
)运行代码,结果如下:
--------开始生成报告---------
姓名: 李明
-----------------
姓别:男
年级:高三
班级:二班
-----------------
您的平均分是83.6分
科目1的分数是:80分
科目2的分数是:80分
科目3的分数是:90分
科目4的分数是:78分
科目5的分数是:90分
您的成绩分级是良好
--------开始生成报告---------
姓名: 王华
-----------------
姓别:女
学校:阳光高中
政治面貌:团员
-----------------
您的平均分是90.0分
科目1的分数是:89分
科目2的分数是:82分
科目3的分数是:94分
科目4的分数是:90分
科目5的分数是:95分
您的成绩分级是优秀
--------开始生成报告---------
姓名: 小红
-----------------
姓别:女
出生年月:20010502
-----------------
您的平均分是79.0分
科目1的分数是:71分
科目2的分数是:82分
科目3的分数是:84分
您的成绩分级是及格
关注公众号【牧旗教程】,回复“更多例题”,获取更多题型进行训练~
您的打赏将帮助维护网站服务器的正常运营,并为作者的后续更新提供更多的动力。
Copyright © 2013-2023 Muqi Course. All Rights Reserved. 牧旗教程 版权所有 京ICP备2023029281号