目录
函数:就是执行特定任务以实现特定功能的一段代码
为什么需要函数?
- 复用代码
- 隐藏实现细节
- 提高可维护性
- 提高可持续性便于调试
1.函数的创建与调用
1.1函数的创建
语法格式:
def 函数名([输入参数]):
函数体
[return xxx]
示例:
def calc(a,b):
c=a+b
return c
result = calc(11,22)
print(result)
运行结果:
1.2函数参数
函数参数分为形参和实参
形参:在定义函数阶段定义的参数被称之为形式参数,简称形参,相当于变量名。
- 形参在定义阶段
实参:在调用函数阶段传入的值称之为实际参数,简称实参,相当于变量值。
- 实参在调用阶段
形参和实参的关系
- 形参和实参的关系实现只有在绑定函数关系的情况下才会有效,当函数调用结束后则解除关系。
- 形参和实参是一一对应关系
1.3函数定义的形参
1.3.1个数可变的位置形参
个数可变的位置形参
- 定义函数时,无法事先确定传递的位置实参的个数时,使用可变的位置参数
- 使用*定义个数可变的位置形参
- 结果为一个元组
语法结构:
def 函数名(*形参):
示例:
def fun(*a):
print(a)
fun(10)
fun(10, 20)
fun(10, 20, 30)
运行结果:
1.3.2个数可变的关键字形参
个数可变的关键字形参
- 定义函数时,无法事先确定传递的位置实参的个数时,使用可变的关键字参数
- 使用**定义个数可变的关键字形参
- 结果为一个字典
语法结构:
def 函数名(**形参):
示例:
def fun(**b):
print(b)
fun(a=10)
fun(a=10, c=20, d=30)
运行结果:
总结:当一个函数中,存在两个可变的位置形参或者是两个位置可变的关键字形参时,会出现报错,所以只能有一个个数可变的位置形参或个数可变的关键字形参。当一个函数中既出现位置形参又出现关键字形参,那么其顺序是个数可变的位置形参在前,个数可变的关键字形参在后。
1.3.3默认值形参
函数定义时,给形参设置默认值,只有与默认值不符的时候才需要传递实参
示例:
def fun(a, b=10):
print(a, b)
fun(100) # 此时的b采用默认值的形式,默认b为10
fun(20, 30) # 此时的形参和实参不相等,无法采用默认值的形式,此时采用的是实参,所以b为30
运行结果:
1.4函数调用的实参
1.4.1位置实参
根据形参对应的位置进行实参传递
通过*将序列中的每个元素都转换为位置实参
示例:
def fun(a, b, c): # 位置传参
print('a=', a)
print('b=', b)
print('c=', c)
# 函数调用
fun(10, 20, 30) # 函数调用时的参数传递,被称为位置传参
lst = [10, 20, 30]
'''fun(lst) 会出现报错,参数的变量有三个,这样输就只能有有一个,所以会报错,此时需要去添加个数可变的位置传参'''
fun(*lst)
运行结果:
1.4.2关键字实参
根据形参名进行实参传递
通过**将字典中的每个键值对都转换为关键字实参
示例:
def fun(a, b, c):
print('a=', a)
print('b=', b)
print('c=', c)
fun(a=1, b=2, c=3) # 函数调用,关键字参数
d = {'a': 11, 'b': 22, 'c': 33}
# fun(d) 直接输入会出现报错的情况,原因和位置参数是一样的
fun(*d) # 不报错,但是只传键而没有传值
fun(**d) # 此时将字典中的每个键值对都转换为关键字实参,用以实现关键字参数的调用
运行结果:
1.5函数的返回值
函数的返回值
- 如果函数没有返回值(函数执行完毕之后,不需要给调用处提供数据)return可以省略不写
- 函数的返回值,如果是一个,直接返回原类型
- 函数的返回值,如果是多个,返回的结果为元组
是否需要return需要根据实际情况决定
示例:
def fun1():
print('word')
fun1()
def fun2():
return 'word'
res = fun2()
print(res)
def fun3():
return 'hello', 'word'
print(fun3())
运行结果:
2.变量的作用域
变量的作用域:程序代码所能够访问该变量的区域。
变量分为局部变量和全局变量
- 局部变量:在函数内定义并且使用的变量,只在函数内部有效。局部变量使用global声明,这样就会使得其变为全局变量。
- 全局变量:函数体外定义的变量,可作用于函数内外
示例:
# 局部变量
def fun(a, b):
c = a + b # c为局部变量,在函数内部被定义的变量被称为局部变量,作用域也为局部。其中的a,b作用的范围也为内部,故为局部变量
print(c)
# fun(c)
# fun(a) 其中的a和c已经超出了作用的范围
# 全局变量
name = '小明' # name的作用范围是内部和外部均可以使用,所以为全局变量
print(name)
def fun1():
print(name)
fun1()
def fun2():
global age # 函数内部所定义的变量,此变量使用global进行了声明。
age = 20
print(age)
fun2()
运行结果:
3.递归函数
递归函数:在一个函数体内调用该函数本身,这个函数被称为递归函数
- 递归函数是由递归调用与递归终止条件组成
递归函数调用的过程:
- 每递归调用一次函数,都会在栈内分配一个栈帧,
- 没执行完一次函数,都会释放相应的空间
递归的优缺点:
- 优点:思路和代码简单
- 缺点:占用内存多,效率低下
案例1:利用递归函数计算阶乘
def fac(n):
if n == 1:
return 1
else:
return n*fac(n-1)
print(fac(6))
运行结果:
案例2:斐波那契数列的实现
def fac(n): # fac为变量名,自行定义即可
if n == 1:
return 1
elif n == 2:
return 1
else:
return fac(n-1)+fac(n-2)
print(fac(8))
运行结果: