• 函数的命名空间及作用域


    一、函数的定义:

     1.空函数:可以快速帮助你构建项目框架 使项目架构清晰明了
                应用频率非常高

    #  购物车的功能,梳理整体的大框架,在依次分布实行各个功能模块
    
    def register():#商品
            pass
    def login():
          pass
    def shopping(): #购物
         pass
    def pay():
        pass
    def fun():
        pass
                
       

    2.无参函数:

      def   func():

        print('from func')

    3:有参函数:

    def func(x,y,*arg,*kwargs):
          pass
        

     二、命名关键字参数:在函数定义阶段 写在*与**可变长参数之间的形参

      强调:1、在给命名关键字参数传值的时候 只能用关键字为其传值

         2、在**args和**kwargs 是命名关键字参数 不是默认值参数和位置参数

    def func(x,y,*arges,z=9,m,**kwargs):
        print(x,y)
        print(arges)
        print(z,m)
        print(kwargs)
    func(3,5,51,78,78,12,89,10,30,7,9,12,z=78,m=89,l=78,p=56)

    关于*rags和*kwards:

      函数可以接收调用者传入的任意个数的参数
        def func(*args,**kwargs):
            print(args) #   按位置传值多余的参数都由args统一接收,保存成一个元组的形式
            print(kwargs) #  **之后的变量名一字典的形式返回

    三、函数对象:

     1、函数是一类对象:函数名指向的值可以被当作参数传递 

    def func():
        print('from func')
    print(id(func))
    f=func
    func()
    print(f)
    f()  #其实指向的也是函数func指向函数体代码的内存地址

    2.函数名可以被当做参数传递给其他函数

    def func():
        print('from func')
    def index(args):
        print(args)
        args()      #函数名被当做关键字来传参
        print('from func ')
    index(func)

    3.函数名可以被当做函数的返回值

    def index():
        print('index')
    
    
    def func():
        print('func')
        return index
    res = func()  #函数名被当做函数的返回值
    print(res)
    res()

    4.函数名可以被当做容器类型的参数

    def func():
         print('func')
     print(func())
     l = [1,2,func,func()]  # [1,2,<function func at 0x000001F7D79899D8>,None]
     print(l)

    四、函数的嵌套调用

       在函数内部调用其他函数
       作用:可以将复杂的逻辑简单化

    def index():
        print('index')
    def func():
        print('func')
        return index
    res=func()  #函数的嵌套调用,只要被定义后可以在任何地方调用
    print(res)
    res()

      

                                                            # 被调用后先执行函数内的函数体,没有就网上找,没有就全局找

    比较四个值的大小:

    def my_max(x,y):
        if x>y:
            return x
        return y
    def my_max4(a,b,c,d):
        res1=my_max(a,b)
        res2=my_max(res1,c)
        res3=my_max(res2,d)
        return res3
    print(my_max4(-45,58,9,93))

    五、名称空间:(解释:存放的是变量名与变量值的内存地址得绑定关系的地方)

    username='jason'(函数命名的空间,username指向jason指向的内存空间地址,而username在外部也有自己的空间)

      

    代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间,在函数的运行中开辟的临时的空间叫做局部命名空间

    命名空间的本质:存放名字与值的绑定关系

    命名空间一共分为三种:

      全局命名空间   # 创建函数名之前定义的变量名与值的关系,一般放在函数体的开端

      局部命名空间   # 在函数运行中也就是函数体内命名的函数叫局部空间

      内置命名空间   # 内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...

     1.全局名称空间:文件级别的代码

            x = 1
    
                    if 1 ==1 :
                        y = 2
                    
                    print(y)
                    while True:   
     x,y,z都会放到全局名称空间
                    if for while 无论嵌套多少层 它们内部所创建的名字都是全局名称空间的 z
    = 3

    2、局部名称空间:函数体内创建的名字都属于局部名称空间

    def outer():
        x = 1    ##局部名称
        print('outer')
        def inner():
            print('inner')
        # print(inner)
        return inner
    
    res = outer()
    # print(res)
    res()

    3.内置名称空间:python解释器提前给你定义好的名字(已经存放到内置名称空间中了)
                    len
                    max
                    min

      
        生命周期:

     
            内置名称空间:只要python解释器已启动立马创建   关闭python解释器的时候内置名称空间自动销毁
            全局名称空间:只要你右键运行py文件会自动创建   py文件程序运行结束自动销毁
            局部名称空间:函数被调用的时候自动创建  函数指向结束立即销毁(动态创建动态销毁)

    三种命名空间之间的加载与取值顺序:

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

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

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

    小范围的可以用大范围的
    但是大范围的不能用小范围的
    范围从大到小

    在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的
    如果在小范围内没有,就用上一级的,上一级没有就用上上一级的,以此类推。
    如果都没有,报错

    x = 111
     def f1():
         x = 222
        def f2():
            x = 333
            def f3():
                 # x = 444
                 def f4():
                     # x = 555
                     print(x)
                 x = 777  # 纯粹为了教学演示
                 f4()
             x = 777  # 纯粹为了教学演示
         f3()
        f2()
     f1()
      
    函数在定义阶段查找名字的顺序就已经固定了 不会因为函数的调用位置变化而改变
        
    def func():
        x=1
        def index():
            print(x)
        return index
    res=func()
    x=963
    res()
    嵌套例子

    作用域

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

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

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

  • 相关阅读:
    PHP 命令行参数解析工具类
    【日本软件外包】设计书中常用到的文型
    php沙盒测试 http://sandbox.onlinephpfunctions.com/ SQL语句格式化 https://www-atl.blog.so-net.ne.jp/2015-02-08
    intra-mart
    maven安装和eclipse集成
    MyEclipse破解
    pdf 中画虚线
    方法名同类名相同如果没有__construct,会被当做构造函数。
    ESA2GJK1DH1K微信小程序篇: 源码使用注意事项和程序优化
    GPRS(Air202) Lua开发: OLED显示二维码,信号强度,电池电量
  • 原文地址:https://www.cnblogs.com/Gaimo/p/11163954.html
Copyright © 2020-2023  润新知