函数:是组织好的,可重复使用的,用来实现特定功能的代码段。
使用函数的好处:
- 将功能封装在函数内,可供随时随地重复利用
- 提高代码的复用性,减少重复代码,提高开发效率
函数的定义
def 函数名(传入参数):
函数体
return 返回值
def greet_user():
print("Hello!")
函数的调用
函数名(参数)
def greet_user():
print("Hello!")
greet_user()
运行结果:
Hello!
注意事项:
- 参数如不需要,可以省略
- 返回值如不需要,可以省略
- 函数必须先定义后使用
函数的传入参数
传入参数的功能:在函数进行计算的时候,接受外部(调用时)提供的数据。
例:两数相加的函数
#定义函数
def add(x, y):
result = x + y
print(f"{x} + {y}的结果是{result}")
#调用函数
add(3, 5)
add(20, 34)
add(223, 244)
函数定义中,提供的x和y,称为:形式参数(形参),表示函数声明将要使用2个参数
- 参数之间使用逗号进行分隔
函数调用中,提供的3和5(20和34、223和244),称为:实际参数(实参),表示函数执行时真正使用的参数值
- 传入的时候,按照顺序传入数据,使用逗号分隔
运行结果:
3 + 5的结果是8
20 + 34的结果是54
223 + 244的结果是467
传入的参数的数量是不受限制的
- 可以不使用参数
- 也可以使用任意N个参数
例:三数相加的函数
#定义函数
def add(x, y, z):
result = x + y + z
print(f"{x} + {y} + {z}的结果是{result}")
#调用函数
add(3, 5, 9)
add(20, 34, 65)
add(223, 244, 443)
运行结果:
3 + 5 + 9的结果是17
20 + 34 + 65的结果是119
223 + 244 + 443的结果是910
位置参数
调用函数时根据函数定义的参数位置来传递参数。
def user_info(name, age, gender):
print(f"您的名字是{name},年龄是{age},性别是{age}")
user_info("MARY", 20, "女")
传递的参数和定义的参数的顺序及个数必须一致。
关键字参数
函数调用时通过“键=值”形式传递参数。
可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。
def user_info(name, age, gender):
print(f"您的名字是:{name},年龄是{age},性别是{gender}")
# 关键字传参
user_info(name="小明", age =20, gender="男")
# 可以不按照固定顺序
user_info(age =20, gender="男", name="小明")
# 可以和位置参数混用,位置参数必须在前,且匹配参数顺序
user_info("小明", age =20, gender="男")
函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序。
缺省参数
也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)。
作用:当调用函数时没有传递参数,就会使用默认是用缺省参数对应的值。
def user_info(name, age, gender="男"):
print(f"您的名字是:{name},年龄是{age},性别是{gender}")
user_info("TOM", 20)
user_info("Rose", 18, "女")
运行结果:
您的名字是:TOM,年龄是20,性别是男
您的名字是:Rose,年龄是18,性别是女
函数调用时,如果为缺省参数传值则修改默认参数值,否则使用这个默认值。
不定长参数
也叫可变参数。用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。
作用:当调用函数时不确定参数个数时,可以使用不定长参数。
不定长参数的类型:
- 位置传递
- 关键字传递
位置传递
def user_info(*args):
print(args)
# ("TOM",)
user_info("TOM")
# ("TOM", 18)
user_info("TOM", 18)
传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是位置传递。
关键字传递
def user_info(**kwargs):
print(kwargs)
# {'name': 'TOM', 'age': 18, 'id': 110}
user_info(name="TOM", age=18, id=110)
参数是“键=值”形式的情况下,所有的“键=值”都会被kwargs接受,同时会根据“键=值”组成字典。
函数的返回值
函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值。函数返回的值被称为返回值。在函数中,可使用return语句将值返回到调用函数的代码行。
如图:定义两数相加的函数功能。完成功能后,会将相加的结果返回给函数调用者,所以,变量r接收到了函数的执行结果。
def add(a, b):
result = a + b
return result
r = add(4, 5)
print(r)
运行结果:
9
def 函数(参数...):
函数体
return 返回值
变量 = 函数(参数)
函数体在遇到return后就结束了,所以写在return后的代码不会执行。
函数的多返回值
def test_return():
return 1, 2
x, y =test_return()
print(x) #结果:1
print(y) #结果:2
- 按照返回值的顺序,写对应顺序的多个变量接受即可
- 变量之间用逗号隔开
- 支持不同类型数据return
例:
def test_return():
return 1, "Hello", True
x, y, z = test_return()
print(x)
print(y)
print(z)
运行结果:
1
Hello
True
None类型
如果函数没有使用return语句返回数据,函数还有返回值吗?
def greet_user():
print("Hello!")
#使用变量接收greet_user函数的返回值
r = greet_user()
#打印返回值
print(r)
#打印返回值类型
print(type(r))
运行结果:
None
<class 'NoneType'>
None作为一个特殊的字面量,用于表示:空、无意义,有非常多的应用场景。
- 用在函数无返回值上
def greet_user():
print("Hello!")
return None
- 用在if判断上
- 在if判断中,None等同于False
- 一般用于在函数中主动返回None,配合if判断做相关处理
def check_age(age):
if age > 18:
return "SUCCESS"
else:
return None
result = check_age(5)
if not result:
#进入if表示result是None值,也就是False
print("未成年")
- 用于声明无内容的变量上
- 定义变量,但暂时不需要变量有具体值,可以用None来代替
#暂不赋予变量具体值
name = None
函数说明文档
函数是纯代码语言,想要理解其含义,就需要一行行的去阅读理解代码,效率比较低。
我们可以给函数添加说明文档,辅助理解函数的作用。
语法如下:
def func(x, y):
"""
函数说明
:param x: 形参x的说明
:param y: 形参y的说明
:return: 返回值的说明
"""
函数体
return 返回值
通过多行注释的形式,对函数进行说明解释(内容应写在函数体之前)
例:
def add(x, y):
"""
add函数可以接收2个参数,进行两数相加的功能
:param x: 形参x表示加的其中一个数字
:param y: 形参y表示相加的另一个数字
:return: 返回值是两数相加的结果
"""
result = x + y
print(f"两数相加的结果是:{result}")
return result
函数的嵌套调用
函数嵌套调用指的是一个函数里面又调用了另外一个函数。
def func_b():
print("---2---")
def func_a():
print("---1---")
func_b()
print("---3---")
#调用函数func_a
func_a()
运行结果:
---1---
---2---
---3---
函数a中执行到调用函数b的语句,会将函数b全部执行完成后,继续执行函数a的剩余内容。
变量在函数中的作用域
变量作用域指的是变量的作用范围(即变量在哪里可用,在哪里不可用)
主要分为两类:局部变量和全局变量
局部变量
局部变量是定义在函数体内部的变量,即只在函数体内部生效。
def test1():
num = 100
print(num)
test1() # 100
print(num) # 报错:name 'num' is not defined
- 变量num是定义在“test1”函数内部的变量,在函数外部访问则立即报错
局部变量的作用:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量。
全局变量
全局变量是指在函数体内、外都能生效的变量。
如果有一个数据,在函数a和函数b中都要使用,该怎么办?
将这个数据储存在一个全局变量里面。
# 定义全局变量
num = 100
def testA():
print(num)
def testB():
print(num)
testA() # 100
testB() # 100
global关键字
test_b函数需要修改全局变量num的值为500,如何修改程序?
# 在函数内修改全局变量
num = 100
def test_a():
print(f"test_a:{num}")
def test_b():
num = 500
print(f"test_b:{num}")
test_a()
test_b()
print(num)
运行结果:
test_a:100
test_b:500
100
使用global关键字,可以在函数内部声明变量为全局变量,例:
num = 100
def test_a():
print(f"test_a:{num}")
def test_b():
# global关键字声明num是全局变量
global num
num = 500
print(f"test_b:{num}")
test_a()
test_b()
print(num)
运行结果:
test_a:100
test_b:500
500