函数的进阶

 

一、动态参数

当我们在定义函数时,不确定接受的参数个数,就需要引入动态参数。

动态参数包括动态位置参数和动态默认参数如下:

def func(a,b,*args,c=0,d=5,**kwargs):
    print(a,b)
    print(args)
    print(c,d)
    print(kwargs)
func(1,2,3,5,4,2,25,q=8,m=11,w=22,e=33)

动态位置参数用 “ * args ” 做参数名,动态默认参数用“ ** kwargs ” 。通常在不明确接受参数数量时使用动态参数,且优先顺序为位置 > 动态位置 > 默认参数 > 动态默认参数

动态位置参数返回的是元组的形式;动态默认参数返回的是字典的形式

*在实参调用的时候 *将可迭代的对象打散,字典是将键取出;** 将字典打散成 关键字参数(键=值)

*在形参调用的时候 *就是将元素聚合;**   就是将关键字参数聚合成一个字典

*args,**kwargs 可以修改,但是不建议修改

 

 

二、函数的注释

函数的注释使用  “““  注释 ””” 的方式,查看某函数的注释:函数名.__doc__如下:

 

def aaa(user,pwd):
    """
    登录函数
    :param user: 用户名
    :param pwd: 密码
    :return: 校验后的账号和密码
    """
    print(111)

print(aaa.__doc__)

 

三、名称空间

名称空间分三种:内置空间、全局空间和局部空间。

内置空间:pyhon安装包里集成的代码

全局空间:当前的py文件

局部空间:函数中的代码

 

名称空间的加载顺序:内置空间  --->  全局空间  --->  局部空间

取值顺序:局部空间  --->  全局空间  --->  内置空间(找不到就报错)

 

作用域分全局作用域和局部作用域:全局作用域包括内置空间与全局空间;而局部作用域就是函数体。

 

四、函数的嵌套与互相调用

1、在函数func内

def func():
    print(3)
    def f():
        print(1)
    print(2)
    f()
func()

2、多个独立函数调用

def func2():
    print(1)
    log()

def func1():
    print(3)

def log():
    func1()
    print(6)
    def fun():
        print(7)

3、一个函数体内相互调用

def func():
    a = 1
    def log():
        a = 5  # a = 15
        def info():
            nonlocal a # 声明修改log函数下边的变量a
            a += 10   # a = a + 10  a = 15
            print(a)  # 15
        info()
        print(a)  # 15
    log()
    print(a)  # 1
func()

 

 

五、global与nonlocal

global : 在局部修改全部变量,如果没有就创建一个新的

nonlocal : 在局部空间内,修改离自己最近的变量,如果上一层没有就继续向上找,直到找到局部变量的顶层,局部空间内没有可以修改的变量,就报错