文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python的函数学习2

2023-01-30 23:54

关注

用来存放名字的地方,有三种名称空间:内置名称空间,全局名称空间,局部名称空间。

1 比如执行test.py:
2 
3 python test.py
4 1、python解释器先启动,因而首先加载内置名称空间
5 2、执行test.py文件,然后以文件为基础,加载全局名称空间
6 3、在执行文件的过程中如果调用函数,则临时产生局部名称空间

名称的加载顺序是先加载内置名称空间,再加载全局名称空间,最后是局部名称空间,所以,如果在全局名称空间中使用局部名称空间,是错误的,因为根本就找不到。

而在函数调用时查找名字的顺序是:局部名称空间--->全局名称空间--->内置名称空间。

首先来谈一下什么是作用域?先看一个例子:

 1     b = 20
 2     def func1():
 3         a = 10
 4         print(a)
 5         print(b)
 6 
 7     def func2():
 8         print(b)
 9         # print(a)
10 
11     func1()
12     func2()

上面这段代码虽然简单,却可以很好的说明了函数作用域的问题,如上,如果注释掉函数func2的print(a)这一句,程序可以正常运行,但是如果加上这一句就出错,出错的原因是a没有定义,为什么b在两个函数中都可以引用,而a只能在func1中使用呢?这就是因为a的作用域的问题了。

变量作用域:

  ①L(Local)局部作用域

  ②E(Enclosing)闭包函数外的函数中

  ③G(Globa)全局作用域

  ④B(Built-in)内建作用域

 

以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,最后去内建中找。

那么这具体是什么意思呢?

  如上面的例子中,由名称空间的加载可知调用函数func1时产生func1的局部名称空间,而a就在该空间内,执行函数func1时从该名称空间中查找a,所以func1可以找到a。

  但是函数func2的局部名称空间中却没有变量a,所以找不到,那就去全局名称空间找,也没有,所以出错。(Enclosing是对于闭包来说的)

  这就说明a的作用域只能作用于函数func1。而b属于全局名称空间,属于全局变量,因此其可被func1和func2调用。

 

global,nonlocal关键字:

  当内部作用域想修改外部作用域的变量时,要用到global,nonlocal关键字。

  global 关键字用于局部作用域修改全局作用域时在局部变量前加上global。

  nonlocal 关键字用于要修改嵌套作用域(即Enclosing,外层非全局作用域)。

1     a = 10
2     def func():
3         global a
4         a += 3
5         print(a)
6 
7     func()

这是一个很简单的使用global关键字,如果注释掉global a 这一句,程序会报错。

 

 1     def func1():
 2         n = 0
 3 
 4         def func2():
 5             nonlocal n
 6             x = n
 7             n += 1
 8             return x
 9 
10         return func2
11 
12 
13     c = func1()  
14     print(type(c))  # 可以看到c是一个函数对象
15     print(c())    # 执行c()其实就是执行func2()

这是一个简单的闭包,可以看到首先是函数func1里嵌套了一个函数func2,func2调用了func1的内部变量。如果注释掉nonlocal n的话会出错。

闭包:

  闭包就是能够读取其他函数内部变量的函数,即定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