函数的命名空间

从python解释器开始执行之后,就在内存中开辟了一个空间,每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来。

但是当遇到函数定义的时候解释器只是象征性的将函数名读入内存,表示知道这个函数的存在了,至于函数内部的变量和逻辑解释器根本不关心。

等执行到函数调用的时候,python解释器会再开辟一块内存来存储这个函数里的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量会存储在新开辟出来的内存中。

函数中的变量只能在函数的内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。

  1. 全局命名空间:是在程序从上到下被执行的过程中依次加载进内存的,放置了我们设置的所有变量名

  2. 局部命名空间:函数内部定义的名字,调用函数的时候参会产生命名空间,函数执行结束命名空间消失

  3. 内置命名空间:python解释器启动即可使用,内置的名字在启动解释器的时候被加载进内存中

  1. a = 1       #属于全局命名空间
  2. def func():
  3. b = 2     # 属于局部命名空间
  4. print('abc') # 属于内置命名空间
  5.  
  6. func()
    print(a)

作用域

全局作用域:作用在全局,内置和全局命名空间中的名字属于全局作用域

局部作用域:函数内,作用在局部

local, locals, globals 关键字

local 可在局部调用全局变量,慎用

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

locals 查看局部所有变量,globals可查看全局变量

  1. a = 1
  2. def func():
  3. b = 2
  4. global a
  5. a += 1
  6. print(a)
  7. print(locals())
  8. print(globals())
  9. func()
  10.  
  11. 2
  12. {'b': 2}
  13. {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001A02E31A518>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/python学习/day10/复习.py', '__cached__': None, 'a': 2, 'func': <function func at 0x000001A02E3FB0D0>}

函数的嵌套和调用

函数的额嵌套,函数内嵌套函数。

nonlocal函数调用上一层函数变量,若没有则上上一层函数

  1. a = 1
  2. def outer():
  3. a = 2
  4. def inner():
  5.      # a = 4 * 错误的位置
  6. nonlocal a   # 若本层函数有变量,则用本层变量,本层没有调用上一层
  7. a = 4      # 相同名字的变量 a 只能定义在nonlocal下面,不能定义在上面
  8. a += 1
  9. print(a)
  10. inner()
  11. outer()
  12. 5
  13.  
  14. def outer():
  15. a = 2
  16. def inner():
  17. nonlocal a
  18. a += 1
  19. print(a)
  20. inner()
  21. outer()
  22. 3

函数名的本质

  1. 函数名就是内存地址
  2. def func1():
  3. print(123)
  4. func2 = func1 # 1.函数名可以赋值func2()
  5. l = [func1,func2] # 2.函数名可以作为容器类型的元素
  6. print(l)
  7. for i in l:
  8. i() # 内存地址加括号即可执行函数,
  9.  
  10. def func():
  11. print(123)
  12.  
  13. def wahaha(f):
  14. f()
  15. return f
  16.  
  17. wahaha(func) # 3.函数名可以作为函数的参数
  18. qqxing = wahaha()
  19. qqxing() # 4.函数名可以作为返回值

闭包

  1. # 1.嵌套函数
  2. # 2.内部函数调用外部函数的变量

  3. 最简单闭包:
    def outer():
  4. a = 1
  5. def inner():
  6. print(a)
  7. 闭包调用举例:
  8. def outer():
  9. a = "内部变量a"
  10. def inner():
  11. print(a)
  12. return inner  返回函数内存地址给outer()
  13. inn = outer()  
  14. inn()
    # 通过闭包可以将函数内部的函数,变量,调用给外部函数。
  15. # 如果反复调用函数。避免 变量 在函数内的反复生存和死亡

学到看到这里我是有点疑惑,闭包中似乎不需要nonlocal就可以调用上一层函数啊,还要nonlocal有啥用啊,

  1. def outer():
  2. a = 1
  3. def inner():
  4. nonlocal a  
  5. a += 1    
  6. print(a)
  7. inner()
  8. outer()
  9.  
  10. def outer():
  11. a = 1
  12. def inner():
  13. # nonlocal a    如果对上层变量进行修改,似乎必须地用nonlocal调用上层函数。如果不修改,则可以直接调用。
  14. # a += 1
  15. print(a)
  16. inner()
  17. outer()

day10.函数进阶的更多相关文章

  1. python全栈学习--day10(函数进阶)

    一,引言 现在我有个问题,函数里面的变量,在函数外面能直接引用么? def func1(): m = 1 print(m) print(m) #这行报的错 报错了:NameError: name 'm ...

  2. 巨蟒python全栈开发-第10天 函数进阶

    一.今日主要内容总览(重点) 1.动态传参(重点) *,** *: 形参:聚合 位置参数*=>元组 关键字**=>字典 实参:打散 列表,字符串,元组=>* 字典=>** 形参 ...

  3. python函数-函数进阶

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

  4. 深入理解javascript函数进阶系列第一篇——高阶函数

    前面的话 前面的函数系列中介绍了函数的基础用法.从本文开始,将介绍javascript函数进阶系列,本文将详细介绍高阶函数 定义 高阶函数(higher-order function)指操作函数的函数 ...

  5. 【python 3】 函数 进阶

    函数进阶 1.函数命名空间和作用域 命名空间一共分为三种: 全局命名空间 局部命名空间 内置命名空间 *内置命名空间中存放了python解释器为我们提供的名字:input , print , str ...

  6. day11.1函数进阶 列表集合 字典中的函数变量,函数作为形参

    函数进阶 1.函数作为变量 a=123 name="gao" nums=[1,2,3] data=nums#指向同一个内存地址 #查看内存地址篇章 def func(): prin ...

  7. python基础 (初识函数&函数进阶)

    函数基础部分 .什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率. 2.定义函数 定义:def 关键词开头,空格之后接函数名 ...

  8. day 10 - 1 函数进阶

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

  9. python基础之 初识函数&函数进阶

    函数基础部分 1.什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 2.定义函数 定义:def 关键词开头,空格之后接函数名 ...

随机推荐

  1. (并发编程)RLock(与死锁现象),Semaphore,Even事件,线程Queue

    一.死锁现象与递归锁所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在 ...

  2. python pip下载速度慢的解决方法

    pip是python内置的非常好用的下载工具,基本可以下载全部的python库.它还有一个非常好的特点,当你安装一个库的时候,它会自动帮你安装所有这个库的依赖库.完全一键式操作.非常方便.但是由于pi ...

  3. JMeter 中_time 函数的使用(时间戳、当前时间)

    有时在接口测试时,其参数需要为时间戳或者是日期格式的数据.针对此问题,可以使用JMeter自带的_time 函数来解决以上问题 操作步骤: 1.通过函数助手,生成一个_time 函数: 2.如果参数为 ...

  4. [C]gcc编译器的一些常用语法

    简单的GCC语法: 如果你只有一个文件(或者只有几个文件),那么就可以不写Makefile文件(当然有Makefile更加方便),用gcc直接编译就行了.在这里我们只介绍几个我经常用的几个参数,第一是 ...

  5. centos7编译安装lnmp

    1.前言 本文适合于已经对Linux操作系统具有基本操作经验,并且能够在Linux或Windows上通过一键搭建工具或者yum命令行进行环境搭建的读者,阅读本文需具有一定的专业知识,本文不建议初学者阅 ...

  6. LuoGu P2735 电网 Electric Fences

    题目传送门 这个东西,本来我是用求出两条一次函数解析式然后判断在x坐标下的y坐标值来做的 首先因为没考虑钝角三角形,WA了 然后又因为精度处理不好又WA了 一气之下,只能去网上查了查那个皮克定理 首先 ...

  7. [原著]java或者Js 代码逻辑来处理 突破 oracle sql “IN”长度的极限的问题

    注:本文出自:博主自己研究验证可行   [原著]java或者Js  代码逻辑来处理  突破 oracle  sql "IN"长度的极限的问题    在很多的时候 使用 select ...

  8. Confluence 6 禁用或者重新启用一个任务

    在默认的情况下,所有的 Confluence 计划任务都是默认启用的. 使用 启用(Disable )/ 禁用(Enable )连接操作来启用和禁用每一个计划任务. 不是所有的加护任务都可以被禁用的. ...

  9. Confluence 6 配置避免管理员联系表单垃圾

    你可以配置 Confluence 使用验证码(Captcha)来避免垃圾内容发送给 Confluence 管理员.有关管理员联系表单验证码的内容在全站验证码设置中进行配置,相关的文档请参考 Confi ...

  10. Swift 新增fileprivate 详解

    以前项目中只要用了private  那么在同一个文件同一个类中还是能访问的(比如一个类中写了一个extension) swift3.0现在不行了 新增了一个fileprivate 的访问控制 以前的p ...