大家好,今天跟大家介绍函数的以下知识:
1、命名空间和作用域,主要有命名空间的本质和作用域的介绍,还有locals(,globals()的用法。
2、嵌套函数,包含嵌套函数的定义,以及简单的嵌套函数,多级嵌套函数。
3、闭包函数,闭包的概念,以及怎么样判读闭包函数,最后是闭包中nonlocals()的用法。
一、命名空间和作用域
1、命名空间
1)命名空间的本质:存放名字与值的绑定关系
2)三种命名空间之间的加载与取值顺序:
加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)
取值:
在局部调用:局部命名空间->全局命名空间->内置命名空间
在全局调用:全局命名空间->内置命名空间
2、作用域
1)作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。
全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效。
局部作用域:局部名称空间,只能在局部范围内生效。
2)globals和locals方法。
global()返回全局作用域的属性字典, locals()返回局部作用域的属性字典.当locals()在模块顶层的位置时返回的值与global()相同.
locals()用法
#locals用法
def func():
a = 12
b = 20
print(locals())
func()
结果如下:
此外,简单介绍一下常见的错误用法,如下:
示例1:
原因是因为x是个局部变量,在函数外要print(x), 按照上面python引用变量的顺序,是找不了x变量的,故为报错.
示例2:
原因因为按照python引用变量的顺序,当print(x)时,就会先在函数体内查找x,能找到,但在他的下一行,故为在声明前被引用是不对的。改动如下:
#先引用再声明
x=20
def fun():
#print(x)
x=100
print(x)
fun()
print(x)
此时x=10是全局变量,x=100是函数内的局部变量,故执行函数之后,执行print(x)中x是全局变量。
globals()用法
#global用法
a = 10
def func():
global a
a = 20
print(a)
func()
print(a)
二、函数的嵌套
1、 定义
嵌套就是函数中的函数,通过嵌套可以使内层函数隐藏起来,使之作为私有函数,嵌套可以为函数增加一些附加处理,能够使得函数更加健壮。
2、举例
简单嵌套举例
#函数的嵌套
def f1(x):
def f2(y):
return y+x+1
number=f2(20)#必须在函数内实例化,函数体内是其作用域。
print(number)
print("关于嵌套的定义:")
f1(30)
结果如下:
执行流程是: 先执行print语句,再执行f1函数,执行f1函数时,其嵌套一个f2函数,故执行number=f2,执行f2函数时x是f2函数没有的参数,故往外层函数找。倘若将f2没有实参,return x+1,则最终结果为31。
多级嵌套举例:
#多级嵌套
def f1(x):
print('----',x)
def f2(y):
print('----',y)
def f3(z):
print('----',z)
f3(5)
f2(10)
f1(15)
三、闭包函数
1.概念
闭包(closure)是函数式编程的重要的语法结构,Python也支持这一特性,下面就开始介绍Python中的闭包。
内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数
#函数内部定义的函数称为内部函数
闭包函数的必备条件 :
(1)必须要有内层函数
(2)内层要引用外层变量
在Python中创建一个闭包可以归结为以下三点:
(1)闭包函数必须有内嵌函数
(2)内嵌函数需要引用该嵌套函数上一级namespace中的变量
(3)闭包函数必须返回内嵌函数
2、闭包函数举例如下:
#闭包函数
def func():
name = 'kobe'
def inner():
print(name)
return inner
f = func()
f()
结果如下:
3、闭包函数的判断:
#输出的__closure__有cell元素 :是闭包函数
def func():
name = 'kobe'
def inner():
print(name)
print(inner.__closure__)
return inner
f = func()
f()
结果如下:
#输出的__closure__为None :不是闭包函数
name = 'kobe'
def func2():
def inner():
print(name)
print(inner.__closure__)
return inner
f2 = func2()
f2()
4、nonlocal用法
这个一般是用在闭包函数里. 但是一定要认识到, nonlocal声明的变量在上级局部作用域内,而不是全局定义, 如果在它声明的变量在上级局部中不存在,则会报错. 实例如下:
x = 12
def outer():
x = 30
def inter():
x = 50
inter()
print(x)
outer()
结果为30。 那如果要求inter中对x的修改是有效的,必须加上关键字nonlocal,结果为50,如下:
x = 12
def outer():
x = 30
def inter():
nonlocal x
x = 50
inter()
print(x)
outer()
今天跟大家分享到这啦,特殊时期,祝身体健康!
参考博客:
https://blog.csdn.net/weixin_44239385/article/details/86618700
https://www.cnblogs.com/Eva-J/articles/7156261.html