小菜鸟的博客

一个探索中的程序媛

Python3---函数的作用域,闭包及递归

一.函数的作用域

全局变量和局部变量

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

(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

优点:使用递归时,常常可以让代码更加简洁

缺点:递归会占用比较多的内存,当递归次数比较多时,性能就会降低,因此不建议多使用递归

阅读更多
文章标签: Python
个人分类: Python
上一篇Python3---函数基础,匿名函数,内置函数
下一篇Python3--异常
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