函数的动态参数与命名空间 day9

Posted 虫洞小鳗鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数的动态参数与命名空间 day9相关的知识,希望对你有一定的参考价值。

 

 

一、动态参数(不定长参数)def func(*args):

 

形参: 3种 动态参数
args元组,他包含了你所有的位置参数.

*args 动态参数,不定长参数
**kwargs 他包含了关键字动态参数

 


*rarge用法
def func(*args):
    print(args,type(args))
func(1,2,\'alex\',3,4,5,6,8,4,7,2)

结果

 

*args按位置对应不能放到,其他形参位置前边

def func(*args,a,b,c):
    print(a)
    print(b)
    print(c)
    print(args,type(args))
func(1,2,\'alex\',3,4,)

结果

正确用法

def func(a,b,c,*args):
    print(a)
    print(b)
    print(c)
    print(args,type(args))
func(1,2,\'alex\')

 结果

位置参数,*args,默认参数,**kwargs
def func(a,b,c,sex = \'\',*args):
    print(a)
    print(b)
    print(c)
    print(sex)
    print(args,type(args))
func(1,2,\'alex\',\'wusir\',\'ritian \'

结果

sex=\'男’被wusir覆盖 

def func(a,b,c,*args,sex = \'\'):
    print(a)
    print(b)
    print(c)
    print(sex)
    print(args,type(args))
func(1,2,\'alex\',\'wusir\',\'ritian \',sex=\'\')

结果

**kwargs的用法

def func(**kwargs):
    print(kwargs)
func(a = 1,b = 4,c = 3,d = 2)

 结果

 

def func(a,b,c,*args,sex = \'\',**kwargs):
    print(a)
    print(b)
    print(c)
    print(sex)
    print(args,type(args))
    print(kwargs)
func(1,2,\'alex\',\'wusir\',\'ritian \',sex = \'\',name = \'taibai\',age = 21)

结果 

*args,**kwargs万能参数

def func2(*args,**kwargs):
    #万能参数
    print(args)
    print(kwargs)
func2(1,2,3,5,name=\'alex\',age=56)

 

结果

 

 

 *rags加法计算器

def my_sum(*args):
    count = 0
    for i in args:
        count += i
    return count
print(my_sum(1,2,3,6,78))
print(sum([1,2,3]))

 

结果

 

*魔法运算:打散

def func2(*args,**kwargs):
    print(args)
    #(1,2,3)
l1 = [1,2,3,]
l2 = [1,2,3,2,3,100,2]
func2(*l2,*l1)

 

结果

 

 

 

def func3(*args,**kwargs):
    print(args)
    print(kwargs)
dic = {\'name\':\'alex\',\'age\':12}
dic2 = {\'name\':\'jin\',\'age\':22}
func3(**{\'name1\':\'alex\',\'age1\':12},**{\'name2\':\'jin\',\'age2\':22},name3 = \'wusir\')

 

结果 

 

 

def func3(*args,**kwargs):
    print(args)
    print(kwargs)
dic = {\'name\':\'alex\',\'age\':12}
dic2 = {\'name\':\'jin\',\'age\':22}
func3(**{\'name1\':\'alex\',\'age1\':12},**{\'name2\':\'jin\',\'age2\':22},name3 = \'wusir\')

 

 结果

 

 

 二、名称空间

名称空间: 

等执行到函数调用的时候,Python解释器会再开辟一块内存来储存这个函数里面的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量回储存在新开辟出来的内存中,函数中的变量只能在函数内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。我们给这个‘存放名字与值的关系’的空间起了一个名字-------命名空间。



全局名称空间:代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做

局部名称空间:在函数的运行中开辟的临时的空间
内置名称空间:内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。
name = 1
def func():
    n = 2
    print(666)
print(n)

 

结果:因为n不在全局名称空间,所以找不到。

 

加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

取值顺序:

  在局部调用:局部命名空间->全局命名空间->内置命名空间

  在全局调用:全局命名空间->内置命名空间

综上所述,在找寻变量时,从小范围,一层一层到大范围去找寻。

 

加载顺序:
内置名称空间 ---> 全局名称空间 ----> 局部名称空间(执行函数时)
取值顺序:
先从局部名称空间找----> 全局名称空间找----->内置名称空间找

 

name = \'wusir\'
def func():
    name = \'alex\'
    print(name)
func() 

 

结果:

 

 

def len(x):
    return x

print(len([1,2,3]))

 

结果

 

作用域的角度:
全局作用域 全局名称空间,内置名称空间
局部作用域 局部名称空间,

 \'wusir\'
def func():
    name = \'alex\'
    # print(name)
    print(globals())
    print(locals())
func()

print(globals())
print(locals())

 

 

 结果

 

 

 

三 函数的嵌套 

#局部找全局的函数名可以找到
def fun1():
    print(111)
def fun2():
    print(222)
    fun1()
fun2()
print(111)

 

 结果:

 

def fun2():
    print(222)
    def fun3():
        print(666)
    print(444)
    fun3()
    print(888)
print(333)
fun2()
print(555)

 

结果 

四 global(翻译:全球)全局变量与nonlocal(翻译:外地)

作用域

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

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

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

globals和locals方法

在全局调用

print(globals())
print(locals())

 

在局部调用

def func():
    a = 12
    b = 20
    print(locals())
    print(globals())

func()

 

 

global关键字,nonlocal关键字。

global:

  1,声明一个全局变量。

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

 ps:对可变数据类型(list,dict,set)可以直接引用不用通过global。

 

def func():
    global a
    a = 3
func()
print(a)


count = 1
def search():
    global count
    count = 2
search()
print(count)

 

 

global 1,声明一个全局变量
        #引用全局变量,并改变
def func():
    global a
    a = 2
    print(a)
func()
print(a)

 

结果: 

 

l1 = [1,2,3]
def func():
    l1.append(444)
func()
print(l1)

 结果

 

nonlocal:

 

  1,不能修改全局变量。

 

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

 nonlocal的用法:

a = 1
def func():
    nonlocal a
    a = 2
    print(a)
func()

  

结果:报错

 

父级函数
def func():
    name = \'wusir\'
    def inner():
        nonlocal name
        name = \'taibai\'
        print(name)
    print(name)
    inner()
    print(name)
func()

 

结果:

 

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()
10 30 30 42

 

 结果:

 

以上是关于函数的动态参数与命名空间 day9的主要内容,如果未能解决你的问题,请参考以下文章

python函数的动态传参.作用域与命名空间

函数的动态参数,命名空间

函数 / 命名空间 / 闭包

python(动态传参命名空间函数嵌套global和nonlocal关键字)

python之动态参数 *args,**kwargs和命名空间

重修课程day9(函数之有参函数)