zoukankan      html  css  js  c++  java
  • 函数的嵌套,名称空间,以及作用域

    函数的嵌套,名称空间,以及作用域

    1、调用函数的三种形式

    def func():
        print('from func')
    func()#第一种函数名加括号
    
    
    def max_2(x,y):
        if x > y:
            return x
        else:
            return y
    res = max_2(10,3)
    print(res)#表达式去调用
    
    
    def max_2(x,y):
        if x > y:
            return x
        else:
            return y
    res = max_2(10,max(2,3))
    print(res)#函数作为参数的形式
    

    2、函数的嵌套

    def func1():
        print('from func1')
    
    def func2():
        func1()
        print('from func2')
    
    func2()
    >>>from func1
    from func2
    

    3、函数的名称空间

    • 什么是名称空间?

      名称空间就是用来存放名字的空间。

    • 名称空间的作用

      如果你想访问一个变量值,必须先访问对应的名称空间,拿到对应的内存地址的绑定关系

    • 名称空间的分类

      1、内置名称空间:

      就是python解释器一启动就可以使用的名字,比如print,len,max,input等等我们之前也并没有定义过,可以直接拿来使用的名字,这些名字就存储在内置名称空间中

      2、全局的名称空间:

      存放文件级别的名字,就是全局名称空间,是在程序从上到下被执行的过程中依次加载进内存的,放置了我们设置了所有变量名和函数名,if,while,for,内部定义的名字执行之后都存放在全局名称空间

      3、局部名称空间

      就是在函数内部定义的所有名字,注意的是当调用函数的时候,才会产生这个名称空间,随着函数执行的结束,命名空间就消失

    • 生命周期:

      1、内置名称空间

      在python解释器启动的时候生效,关闭python解释器的时候失效

      2、全局名称空间

      当你启动这个py 文件的时候生效,当前页面代码执行结束之后失效

      3、局部名称空间

      当你调用函数的时候生效,函数一旦调用完毕就失效

    • 名称空间的使用范围

      1、在局部可以全局名称,内置名称

      x = 1
      def func():
          print(x)#使用了全局名称x,以及使用了内置名称print
      
      func()
      >>>1
      

      2、在全局可以使用内置名称空间,但不可使用局部名称空间

      x = 1
      def func():
          a = 1
          print(x)#使用了全局名称x,以及使用了内置名称print
      
      func()
      print(a)#NameError: name 'a' is not defined
              #此时a已经消失了
      
      

      3、在内置不可使用局部和全局的名称

      x = 1
      def func():
          x = 2
          print(x)#使用了局部名称x
          def func1():
              x = 3#我自己有就用我自己的,没有就去找上一级,如果上一级都没去找内置,如果内置都没有那就报错
              print(x)
          func1()
      
      func()
      >>>2
      >>>3
      
      x = 1
      def func():
          x = 2
          print(x)#使用了局部名称x
          def func1():
              print(x)#我自己没有就用上一级的x=2
          func1()
      
      func()
      >>>2
      >>>2
      
      x = 1
      def func():
          print(x)
          def func1():
              print(x)#我自己没有就用上一级的,上一级也没有就再找上一级
          func1()
      
      func()
      >>>1
      >>>1
      
      
      x = 1
      
      def index(arg = x):#默认参数,此时已经将x=1赋值给arg
          print(x)
          print(arg)
      
      x = 2
      index()
      >>>2
      >>>1
      

    4、作用域的分类

    1、全局作用域

    全局可以调用的名字就存在于全局作用域

    内置名称空间+全局名称空间

    2、局部作用域

    局部可以调用的名字就存放于局部作用域

    局部名称空间

    对于不可变类型,在局部可以查看全局作用域中的变量。但是不能直接修改,

    如果想要修改,需要在程序中添加一个global变量,那么这个变量在局部的所有操作将对全局的变量有效

    x = 1
    def func():
        global x#声明此时的x就是全局变量
        x =2
        print(x)
    
    
    func()
    print(x)
    >>>2
    >>>2
    
    #在局部修改外部函数的变量
    
    def func():
        x = 1
        def func1():
            nonlocal x
            x = 3
    
        func1()
        print(x)#通过nonlocal就可以修改离他当前最近的一个外层变量的值,此时不会打印x=1,会打印x=3
    
    func()
    >>>3
    
    

    加油吧,亚峰gogogo

  • 相关阅读:
    数组与列表访问某一列的方法不同
    python 切片
    mapreduce统计数据库中的单词个数
    Call From s150/192.168.109.150 to 0.0.0.0:10020 failed on connection exception:
    message from server: "Host 'XXXX' is not allowed to connect to this MySQL server"
    Hadoop格式化namenode
    构建FP-growth算法高效发现频繁项集
    TypeError: '
    矩阵与列表取出行(左开右闭)
    2.nohup和&后台运行,进程查看及终止
  • 原文地址:https://www.cnblogs.com/yafeng666/p/11837177.html
Copyright © 2011-2022 走看看