Python-16 函数:内嵌函数和闭包

1、global关键字

全局变量的作用域是整个模块(也就是整个代码段),也就是代码段内的所有函数内部都可以访问到全局变量。但注意,在函数内部仅仅去访问全局变量就好,不要试图去修改它。

因为那样的话,Python会使用屏蔽(shadowing)的方式“保护”全局变量:一旦函数内部试图修改全局变量,Python就会在函数内部自动创建一个名字一模一样的局部变量,这样子修改的结果只会修改到局部变量,而不会影响到全局变量。

>>> count = 5
>>> def MyFun():
	count = 10
	print(count)

	
>>> MyFun()
10
>>> print(count)
5
>>> 

如果要在函数中修改全局变量,使用关键字global

>>> def MyFun():
	global count
	count = 10
	print(count)

	
>>> MyFun()
10
>>> print(count)
10
>>> 

2、内嵌函数

Python的函数定义可以嵌套的,也就是允许在函数内部创建另一个函数,这样的函数叫做内嵌函数或者内部函数。

>>> def fun1():
	print('fun1正在被调用...')
	def fun2():
		print('fun2正在被调用...')
	fun2()

	
>>> fun1()
fun1正在被调用...
fun2正在被调用...
>>> 

3、闭包

闭包(closure)是函数式编程的一个重要语法结构,函数式编程是一种编程范式,著名的函数编程语言就是LISP语言(主要用于绘图,AI)

不同的编程语言实现闭包的方式不同,Python中闭包从表现上定义为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。

>>> def FunX(x):
	def FunY(y):
		return x*y
	return FunY

>>> i = FunX(8)
>>> i
<function FunX.<locals>.FunY at 0x024EE390>
>>> type(i)
<class 'function'>
>>> i(5)
40
>>> FunX(8)(5)
40
>>> 
内部函数FunY()就是闭包。

在外部调用FunY()是不允许的:

>>> FunY(5)
Traceback (most recent call last):
  File "<pyshell#34>", line 1, in <module>
    FunY(5)
NameError: name 'FunY' is not defined
>>> 


闭包函数调用外部作用域但不是全部变量x,报错“局部变量x,不能在定义之前被使用”
>>> def Fun1():
	x = 5
	def Fun2():
		x*=x
		return x
	return Fun2()

>>> Fun1()
Traceback (most recent call last):
  File "<pyshell#42>", line 1, in <module>
    Fun1()
  File "<pyshell#41>", line 6, in Fun1
    return Fun2()
  File "<pyshell#41>", line 4, in Fun2
    x*=x
UnboundLocalError: local variable 'x' referenced before assignment


可以进行如下改造,x变为一个列表,因为列表不是存在栈里面

>>> def Fun1():
	x = [5]
	def Fun2():
		x[0]*=x[0]
		return x[0]
	return Fun2()

>>> Fun1()
25


(1)、关键字 nonlocal

还可以使用关键字nonlocal,把x强制声明为非局部变量。

>>> def Fun1():
	x = 5
	def Fun2():
		nonlocal x
		x*=x
		return x
	return Fun2()

>>> Fun1()
25














  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值