函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
一、函数的使用步骤
1. 定义一个函数
-
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
-
任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
-
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
-
函数内容以冒号起始,并且缩进。
-
return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None
def 函数名(参数):
"函数文档字符串"
代码1
代码2
......
2. 函数的调用
定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。
函数必须调用才会进行执行 。根据不同的不同的需求,参数可有可⽆。
# 函数名(参数)
在Python中,函数必须先定义后使⽤。也就是说,在编写程序时,自定义函数部分需放在函数调用的前面。
# 定义函数
def demo():
print("我是dmeo函数")
# 调用函数
demo()
执行结果
二、函数的参数作用
1. 必备参数(仅赋值传参)
必备参数须以正确的顺序传入函数且调用时的数量必须和声明时的一样,不然会出现语法错误。
# 定义函数时同时定义了接收⽤户数据的参数a和b
def demo2(a, b):
result = a - b
print(result)
# 调⽤函数时传⼊了真实的数据10 和 20
demo2(10, 20)
demo2(20, 10)
demo2()
执行结果
2. 关键字参数(键值对传参)
关键字参数和函数调用关系紧密,函数调用使用关键字参数(即键值对方式)来确定传入的参数值。 同样是上面的函数,可以不用按顺序传参。但是这实际也是必备参数,所有的参数都要传递,否则会报错。
# 定义函数时同时定义了接收⽤户数据的参数a和b
def demo2(a, b):
result = a - b
print(result)
# 调⽤函数时传⼊了真实的数据10 和 20
demo2(a=20, b=10) # 10
demo2(b=10, a=20) # 10
执行结果
3. 默认参数
也可称默认可省略参数,即该参数若是调用函数时未给值不报错。定义函数时就给了该参数默认值,若调用函数时未给该参数传值,那么执行过程中就使用函数定义中的默认值;若调用函数时给该参数正常传参,则使用实际传参值。这个默认参数必须在后面,否则调用的时候按照顺序赋值的时候,少传递一个就不是这个有默认值的了,会报错。
# 默认参数在最后
def demo1(name, age, hobby="听音乐会"):
"输出人员的自我介绍"
print(f"姓名:{name}", end=" ")
print(f"年龄:{age}", end=" ")
print(f"爱好:{hobby}")
demo1(name='白泽', age='20')
demo1(name='白泽', age='20', hobby="看电影")
执行结果
默认参数不在最后,会报错,无法执行,如下
# 默认参数不在最后,会报错,无法执行
def demo2(name, age='18', hobby):
"输出人员的自我介绍"
print(f"姓名:{name}", end=" ")
print(f"年龄:{age}", end=" ")
print(f"爱好:{hobby}")
# 报错
demo1(name='白泽', age=20, hobby="看电影")
demo1(name='白泽', hobby="看电影")
执行结果 ,表示当前没有默认参数
4. 不定长参数
python自定义函数中有两种不定长参数,第一种是*XXX,在传入额外的参数时可以不用指明参数名,直接传入参数值即可。第二种是**XXX,这种类型返回的是字典,传入时需要指定参数名。
加了一个星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。
加了两个星号** 的参数会以字典的形式导入,存放已命名的变量参数。
def demo1(*args):
print(args)
def demo2(num, *args, **kwargs):
print(num)
print(args)
print(kwargs)
demo1(1, 2, 3, 4, 5)
demo2(11, 22, 33, a=18, b=19, c=20)
执行结果
三、函数的返回值作用
使用return语句退出函数,表达式的结果即函数返回值。若无表达式则返回None
# return 表达式
# 输出5
def demo1():
for i in range(1, 10):
if i >= 5:
return i
print(demo1())
# 输出None
def demo1():
for i in range(1, 10):
if i >= 5:
return
print(demo1())
执行结果
四、变量作用域
变量的作用域决定了哪部分程序可以访问哪些变量,由此可分为全局变量和局部变量。
如果在函数的里面需要使用全局的变量,就需要进行声明 # global 全局变量名
#全局变量
num = 100
def func():
# 局部变量(函数的内部)
# 如果在函数的里面需要使用全局的变量,就需要进行声明
global num # 使用全局变量num
print(num)
num = 1000
func()
print(num)
执行结果
五、函数的嵌套使用
所谓函数嵌套调⽤指的是⼀个函数⾥⾯⼜调⽤了另外⼀个函数
六、练习
定义两个函数:
调用第一个函数可以录入学员,输入学员姓名,并将学员姓名添加到列表;
调用第二个函数可以查询学员,输入学员姓名,可查询学员是否录入。
# 定义两个函数
# 调用第一个函数可以录入学员
# 输入学员姓名,并将学员姓名添加到列表
# 调用第二个函数可以查询学员
# 输入学员姓名,可查询学员是否录入
AllName = []
def WriteNameOfStudent():
# 输入学员姓名,并将学员姓名添加到列表AllName中
# 可多次执行,填充姓名库
name_str = input("请输入希望录入的学员姓名(两个姓名之间以空格隔开):")
name_list = name_str.split(" ") # 将输入的字符串按空格切割为每个姓名
for i in name_list: # 查找是否改姓名已录入,若已录入则不重复录入,若未曾录入则录入列表
if AllName.count(i) == 0: # 姓名库中未找到该姓名,则录入该姓名
AllName.append(i)
else: # 姓名库中存在该姓名,则不重复录入该姓名
print("“{}”已录入,不重复录入".format(i))
print("当前已录入姓名如下:\n{}".format(AllName))
return AllName
def SearchNameOfStudent():
# 输入学员姓名,查询学员是否已录入
# 可同时查询多名同学姓名
name_str = input("请输入希望查询的学员姓名(两个姓名之间以空格隔开):")
name_list = name_str.split(" ") # 将输入的字符串按空格切割为每个姓名
SearchPass_list = [] # 定义空列表存储查询成功的姓名
SearchFail_list = [] # 定义空列表存储查询失败的姓名
for i in name_list:
if i in AllName:
SearchPass_list.append(i)
else:
SearchFail_list.append(i)
if len(SearchFail_list) == 0:
print("以下同学姓名已在库中查询成功!\n{}".format(SearchPass_list))
else:
print("以下同学姓名已在库中查询成功!\n{}".format(SearchPass_list))
print("以下同学姓名在库中查询失败!\n{}".format(SearchFail_list))
return SearchFail_list
# 执行函数操作
WriteNameOfStudent()
WriteNameOfStudent()
print(AllName)
SearchNameOfStudent()