一、命名空间

1、定义

  名称到对象的映射。命名空间是一个字典的实现,键为变量名,值是变量对应的值。各个命名空间是独立没有关系的,一个命名空间中不能有重名,但是不同的命名空间可以重名而没有任何影响。

2、命名空间的分类

  1)、全局命名空间( Global):每个模块加载执行时创建的,记录了模块中定义的变量,包括模块中定义的函数、类、其他导入的模块、模块级的变量与常量。

  2)、局部命名空间(Local):每个函数所拥有的命名空间,记录了函数中定义的所有变量,包括函数的入参、内部定义的局部变量。

  3)、python内置命名空间(Built-in):任何模块均可以访问,放着内置的函数和异常(比如:input,print,str,list,tuple...)。

3、生命周期

3.1、加载顺序

  内置命名空间(程序运行前加载)-->全局命名空间(程序运行中:从上到下加载)-->局部命名空间(程序运行中:调用时才加载)

3.2、取值顺序

  在局部调用:局部命名空间-->全局命名空间-->内置命名空间

  在全局调用:全局命名空间-->内置命名空间

综上所述,在寻找变量时,从小范围,一层一层到大范围去找寻。

4、作用域

4.1、定义 

  作用域是针对变量而言,指申明的变量在程序里的可应用范围。或者称为变量的可见性。

4.2、分类

  按照生效范围可以分为全局作用域和局部作用域。

  1)、全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效

  2)、局部作用域:局部名称空间,只能在局部范围生效

4.3、两个常用的内置函数

  locals() 和globals(),它们提供了基于字典的访问局部和全局变量的方式。

  1)、locals():函数会以字典类型返回当前位置的全部局部变量。

  2)、globals():函数会以字典类型返回当前位置的全部全局变量。

#在全局作用域内
print(globals())
print(locals())
#输出结果:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000018DA3453FD0>, '__spec__': None, '__annotations__': {},'__builtins__': <module 'builtins' (built-in)>, '__file__': 'd:/python10/day10/homework.py', '__cached__': None}
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000018DA3453FD0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'd:/python10/day10/homework.py', '__cached__': None}

#在函数局部作用域内
name = 'wusir'
def func():name = 'alex'print(globals())print(locals())     #{'name': 'alex'}
func()
#输出结果:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002397E843FD0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'd:/python10/day10/homework.py', '__cached__': None, 'name': 'wusir', 'func': <function func at 0x000002397CA62E18>}
{'name': 'alex'}

5、关键字(global 与 nonlocal) 

5.1、global的作用

  1)、声明一个全局变量

  2)、在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)

def func():global aa = 2print(a)    #2
func()
print(a)        #2
#输出结果
2   2

注意:对可变数据类型(list,dict,set)可以直接引用不用通过global(以下是实例)

li = [1,2,3]
dic = {'a':'b'}
def change():li.append('a')dic['q'] = 'g'print(dic)      #{'a': 'b', 'q': 'g'}print(li)       #[1, 2, 3, 'a']
change()
print(li)           #[1, 2, 3, 'a']
print(dic)          #{'a': 'b', 'q': 'g'}
#输出结果
{'a': 'b', 'q': 'g'}
[1, 2, 3, 'a']
[1, 2, 3, 'a']
{'a': 'b', 'q': 'g'}

5.2、nonlocal的作用

  1)、不能修改全局变量

  2)、在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变

def add_b():b = 42def do_global():b = 10print(b)            #10def dd_nonlocal():nonlocal bb = b + 20print(b)        #30
        dd_nonlocal()print(b)            #30
    do_global()print(b)                #42
add_b()
#输出结果
10 30 30 42

二、函数的嵌套

def fun1():print(111)def fun2():print(222)fun1()
fun2()
#输出结果
222
111

函数的作用域链:小范围作用域可以使用大范围的变量,但是反之不行,它是单向的。

print(111)          #执行顺序--1
def fun2():print(222)      #执行顺序--3def fun3():print(666)  #执行顺序--5print(444)      #执行顺序--4
    fun3()print(888)      #执行顺序--6
print(333)          #执行顺序--2
fun2()
print(555)          #执行顺序--7
#输出结果
111 333 222 444 666 888 555

转载于:https://www.cnblogs.com/lioushell/p/8399497.html

