020Python初学笔记--内嵌函数和闭包

1.内嵌函数:在函数中定义函数

#代码段1
>>> def fun1():
	print('外层函数正在被调用')
	def fun2():
		print('内层函数正在被调用')

	
>>> fun1()
外层函数正在被调用

#代码段2
>>> def fun1():
	print('外层函数正在被调用')
	def fun2():
		print('内层函数正在被调用')
	fun2()

	
>>> fun1()
外层函数正在被调用
内层函数正在被调用

>>> fun2()    #内嵌函数直接被调用
Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    fun2()
NameError: name 'fun2' is not defined

注:①内嵌函数不能再外层函数被调用的过程中自动被调用 ②内部函数不能被外部直接使用,需要通过其外层函数的调用发挥作用

2.闭包:出现在嵌套函数中,指的是内层函数引用到了外层函数的变量,就形成了闭包

>>> def funX(x):
	def funY(y):
		return x*y
	return funY     #返回内层函数

>>> funX(2)(5)      #对闭包的调用
10

#注:
>>> m=funX(2)       #只对外层函数进行了调用
>>> type(m)         #所以函数的返回类型及m的类型为function
<type 'function'>
>>> m(3)            #继续对内层函数进行调用
6

3.在函数内部修改全局变量的值:global关键字

>>> num=3
>>> def count():
	global num
	num=5
	print(num)

	
>>> count()
5
>>> num
5

注:能不直接访问全局变量尽量不要访问,如需使用全局变量可以使用函数进行传参。

4.在内嵌函数中修改外部函数的局部变量:nonlocal关键字

>>> def fun1():
	x=5
	def fun2():
		nonlocal x
		x+=7
		return x
	return fun2

>>> fun1()()
12

练习1:以下是闭包的一个例子,目测一下会打印什么内容?

#例子1:
def funX():
	x=5
	def funY():
		nonlocal x
		x+=1
		return x
	return funY
a=funX()
print(a())
print(a())
print(a())

#例子2:
def funX():
	x=5
	def funY():
		nonlocal x
		x+=1
		return x
	return funY
a=funX()
print(a())
a=funX()
print(a())
a=funX()
print(a())
#例子1结果:
6
7
8

#例子2结果:
6
6
6

注:例子2中局部变量x在每次调用时都被重新赋值了,所以结果都是6。但是例子1中,a=funX()的时候,只要a变量没有被重新赋值,funX()就没有被释放,也就是说局部变量x没有被重新初始化。

注:当全局变量不适用时,可以考虑使用闭包更安全更稳定

猜你喜欢

转载自blog.csdn.net/beautiful77moon/article/details/87023824