函数
函数
是组织好的,可重复使用的,用来实现特定功能的代码段。
好处
可以让我们得到一个针对特定需求、可供重复利用的代码段。
提高程序的复用性,减少重复性代码,提高开发效率。
定义
def 函数名(传入参数):
函数体
return 返回值
案例
# 定义一个函数,输出相关信息
def say_hi():
print("Hello World")
# 调用函数(函数名加参数)
say_hi()
注意事项
- 如果参数不需要,可以省略
- 如果返回值不需要,可以省略
- 函数必须先定义后使用
函数的参数
传入参数的功能是:在函数进行计算的时候,接受外部(调用时)提供的数据。
案例
# 定义2数相加的函数,通过参数接收被计算的2个数字
def add(x,y):
result = x + y
print(f"{x} + {y} 的结果是:{x+y}")
# 调用函数,传入被计算的2个数字
add(1,2)
add(3,4)
函数定义中,提供的x和y,称之为:形式参数(形参),表示函数声明将要使用2个参数。
函数调用中,提供的5和6,称之为:实际参数(实参),表示函数执行时真正使用的参数值。
注意事项
- 参数之间使用逗号进行分隔
- 传入的时候,按照顺序传入数据,使用逗号分割
函数的返回值
通过返回值可以将结果返回给调用者接收。
使用关键字 return 来返回结果。
函数题在遇到 return 后就结束了,所以写在 return 后的代码不会执行。
None 类型
如果函数没有使用 return 语句返回数据,那么函数也有返回值。
Python 中有一个特殊的字面量 None,其类型是<class ‘NodeType’>,没有返回值的函数,实际上就是返回了:None 这个字面量。
None 表示空的、无实际意义的意思。
函数返回的None,就表示这个函数没有返回什么有意义的内容,也就是返回了空的意思。
应用场景
- 用在函数无返回值上
- 用在 if 判断上
- 在 if 判断中,None 等同于 False
- 一般用于在函数中主动返回 None,配合 if 判断做相关处理
- 用于声明无内容的变量上
- 定义变量,暂时不需要变量有具体值,可以用 None 来代替
函数说明文档
函数是纯代码语言,想要理解其含义,就需要一行行的去阅读理解代码,效率比较低。
我们可以给函数添加说明文档,辅助理解函数的作用。
语法如下:
def function(x,y):
"""
函数说明
:param x: 形参x的说明
:param y: 形参y的说明
:return: 返回值的说明
"""
函数体
return 返回值
通过多行注释的形式对函数进行说明解释,内容写在函数体之前。
案例
def add(x,y):
"""
添加函数
:param x: 形参x表示相加的其中一个数字
:param y: 形参y表示相加的另一个数字
:return: 返回值是2数相加的结果
"""
result = x + y
print(f"{x} + {y} 的结果是:{x+y}")
return result
函数的嵌套调用
所谓函数嵌套调用指的是一个函数里面又调用了另一个函数。
def fun_b():
print("我是方法b")
def fun_a():
print("我是方法a")
# 嵌套调用函数 fun_b
fun_b()
print("我执行完啦")
fun_a()
在函数a中调用了另一个函数b,那么先把函数b中的任务都执行完毕后才会回到上次函数a执行的位置。
函数变量作用域
变量作用域指的是变量的作用范围(变量在哪可用,在哪里不可用)。
主要分为两类:局部变量和全局变量。
局部变量
所谓局部变量是定义在函数体内部的变量,即只在函数体内部生效。
def testA():
num = 100
print(num)
testA()
# 除了函数体,局部变量就不能使用了
print(num) # 报错,name num is not defined
作用
在函数体内部,临时保存数据,当函数执行完毕后立刻销毁局部变量。
全局变量
全局变量指的是在函数体内外都能生效的变量。
# 全局变量
num = 200
def testB():
print(f"testB:{num}")
def testC():
print(f"testC:{num}")
testB()
testC()
print(num)
global 关键字
global 关键字声明变量是全局变量
num = 200
def testC():
global num
num = 500
print(f"testC:{num}")
testC()
print(num)
函数多返回值
如果有多个返回值,可以使用逗号隔开,在调用函数的位置,写对应顺序的多个变量接收即可(支持不同类型的数据return)。
# 都使用多个变量,接收多个返回值,可以是不同类型
def test_return():
return 1,"hello",True
x,y,z = test_return()
print(f"test_return()返回值有三个,分别为{x},{y},{z}")
函数多种传参方式
位置参数
位置参数指调用函数时根据函数定义的参数位置来传递参数。
注意:传递的参数和定义的参数的顺序及个数必须一致。
# 位置参数
def user_info(name,age,gender):
print(f"您的名字是{name},年龄是{age},性别是{gender}")
user_info("jqz",21,'男')
关键字参数
函数调用时通过”键=值“形式传递参数。
可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。
# 关键字参数
def user_info(name,age,gender):
print(f"您的名字是{name},年龄是{age},性别是{gender}")
# 关键字传参
user_info(name="jqz",age=21,gender='男')
# 可以不按照固定顺序
user_info(age=21,gender='男',name="jqz")
# 可以和位置参数混用,位置参数必须在前,且匹配参数顺序
user_info("jqz",gender='男',age=21)
缺省参数
缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值。
注意:所有位置参数必须出现在默认参数前,包括函数定义和调用。
# 缺省参数
def user_info(name,age,gender='男'):
print(f"您的名字是{name},年龄是{age},性别是{gender}")
# 不给默认值传参
user_info("jqz",age=21)
# 给默认值传参
user_info("jqz",age=21,gender='女')
不定长参数
不定长参数也叫可变参数,用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。
作用:当调用函数时不确定参数个数时,可以使用不定长参数。
不定长参数的类型:1、位置传递 2、关键字传递
位置传递
传进的所有参数都会被args变量手机,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是位置传递。
# 不定长-位置不定长,*号
# 不定长定义的形式参数会作为元组存在,接收不定长数量的参数传入
def user_info(*args):
print(f"args参数的类型是:{type(args)},内容是:{args}")
user_info(1,2,3,"hello","男孩")
关键字传递
参数时“键=值”形式的情况下,所有的“键=值”都会被kwargs接收,同时会根据“键=值”组成字典。
# 不定长-关键字不定长,**号
def user_info(**kwargs):
print(f"args参数的类型是:{type(kwargs)},内容是:{kwargs}")
user_info(key1 = 1,key2=2,key3=3,key4="hello",key5="男孩")
匿名函数
函数作为参数传递
函数本身可以作为参数传入另一个函数内。
传入的是代码的执行逻辑,而非数据的传递,任何逻辑都可以自行定义并作为函数传入。
# 定义一个函数,接收另一个函数作为传入参数
def test_func(compute):
result = compute(1,2)
print(f"compute参数的类型是:{type(compute)}")
print(f"计算结果为:{result}")
# 定义一个函数,准备作为参数传入另一个函数
def compute(x,y):
return x+y
# 调用,并传入函数
test_func(compute)
Lambda 匿名函数
在函数的定义中,def 关键字,可以定义带有名称的函数,lambda关键字,可以定义匿名函数(无名称)。
有名称的函数,可以基于名称重复使用。
无名称的匿名函数,只可临时使用一次。
匿名函数定义语法:
lambda 传入参数:函数体(一行代码)
- lambda 是关键字,表示定义匿名函数
- 传入参数表示匿名函数的形式参数,如:x,y表示接收2个形式参数
- 函数体,就是函数的执行逻辑,要注意:只能写一行,无法写多行代码
# 定义一个函数,接收另一个函数作为传入参数
def test_func(compute):
result = compute(1,2)
print(f"compute参数的类型是:{type(compute)}")
print(f"计算结果为:{result}")
# 通过 lambda 匿名函数的形式,将匿名函数作为参数传入
test_func(lambda x,y:x+y)
使用 def 和使用 lambda 定义的函数功能完全一致,只是 lambda 关键字定义的函数时匿名的,无法二次使用。