函数的动态传参, 名称空间, 嵌套, gloabal, nonlocal

一, 动态传参

 1. *args

接收到的是元组

先用位置参数进行传参, 剩下的位置参数用*args进行传参

2. **kwargs

接收到的是一个字典

先用关键字参数进行传参, 剩下的参数用**kwargs进行传参

顺序: 位置参数, *args, 默认值参数, **kwargs

def func(a, *args, b='abc, **kwargs):

    print(a, args, b, kwargs)

形参*args, **kwargs聚合

实参*lst, **dic打散

实参的打散: func(*lst, **dic) 

函数注释: 

def func(a, b):
    '''
    计算两数之和
    :param a: 第一个数
    :param b: 第二个数
    :return: 两个数的和
    '''
    return a+b
print(func.__doc__)

二. 命名空间

1. 内置命名空间

2. 全局命名空间

3. 局部命名空间

函数调用, 局部命名空间包括嵌套的函数

作用域:

全局作用域: 内置命名空间 + 全局命名空间

局部作用域: 局部命名空间

print(globals())  查看全局命名空间中的内容

print(locals())    查看当前作用域中的内容

三. 函数嵌套

def a():

    print('1')

    def b():

        print('2')

        def c():

            print('3')

        c()

    b()

a()

输出:1      2      3

global: 访问全局命名空间的变量, 并可以改变全局命名空间的变量

global a

nonlocal: 访问外层函数中最近一层的那个变量, 并可以改变那个变量

nonlocal b

不使用global或者nonlocal只能读取上一层或全局命名空间的变量, 是不会改变上一层函数或全局命名空间的变量的

猜你喜欢

转载自www.cnblogs.com/NachoLau/p/9449393.html