一.函数的作用域
全局变量和局部变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
(1)函数内部的变量,作用域只在函数内部,函数内部不可以直接更改函数外部的变量
(2)函数内部如果需要改变全局变量,就需要使用global修饰变量
(3)在函数嵌套函数的情况下,同样也有函数作用域的问题,但是python3中提供了方便,只需要使用nonlocal就可以在里层函数内部修改外部函数变量
x=1 #全局变量
def fun():
y=2 #局部变量
print(x,y)
global关键字:
想要在函数里修改全局变量,需要使用关键字global
x=1 #全局变量
def fun():
y=2 #局部变量
global x
x+=1
print(x,y)
fun()
#运行结果:
2 2
想要在函数外访问函数里的变量,也需要使用关键字global
不加global的时候:
加global的时候:
当函数外变量和函数里变量同名,且函数里使用了global关键字,优先使用函数里的变量
#例
a=10
def f1():
global a
a+=1
print(a)
def f2():
global a
a=1
print(a)
f1()
f2()
#运行结果
11
1 #f2中同时存在global a 全局变量和a = 1这个局部变量,优先使用f2中自带的a
nonlocal关键字:
如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了
def fun2():
q=1 #局部外层
print('局部外层',q)
def fun3():
w=22
nonlocal q # nonlocal关键字声明
q+=1 #局部里层
print(q)
print('局部里层',w)
fun3()
fun2()
#运行结果:
局部外层 1
2
局部里层 22
二.闭包
1.内嵌函数:函数里又嵌套一个函数
def fun1():
print('fun1()在被调用')
def fun2():
print('fun2()在被调用')
fun2()
2.闭包
闭包是函数里面嵌套函数,外层函数返回里层函数,这种情况称之为闭包
闭包是概念,不是某种函数类型,和递归的概念类似,就是种特殊的函数调用
闭包可以得到外层函数的局部变量,是函数内部和函数外部沟通的桥梁
def fun4(a):
print(a)
def fun5():
print(a,11)
return fun5 #调用不执行
a = fun4(3)
a() #相当于 fun4(3)() 调用fun5
#运行结果
3
3 11
三.回调函数
##回调函数
def fun6():
print('第一个函数')
def fun7(a): #把上一个函数体当成参数
a()
print('第二个函数')
fun7(fun6)
#运行结果:
第一个函数
第二个函数
四.递归函数
即自己调用自己
递归中可以函数自身调用自身,但是使用时类似于条件循环一样,要有递归的终止条件
#阶乘
# 5!=5*4*3*2*1
def factorial(n):
if n==1:
return 1
else:
return factorial(n-1)*n
优点:使用递归时,常常可以让代码更加简洁
缺点:递归会占用比较多的内存,当递归次数比较多时,性能就会降低,因此不建议多使用递归