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

一, 动态传参

 1. *args

接收到的是元组

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

2. **kwargs

接收到的是一个字典

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

 

位置参数, *args, 默认值参数, **kwargs

形参的**kwargs后面再出现任何 位置参数 或 关键字参数 或 *args参数 都会报错, 显示语法错误

形参的*args参数 后面如果加上 位置参数 会报错, 因为位置参数接不到传参, 显示位置参数没接到传参的错误

实参的位置参数必须全部在关键字参数前

  

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

    print(a, args, b, kwargs)

 

形参*args, **kwargs聚合

实参*lst, **dic打散

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

 

def func(**kwargs):

    print(kwargs)

func(qwe='123', asd='456')

 

def func(**kwargs):

    print(kwargs)

func('qwe'='123', 'asd'='456')                      # 字符串可以作为字典的键, 但是这里会报错, 因为如果字符串要传到函数中去, 需要键是一个变量

 

函数注释: 

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只能读取上一层或全局命名空间的变量, 是不会改变上一层函数或全局命名空间的变量的

 

posted @ 2018-08-09 15:45  NachoLau  阅读(160)  评论(0编辑  收藏  举报