Python函数之进阶相关推荐

  1. 020:Python函数使用进阶

    关键字参数 下面是一个判断传入的三条边长能否构成三角形的函数,在调用函数传入参数时,可以指定参数名,也可以不指定参数名,代码如下所示. def can_form_triangle(a, b, c):p ...

  2. python函数-函数进阶

    python函数-函数进阶 一.命名空间和作用域 1.命名空间 内置命名空间 -- python解释器 就是python解释器一启动就可以使用的名字存储在内置命名空间中 内置的名字在启动解释器的时候被 ...

  3. Python的零基础超详细讲解(第十二天)-Python函数及使用

    基础篇往期文章: Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博 ...

  4. python 装饰器 参数-python函数装饰器之带参数的函数和带参数的装饰器用法示例...

    本文实例讲述了python函数装饰器之带参数的函数和带参数的装饰器用法.分享给大家供大家参考,具体如下: 1. 函数带多个参数 # 普通的装饰器, 打印函数的运行时间 def decrator(fun ...

  5. python装饰器函数-Python函数装饰器常见使用方法实例详解

    本文实例讲述了Python函数装饰器常见使用方法.分享给大家供大家参考,具体如下: 一.装饰器 首先,我们要了解到什么是开放封闭式原则? 软件一旦上线后,对修改源代码是封闭的,对功能的扩张是开放的,所 ...

  6. 【Python基础】Python 函数使用总结

    我的施工之路 目前已完成,以下五期Python专题总结: 1我的施工计划 2数字专题 3字符串专题 4列表专题 5流程控制专题 6编程风格专题 今天是Python函数专题,目录结构: Python 函 ...

  7. python函数和方法概念_第48p,什么是函数?,Python中函数的定义

    大家好,我是杨数Tos,这是<从零基础到大神>系列课程的第48篇文章,第三阶段的课程:Python进阶知识:详细讲解Python中的函数(一)====> 函数概念介绍(上篇). 函数 ...

  8. Python(21)--变量进阶

    变量的进阶使用 1变量引用 2可变.不可变数据类型 3局部变量和全局变量 4.Tips 本系列博文来自学习<Python基础视频教程>笔记整理,视屏教程连接地址:http://yun.it ...

  9. Python 函数3000字使用总结

    今天是Python函数专题,目录结构: 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加高深 ...

最新文章

  1. C# Create Access File
  2. 17、任务十六——事件委托机制、简单表单验证
  3. OS / Linux / epoll 各种事件解析
  4. Android开发之assets目录下资源使用总结
  5. spring-data-jpa 使用
  6. android listview countdowntimer,Android-ListView中的CountDownTimer随机闪烁
  7. Qt creator5.7 OpenCV249之中值滤波(含源码下载)
  8. Anroid View事件响应机制和ViewGroup的事件响应分发机制
  9. JAVA学习之旅番外篇
  10. 互联网公司面试必问的mysql题目(上)
  11. Linux学习总结(二十九)系统日志
  12. median _matlab 中值滤波函数
  13. Liang Yichen
  14. 【iOS开发】—— SDWebImage源码学习(未完)
  15. openlayers4+中台风路径播放优化
  16. echart 三维可视化地图_实测三个工具后,我终于找到了地图可视化的神器
  17. JAVA的if结构单分支结构简单易懂
  18. JVM: java虚拟机
  19. 难复制薇娅李佳琦,如涵的网红牌何时能在资本市场出奇制胜?
  20. tekton EventListener资源

热门文章

  1. 【王道操作系统笔记】进程定义组成组织方式特征
  2. 蓝桥杯:BFS解决问题总结(九宫重排,跳蚱蜢,卡片交换)
  3. 最简单的视频编码器:基于libx264(编码YUV为H.264)
  4. Struts2 中 Session 的使用
  5. 超边际分析不能用计算机,一种基于超边际分析的分布式计算资源分配方法-Journalof.PDF...
  6. 数据结构折半查找例题_山东2011专升本计算机专业数据结构练习题 - 图文
  7. Linux下安装MySQL8
  8. IE8的的文本模式怎么固定
  9. 能源36号文解读_电机暴露细节!春风发布新能源品牌:ZEEHO极核
  10. 【代码源 Div1 - 105】#451. Dis(倍增求LCA)