函数
    python函数组成:
        定义语句,函数名,参数列表,代码块

    函数作用:
        将一段功能代码封装起来,便于复用.
        代码更加简洁.

    函数的分类:
        內建函数: 如,max()等
        库函数: 如,math.ceil()等

    函数的定义:
        def语句定义函数(定义后的函数才能使用)
        def functionNAME([args_list]):
            代码块
            [return value]

        函数名的规范和标识符规范相同.
        缩进约定为4个空格
        return语句可省略,但其默认返回值是None

        例:
            def fn(x):
                return x

    函数的调用:
        通过函数名来调用此函数,functionNAME([args_list])
        函数时可调用的对象,callable()函数检查此对象是否可调用

        例:
            fn(1)
参数


    形参: 函数定义时所使用的参数
    实参: 函数调用时所使用的参数
    传参: 实参根据形参的匹配规则,逐一传递给形参
    参数默认值: 定义时,在形参后跟上一个值(可变参数无默认值)
        作用:
            当实参未给足时,对没有给定的参数赋值为默认值 
            参数过多,简化函数调用


    形参有:
        位置参数、可变位置参数、可变关键字参数、keyword-only参数
    实参有:
        位置参数、关键字参数


    形参:
        位置参数,可接受一个实参,根据实参传递的顺序从左至右依次匹配
            表示方式: 参数名,例: def fn(x)

        可变位置参数,可接受任意个位置实参(包括0个),在位置参数被取完后,其余都被其接收
            表示方式: '*'号后跟参数名,例: def fn(*args)
            将一组位置参数形成一个tuple


        可变关键字参数,可接受任意个关键字实参(包括0个),在关键字参数被取完后,其余都被其接收
            表示方式: '**'号后跟参数名,例: def fn(**kwargs)
            将一组关键字参数形成一个字典

        keyword-only参数,在可变位置参数之后的普通参数,可接受一个实参,按左右顺序与实参匹配
            表示方式: 
                1.'*', 后跟普通参数
                    例: def fn(*,x,y) , x和y是keyword-only参数
                2.可变位置参数后跟普通参数
                    例: def fn(*args,x,y) , x和y是keyword-only参数


    实参:
        位置参数: 可以是集合对象,可迭代对象,可看做一个整体的单个对象.例: (1,2),{1,2},[1,2],list(range(1,3)),1
        关键字参数: name = value 格式的参数.例: 'a' = 1


    形参定义顺序规则:
        位置参数 --> 位置参数(含默认值) --> 可变位置参数 --> keyword-only参数 --> keyword-only参数(含默认值) --> 可变关键字参数
    传参顺序:
        位置参数 --> 关键字参数
    实参与形参匹配规则:
        位置实参传递时,形参从左至右依次匹配
        关键字实参传递时,形参根据关键字来匹配,跟顺序无关


    动态语言和静态语言函数定义上的区别:
        动态语言的函数的形参是没有类型的,因此在传递实参时,不会报错.
        而静态语言的函数的形参是有类型的,因此在传递实参时,会直接报错.


参数解构(实参的解构)
    解构对象
        集合类型
        可迭代对象
    解构符号*和**
    *将非字典类型的解构对象解构成位置参数
    **将字典类型的解构对象解构成关键字参数
    提取出来的实参个数要与形参个数能匹配,实参类型得匹配