Python基础知识(七)

大家好,今天跟大家介绍函数的以下知识:
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

发布了18 篇原创文章 · 获赞 30 · 访问量 3377

猜你喜欢

转载自blog.csdn.net/sinat_40631989/article/details/104395776
今日推荐