函数二函数进阶

函数进阶

  1. 动态参数(形参第三种传参方式)

    *1.1 args 动态位置参数,可将不定数目的位置参数全部接收

    从实参角度来看:定义函数时,*将所有的位置参数聚合到一个元组中,并赋值给args。

    def eat(*args): 
        print(args)
        print(f'我请你吃:{args}')
    eat('蒸羊羔','蒸熊掌','蒸鹿尾','烧花鸭','烧企鹅')
    结果:
    ('蒸羊羔', '蒸熊掌', '蒸鹿尾', '烧花鸭', '烧企鹅')
    我请你吃:('蒸羊羔', '蒸熊掌', '蒸鹿尾', '烧花鸭', '烧企鹅')
    

    **1.2 ****kwargs动态关键字参数,可将不定数目的关键字参数全部接收

    ​ 从实参角度来看:定义函数时,*将所有的关键字参数聚合成一个字典,并赋值给kwargs。

    def func(**kwargs): 
        print(kwargs)
    func(name='alex',age=84,hobby='唱跳rap篮球')
    结果:
    {'name': 'alex', 'age': 84, 'hobby': '唱跳rap篮球'}
    

    *args与**kwargs合称为万能参数

    def func(*args,**kwargs):
        print(args,kwargs)
    func(1,2,4,'fjdksal',age=84,hobby='唱跳rap篮球')
    结果:
    (1, 2, 4, 'fjdksal') {'age': 84, 'hobby': '唱跳rap篮球'}
    

    1.3 *的其他用法

    ​ 在函数中,当函数执行时*可以将参数打散

    def func(*args):
        print(args)  # (1, 2, 3,'太白', 'wusir', '景女神')
    l1 = [1, 2, 3]
    l2 = ['太白', 'wusir', '景女神']
    func(*l1,*l2)
    结果:
    (1, 2, 3, '太白', 'wusir', '景女神')
    
    def func(**kwargs):
        print(kwargs)
    func(**{'name':"alex"},**{'age': 73,'hobby': '吹'})
    结果:
    {'name': 'alex', 'age': 73, 'hobby': '吹'}
    

    ​ 在函数外可以处理剩余元素

    a,*c,b, = [1,2,3,4,5]
    #1 [2, 3, 4] 5
    

    1.4 仅限关键在参数(形参第四种传参)

    def func(a,b,*args,sex='man',c,**kwargs,):
        print(a)
        print(b)
        print(sex)
        print(c)
        print(args)
        print(kwargs)
    func(1,2,4,5,6,67,c=666,name='太白',age=18,)
    结果:
    1
    2
    man
    666
    (4, 5, 6, 67)
    {'name': '太白', 'age': 18}
    

    1.5 形参的顺序

    ​ *args不能放在位置参数前面,会使后面的位置参数接收不到值;不能放到默认参数之后,这样要接到值就要改变默认参数

    ​ **kwargs只能放在最后

    ​ 最终顺序为:位置参数,*args,默认参数,仅限关键字参数,**kwargs

  2. 空间角度研究函数

    全局名称空间: py文件运行时开辟的,存放的是执行的py文件(除去函数内部)的所有的变量与值(地址)的对应关系,整个py文件结束之后,才会消失。

    临时(局部)名称空间: 函数执行时,在内存中临时开辟的一个空间,存放的函数中的变量与值的对应关系,随着函数的结束而消失。

    内置名称空间:input,print,内置函数等。

  3. 取值顺序和加载顺序

    加载顺序:上面这三个空间,谁先加载到内存。

    内置名称空间 ----> 全局名称空间 ----> (函数执行时)临时名称空间

    取值顺序:(就近原则)

  4. 作用域

    全局作用域:全局名称空间,内置名称空间。

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

    作用于法则:

    ​ 在开始编写函数之前,所有的代码都是位于一个模块的顶层(也就是说,并不是嵌套在def之中的),所以目前使用的变量名要么是存在于模块文件本身,要么就是python内预先定义好的。函数定义了本地作用域,而模块定义了全局作用域。

    • 内嵌的模块是全局作用域。每一个内嵌模块都是一个全局作用域
    • 全局作用域的作用范围仅限于单个文件
    • 每次对函数的调用都创建了一个新的本地作用域,本地作用域实际上对应的是函数的调用
    • 函数中赋值的变量名除非声明为全局变量或非本地变量,否则均为本地变量
    • 所有其他变量名都可归纳为本地、全局或者内置的。在函数内部的尚未赋值的变量名是一个在一定范围内的(在这个def内部)的本地变量、全局(在一个模块的命名空间内部)或者内置(由python的预定义_builtin_模块提供的)变量。
  5. 内置函数

    globals 全局作用域所有的内容

    locals 当前位置的变量与值的对应关系

  6. 高阶函数

    函数的内嵌

    def fun2():
        print(2)
        def func3():
            print(6)
        print(4)
        func3()
        print(8)
    print(3)
    fun2()
    print(5)
    结果:
    3 2 4 6 8 5
    
原文地址:https://www.cnblogs.com/yaoqi17/p/11047214.html