zoukankan      html  css  js  c++  java
  • Python基础学习笔记(10)形参 命名空间

    Python基础学习(10) 形参 命名空间

    一、今日内容大纲

    • 形参的补充内容
    • 命名空间(名称空间)
    • 高阶函数
    • 内置函数 globals 和 locals

    二、形式参数

    1. 万能参数

      有下列函数:

      def eat(a, b, c, d):
          print('我请你吃%s、%s、%s、%s' %(a, b, c, d))
      eat('烧花鸭','烧雏鸡','烧子鹅','蒸鹿尾')
      

      我们在需要扩展时,会出现需要修改函数参数的问题,可以这样修改该函数:

      def eat(a, b, c, d, e, f):
          print('我请你吃%s、%s、%s、%s' %(a, b, c, d, e, f))
      eat('烧花鸭', '烧雏鸡', '烧子鹅', '蒸鹿尾', '蒸熊掌', '蒸羊羔')
      

      我们可以意识到,面对类似问题,我们需要一种形参,可以接受所有的实参,万能参数应运而生。

      1. *args

        args 是约定俗成的名字,是 arguments 的简写,理论上可以使用 “* + 任意字符” 来表示,但一般不修改名称。它将所有位置参数聚合成一个元组,赋值给 args。

        # 函数定义时,*代表聚合,他将所有位置参数聚合成一个元组,赋值给了args
        def eat(*args):
            print('我请你吃%s、%s、%s、%s' % args)
        eat('烧花鸭','烧雏鸡','烧子鹅','蒸鹿尾')
        
        # 练习题:写一个函数:计算传入的所有数字之和
        def sum(*args):
            s = 0
            for value in args:
                s += value
            return s
        
      2. **kwargs

        同 *args 也是约定俗成的名字,是 key words arguments 的简写,接受关键字参数并将其转换成字典赋值给 kwargs 。

        def func(**kwargs):
            print(kwargs)
        func(name='alex', age=18)
        
      3. 万能参数的位置

        # *args:放在位置参数的后面,默认值参数的前面
        def func(a,b,*args,sex='男'):
            print(a,b)
            print(args)
            print(sex)
        func(2,123,4,2,5,sex='女')
        # **kwargs:放在所有参数最后
        def func(a,b,*args,sex='男',**kwargs):
            print(a,b)
            print(args)
            print(sex)
            print(kwargs)
        func(2,123,4,2,5,sex='女',name='alex',age=80)
        
    2. 仅限关键字参数(了解)

      # 下面函数的 c 只能用关键字赋值,且必须赋值
      def func(a,b,*args,sex='男',c,**kwargs):
          print(a,b)
          print(args)
          print(sex)
          print(c)
          print(kwargs)
      func(2, 123, 4, 2, 5,sex='女',name='alex',age=80,c='555')
      
    3. 形式参数的顺序

      位置参数 -> *args -> 默认参数 -> 仅限关键字参数 -> **kwargs

    4. * 及 ** 的用法

      • * 在函数的调用时,代表打散

        # *在函数的调用时,代表打散
        def func(*args, **kwargs):
            print(args)             # (1, 2, 3, 22, 33)
            print(kwargs)
        func(*[1, 2, 3],*[22, 33])                      # func(1, 2, 3, 22, 33)
        func(*'da',*'12')                               # func('d', 'a', '1', '2')
        
        # **在函数的调用时,也代表打散
        def func(*args, **kwargs):
            print(args)             
            print(kwargs)
        func({'name': '太白'}, {'age': 18})             # 字典传入args
        func(**{'name': '太白'}, **{'age': 18})         # func(name='太白', age=18) 字典传入kwargs
        

    三、命名空间(名称空间)

    1. 命名空间

      • 全局命名空间

        全局命名空间存储了每个变量与值的关系,只会记录函数的名称和内存地址,不会实际执行函数代码,只有在调用函数时才会执行。

        a = 1           # 开辟全局命名空间(整个 py 文件的命名空间)
        b = 2
        def func():
            pass
        c = 3
        
      • 局部命名空间

        调用函数会临死开辟局部(临时)命名空间(函数内部的命名空间),函数结束局部命名空间会随之消失。

        a = 1           # 开辟全局命名空间(整个 py 文件的命名空间)
        b = 2
        def func():
            f = 5
            print(f)
        c = 3
        func()         
        
      • 内置命名空间

        Python 源码提供的一些内置的函数,如print、input等等。

    2. 作用域

      • 全局作用域:内置名称空间、全部名称空间

      • 局部作用域:局部名称空间

      • 不同作用域之间的关系

        # 局部作用域可以引用全局作用据的变量,全部作用域不能引用局部作用域
        # 局部作用域不能修改全局作用域的变量
        date = 'Friday'
        def func():
            date = 666                          # 这是在局部作用域新建一个同名变量,并没有修改全部作用域的变量
            print(date)
        print(date)                             # result: Friday
        func()                                  # result: 666
        
    3. 取值顺序

      局部命名空间 -> 全局命名空间 -> 内置命名空间(按照LEGB原则)

      # LEGB即为:
      # Locals
      # Enclosing function
      # Globals
      # Builtins
      
    4. 加载顺序

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

    四、高阶函数

    # 例1:
    def func1():
        print('in func1')
        print(3)
    
    def func2():
        print('in func2')
        print(4)
    
    func1()
    print(1)
    func2()
    print(2)
    
    # result:
    # in func1
    # 3
    # 1
    # in func2
    # 4
    # 2
    
    
    # 例2:
    def func1():
        print('in func1')
        print(3)
    
    def func2():
        print('in func2')
        func1()
        print(4)
    
    print(1)
    func2()
    print(2)
    
    # result:
    # 1
    # in func2
    # in func1
    # 3
    # 4
    # 2
    
    # 例3:
    def fun2():
        print(2)
    
        def fun3():
            print(6)
    
        print(4)
        fun3()
        print(8)
    
    
    print(3)
    fun2()
    print(5)
    
    # result:
    # 3
    # 2
    # 4
    # 6
    # 8
    # 5
    

    五、内置函数

    """本文件主要研究内置函数 globals 和 locals"""
    a = 1
    b = 2
    
    
    def func():
        name = 'alex'
        age = 73
        print(locals())  # 返回的是字典,字典里面的键值对是当前作用域的所有内容
    
    
    print(globals())  # 返回的是字典,字典里面的键值对是全局作用域的所有内容
    print(locals())  # 因为当前作用域就是全局作用域,所以此时同 globals 返回的字典相同
    
    
  • 相关阅读:
    DTD
    JVM-学习笔记持续更新
    MySQL用limit代替SQL Server :top
    正则表达式&&Java文本复杂操作
    JVM核心——JVM运行和类加载全过程
    java动态编译——tools.jar问题
    java-基础
    github for windows 简单的客户端托管代码
    【javascript dom读书笔记】 第九章 CSS-DOM
    【精通css读书笔记】 第八章 布局
  • 原文地址:https://www.cnblogs.com/raygor/p/13266046.html
Copyright © 2011-2022 走看看