• 10.Python初窥门径(函数进阶)


    Python(函数进阶)

    一、函数的传参(接上期)

    形参角度(一共四种,后两种)

    1. 动态参数(万能参数)*

      # 定义一个函数时,*所有的位置参数聚合到一个元组中
      def func(*args): # *args这里是一个元组
      	print(f"名门正派都有:{arg}")
      func("少林","武当","峨眉") # 名门正派都有:("少林","武当","峨眉")
      ---------------------------------
      # 定义一个函数时,**所有的关键字参数聚合到一个字典中
      def func(**kwargs): # **kwargs这里是一个字典
          print(kwargs)
      func(name="陈",age=25,hobby="跑步") # {name:"陈",age:25,hobby:"跑步"}
      ---------------------------------
      # *和**可同时使用
      def func(*args,**kwargs):
          print(args) # ('少林', '武当', '峨眉')
          print(kwargs) # {'name': '陈', 'age': 25, 'hobby': '跑步'}
      func("少林","武当","峨眉",name="陈",age=25,hobby="跑步")
      

      动态参数*特殊用法

      # 函数内*用法
      def func(*args): # *args这里是一个元组
      	print(args)
      lis1=["少林","武当","峨眉"]
      lis2=["极乐谷","魔教"]
      func(*lis1,*lis2) # ("少林","武当","峨眉","极乐谷","魔教")
      # 当函数的执行时,*iterable代表打散
      ---------------------------------
      def func(**kwargs): # **kwargs这里是一个字典
          print(kwargs)
      dic1={name:"陈",age:25,hobby:"跑步"}
      dic2={name:"王",age:27,hobby:"游戏"}
      func(**dic1,**dic2) # {name:"陈",age:25,hobby:"跑步",name:"王",age:27,hobby:"游戏"}
      # **dict代表打散,此方式只能打散字典
      
      #函数外*用法
      a,b,*c=[1,2,3,4,5,6,7]
      print(a,b,c) # 1,2,[3,4,5,6,7] 
      # 在函数外*用于处理剩余元素,以列表的形式将剩余元素整合在一起
      

      形参角度的最终顺序

      • args不能放在位置参数前面
      • args不能放在默认参数后面
      • **kwargs不能放在默认参数前面
      def func(a,b,*args,sex="man",**kwargs):
      
    2. 仅限关键字参数(了解即可)

    # 在形参中以位置参数形式存在关键字参数与**kwargs之间,但是实参必须使用关键词方式传参.
    def func(a,b,*args,sex="man",c,**kwargs):
    	print(a,b,args,sex,c,kwargs)
    func(1,2,3,4,5,c=[6,7],name="陈",age=25) 
    # 执行结果 : 1 2 (3, 4, 5) man [6, 7] {'name': '陈', 'age': 25}
    

    二、从空间角度研究函数

    1. 全局名称(命名)空间 : py文件运行时开辟的,存放的是执行的py文件(出去函数内部)的所有的变量(地址)的对应关系,整个py文件结束才会消失.
    2. 临时(局部)名称空间 : 函数执行时,在内存中临时开辟一个空间,存放的函数中的变量
    3. 内置名称空间 : 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间

    三、取值顺序加载顺序

    1. 加载顺序 : 内置名称空间>>全局名称空间>>(当函数执行时)局部名称空间
    2. 取值顺序 : 满足就近原则,单项不可逆.
      • 在全局中寻找时,全局名称空间>>内置名称空间
      • 在局部中寻找时,局部名称空间>>全局名称空间>>内置名称空间

    四、作用域与内置函数

    1. 全局作用域 : 全局名称空间+内置名称空间

    2. 局部作用域 : 局部名称空间

    3. 内置函数 : globals,locals

      • globals() # 以字典的形式返回全局作用域所有的变量对应关系

      • locals() # 以字典的形式返回当前作用域的变量的对应关系

        # 在全局作用域下打印,则他们获取的都是全局作用域的所有的内容。
        a = 2
        b = 3
        print(globals())
        print(locals())
        '''
        {'__name__': '__main__', '__doc__': None, '__package__': None,
        '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001806E50C0B8>, 
        '__spec__': None, '__annotations__': {},
        '__builtins__': <module 'builtins' (built-in)>, 
        '__file__': 'D:/lnh.python/py project/teaching_show/day09~day15/function.py',
        '__cached__': None, 'a': 2, 'b': 3}
        '''
        ---------------------------------
        # 在局部作用域中打印。
        a = 2
        b = 3
        def foo():
            c = 3
            print(globals()) # 和上面一样,还是全局作用域的内容
            print(locals()) # {'c': 3}
        foo()
        

    五、高阶函数(嵌套函数)

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

    六、关键字:global、nonlocal

    global关键字有两个作用

    1. 声明一个全局变量。

    2. 在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)。

      # global第一个功能:在局部作用域中可以更改全局作用域的变量
      count = 1
      def search():
          global count
          count = 2
      search()
      print(count) # 2
      ---------------------------------
      # global第二个功能:利用global在局部作用域也可以声明一个全局变量。
      def func():
          global a
          a = 3
      func()
      print(a) # 3
      

    nonlocal是python3中新加的功能

    1. 与global用法差不多,就是在局部作用域如果想对父级作用域的变量进行改变时,需要用到nonlocal.

    2. 不能更改全局变量。

    3. 在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。

      def add_b():
          b = 42
          def do_global():
              b = 10
              print(b)
              def dd_nonlocal():
                  nonlocal b
                  b = b + 20
                  print(b)
              dd_nonlocal()
              print(b)
          do_global()
          print(b)
      add_b()
      
  • 相关阅读:
    武汉大学数学专业考研试题参考解答
    中山大学数学专业考研试题参考解答
    北京大学数学专业考研试题参考解答汇总
    一些泛函分析题目
    人生感言
    数学分析高等代数考研试题荟萃[更新至2017年12月28日]
    数学分析高等代数考研试题荟萃[更新至2017年12月15日]
    2017-2018-1 实变函数
    2017-2018-1 点集拓扑
    Latex "Error: Extra alignment tab has been changed to cr. "
  • 原文地址:https://www.cnblogs.com/chenshuo531702820/p/11044923.html
Copyright © 2020-2023  润新知