嵌套函数

定义

函数内部定义的函数,无法在函数外部使用内部定义的函数。

def f1():
def f2():
print('from f2')
f2() f2() # NameError: name 'f2' is not defined def f1():
def f2():
print('from f2')
f2() f1() '''
from f2
'''

名称空间的三大类(只存变量名)

  1. 内置名称空间

    • 定义:python解释器自带的方法,如:int,float,len等。类似小整数池
    • 生命周期:在python解释器启动时,就开始生效。直到python解释器关闭
  2. 全局名称空间

    • 定义:除了内置和局部的名字之外,其余都存在全局名称空间。如下面的代码x,func,z

      x = 1
      
      def func():
      pass if x > 11:
      z = 20000
      else:
      z = 555
      print(z)
    • 生命周期:在文件执行时生效,文件执行完后失效

  3. 局部名称空间

    • 定义:在函数内部的都叫局部,也就是说在函数内部定义的变量 就是局部变量。如下图的x ,f2等等

      def test_one():
      x = 1
      def max_num():
      print("from max_num")
      max_num() test_one()
    • 生命周期:在调用函数时生效,当函数执行结束后失效

名称空间加载顺序

内置名称空间 --> 全局名称空间 --> 局部名称空间

变量名的查找顺序为

局部名称空间 --> 全局名称空间 --> 内置名称空间

作用域

  1. 全局作用域

    • 定义:全局有效,全局存活,包含内置名称空间和全局名称空间.如x,test_one

      x = 1
      
      def test_one():
      print(x) test_one()
  2. 局部作用域

    • 定义:局部有效,临时存储,只包含局部名称空间。如x

      def test_one()
      x = 1
      print(x) test_one()
  • PS:当局部名称空间没有对应的变量时,系统会自动去全局名称空间查找。没有找到就会报错。

    # 第一种情况
    x = 1
    def one():
    print(x) def two():
    x = 10
    one()
    two() '''
    1
    ''' # 第二种情况
    x = 1
    def one():
    x = 10
    print(x) def two():
    x = 5
    one() two() '''
    10
    ''' '''
    总结:
    对于第一种情况,程序调用了two函数,在two函数中调用了one函数,而one函数中没有定义x变量,对于one函数而言,它属于局部名称空间,变量x既然没有定义,那么就直接去上一级找,因此x=1
    对于第二种情况,one函数中定义了x变量,因此直接使用即可,所以x=10 '''
  • 函数对象+作用域应用

  • 补充知识点

    • global关键字:修改全局作用域中的变量

      x = 1
      
      def f1():
      x = 2 def f2():
      # global x # 修改全局
      x = 3
      f2() f1()
      print(x) '''
      1
      ''' x = 1 def f1():
      x = 2 def f2():
      global x # 修改全局
      x = 3
      f2() f1()
      print(x) '''
      3
      '''
    • nonlocal关键字

      x = 1
      
      def f1():
      x = 2 def f2():
      # nonlocal x
      x = 3 f2()
      print(x) f1() '''
      2
      ''' x = 1 def f1():
      x = 2 def f2():
      nonlocal x
      x = 3 f2()
      print(x) f1() '''
      3
      '''
    • 注意

      • 在局部名称空间中想要修改全局的可变类型,不需要任何声明,可以直接修改

        lis = []
        
        def f1():
        lis.append(1) print(f"调用函数前: {lis}")
        f1()
        print(f"调用函数后: {lis}")
      • 在局部如果想要修改全局的不可变类型,需要借助global声明,声明为全局的变量,即可直接修改

