10,*args **kwargs 函数的命名空间。

用户传入到函数中的实参数量不定时,或者是为了以后拓展,
此时要用到动态参数*args,**kwargs(万能参数。)

*args(接受的是所有的位置参数)

以元组的形式返回给函数调用者。

**kwargs(接收的是所有的关键字参数)

以字典的形式,返回给函数调用者。

**dict 将字典的键值对添加到kwargs字典中。

*可迭代对象(str,list,tuple,list,dict(key))每一个元素添加到args元组中。

 

 

print不能接受**kwargs的关键字参数。

 

# 在有多种类型的在形参接受数据的时候,位置参数必须在前面,默认参数必须在后面,关键字参数要遵循位置参数
def func2(a,b,*args,sex=''):
    print(a)
    print(b)
    print(args)
    print(sex)

func2(1,2,'f','g','s',sex='')

 

def func2(a,b,*args,sex='',age=20,**kwargs):
    print(a)
    print(b)
    print(args)
    print(sex)
    print(age)
    print(kwargs)
func2(1,2,4,5,6,7,8,x=6,y=5,name='alex')
计算传参计算出数值
def sum1(*args):
    ret = 0
    for i in args:
        ret += 1
    return ret

d = sum1(1,2,3,)
print(d)
打印出args  和kwargs的格式
def func1(*args,**kwargs):
    print(args)
    print(kwargs)
func1()
将列表,字典融合一个列表
def func1(*args,**kwargs):
    print(args)
    print(kwargs)
l1 = [1, 2, 3]
l2 = [11, 21, 32]
dic = {'name':'alex','age':18}
dicc = {'na':'ex','a':18}
func1(*l1,*l2,**dic,**dicc)

在函数的执行时,*是用来打散,**也是打散。

def func3(*args,**kwargs):
    
    print(args)
    print(kwargs)
l1 = [1, 2, 3]
l2 = [11, 21, 32]
func3(*l1,*l2)
def func3(*args,**kwargs):

    print(args)
    print(kwargs)
# l1 = [1, 2, 3]
# l2 = [11, 21, 32]
l1 = {'name':'dddd','ddff':18}
l2 = {'ne':'dd','df':1}

 

什么是命名空间?

命名空间就是,我们给在内存中存放变量与值得对应关系的空间,叫做命名空间。

命名空间一共分为三种:

1,全局命名空间

代码在运行开始,创建的存储,变量与值得关系,的空间叫做全局命名空间。

2,局部命名空间

在函数的运行中,开辟了临时的空间叫做局部命名空间。临时空间没有特殊的含义下,不能被全局变量引用。

3,内置命名空间

内置命名空间中存放了python解释器为我们提供的函数,例如:input,list,print,tuple......他们都是我们拿过来直接可用的内置函数。

 

命名空间的加载与取值顺序?

加载python文件时候,内置命名空间(程序运行前加载)——全局命名空间:从上到下加载--——局部命名空间(程序运行中,调用时候才加载)

 

取值顺序?

在局部调用:局部命名空间——全局命名空间——内置命名空间。

在全局调用:全局命名空间——内置命名空间。

取值顺序(单项):局部名称空间(函数执行时)——全局命名空间——内置命名空间

执行顺序:local——eclose——global——built-in

当程序运行时,代码从上至下一次读取,遇到变量与值,
他会在内存中开辟一个空间,存放变量与值的内存地址的对应关系。
这样存储变量与值得对应关系的空间叫做名称空间(命名空间)。
当解释器遇到函数时,他会将函数名存储在内存中,但是对于函数体莫不关心。
当函数执行时,他会通过函数名找到函数体,然后将函数体里面的变量等对应关系存放在一个
临时开辟的空间中,随着函数的结束,临时的空间关闭,这样的空间叫做临时名称空间。

 

count = 1

def func1():
print(count)
func1()
局部作用域可以对全局作用域的变量进行引用。

 

count = 1
# 函数内部如果有变量名与全局变量名相同且对此变量进行改变,
# Python 就会将你引用的那个变量视为局部定义的变量,但是局部没定义,
# 则他会报错。
# def func1():
#     count1 = count + 1
#     print(count)
# func1()
#
# def func1():
#     count = 3
#     def inner():
#         count = count + 1
#     inner()
#     print(count)
# func1()

 

作用域 global 和 nonlocal 

作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。

全局作用域:包含内置名称空间,全局名称空间,在整个文件的任意位置都能被应用,全局有效。

局部作用域:局部名称空间,只能在局部范围内生效。

global

  1声明一个全局变量。

  2在局部作用域想要对全局作用域的全局变量进行修改时,需要用到golbal(限于字符串,数字)

 

 

1,定义一个global,在局部作用域中,声明一个全局变量。
2,在局部作用域中,更改一个全局变量。

3,对于可变的数据类型,函数中如果对其进行操作,改变全局不用引用global.
global:
def func1():
    global name
    name = 'alex'
func1()
name = '老男孩'
print(name)
1,定义一个global,在局部作用域中,声明一个全局变量。
2,在局部作用域中,更改一个全局变量。
对于可变的数据类型,函数中如果对其进行操作,改变全局不用引用global.

nolocal:

不能改变一个全局变量。

在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下变量全部发生改变。

def func1():
    name = 'alex'
    print(name) #alex
    def inner():
        nonlocal name
        name = '老男孩'
        print(name)#老男孩
    inner()
    print(name) #老男孩
func1()

 

def add_b():
    b = 42
    def do_global():
        b = 10
        print(b)
        def dd_nonlocal():
            nonlocal b
            b = b + 20
            print(b)
        dd_nonlocal()
        print(b)
    do_global()
    print(b)
add_b()

 

posted @ 2018-05-10 15:30  Mr~Zhang  阅读(246)  评论(0编辑  收藏  举报