python之函数名称空间,作用域,嵌套函数的更多相关文章

  1. Python记录9:函数4:名称空间作用域+闭包函数+装饰器

    ''' 一: 名称空间namespaces     名称空间就是存放名字与值绑定关系的内存空间 二: 名称空间分为三种     内置名称空间:         1. 特点: 存放是python解释器自 ...

  2. Day11名称空间,作用域,闭包函数

    Day11 1.函数对象: ①可以被引用 ​ ②可以作为另一个函数的参数 ​ ③可以作为另一个函数的返回值0 ​ ④可以被存储到容器类型中 2.函数嵌套: ①嵌套调用:在一个函数中调用了另一个函数 ​ ...

  3. Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数

    本篇目录: 一.函数嵌套 二.函数名称空间与作用域 三.函数对象 四.闭包函数 ============================================================ ...

  4. python12--字符串的比较 函数的默认值的细节 三元表达式 函数对象 名称空间 作用域 列表与字典的推导式 四则运算 函数的嵌套

     复习   1.字符串的比较; 2.函数的参数; ******实参与形参的分类: 3.函数的嵌套调用:     # 字符串的比较#  -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 ...

  5. 《Python》 函数进阶和名称空间作用域

    函数进阶: 一.动态参数:*args  **kwargs *args是元祖形式,接收除去键值对以外的所有参数 # args可以换成任意变量名,约定俗成用args **kwargs接收的只是键值对的参数 ...

  6. day 12 名称空间和闭包函数

    函数嵌套 按照函数的两个阶段分为: 嵌套调用:在一个函数内部调用另一个函数 嵌套定义:在一个函数内部定义另一个函数 名称空间(namespace):存储名字的内存区域 名称空间的分类: 内置名称空间: ...

  7. python基础——类名称空间与对象(实例)名称空间

    python基础--类名称空间与对象(实例)名称空间 1 类名称空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类的良好总属性:数据属性和函数属性 其中类 ...

  8. 【php 之根据函数名称动态调用该函数】

    解释函数:call_user_func()以及函数call_user_func_array() 对于PHP程序员而言,函数是再熟悉不过的事物了,毕竟我们整天都在和PHP内置函数以及我们自定义的函数打交 ...

  9. Python 类的名称空间和组合

    一.Python类的名称空间 class Student(object): School = '北京大学' def __init__(self): pass stu1 = Student() stu1 ...

随机推荐

  1. java用JSONObject生成json

    Json在前后台传输中,是使用最多的一种数据类型.json生成的方法有很多,自己只是很皮毛的知道点,用的时候,难免会蒙.现在整理下 第一种: import net.sf.json.JSONArray; ...

  2. zabbix4.4安装和简要设置

    简介 Zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案.它能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快速定位/解决 ...

  3. chrome 2行换行省略号 ... text-ellipse

    display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; 谷歌内部项目 ...

  4. 计算机二级-C语言-程序填空题-190115记录-fprintf()函数和fscanf()函数的使用。

    //给定程序,函数fun的功能是:将自然数1~10以及它们的平方根写到名为myflie3.txt的文本文件中,然后再顺序读出显示在屏幕上. //重难点:fprintf()函数和fscanf()函数的使 ...

  5. 用纯css实现双边框效果

    1. box-shadow:0 0 0 1px #feaa9e,0 0 0 5px #fd696f 2. border:1px solid #feaa9e; outline:5px solid #fd ...

  6. Jmeter在linux下的安装

    Apache Jmeter简介   Apache JMeter 是Apache组织的开放源代码项目,是一个100%纯Java桌面应用,用于压力测试和性能测量.它最初被设计用于Web应用测试但后来扩展到 ...

  7. Kubernetes的pod控制器之DaemonSet

    DaemonSet 顶级参数介绍 [root@master manifests]# kubectl explain ds KIND: DaemonSet VERSION: extensions/v1b ...

  8. 学习笔记——springMVC架构

    springMVC是一个MVC模式的实现,至于具体什么是MVC大佬们写了多很详细的博文给出一些链接: 链接1. SpringMVC框架“简单”执行流程 1.首先用户(或浏览器)发送请求到服务端. 2. ...

  9. win10 安装"pip install orange3" 出现LINK : fatal error LNK1158: cannot run 'rc.exe' 错误的解决办法

    解决办法: 从(本例使用的是64位的python3.6 注意:如果python的版本是32位,则使用x86:如果是64位,则使用x64;) 复制一下两个文件 rc.exe rcdll.dll 到

  10. 安装oracle11g时出现:在注册表中没有找到指定的主目录名

    我碰到这个问题,不过我没去管它.直接安装了,后来数据库实例,什么的都能安装,目前没有发现什么问题. 造成这个的原因:是卸载oracle时注册表没有彻底删除! 如果后面出现问题,再记录.