函数的动态参数

1.动态参数:

动态参数,也叫不定长传参,就是你需要传给函数的参数很多,不定个数,那这种情况下,你就用*args,**kwargs接收,args是元祖形式,接收除去键值对以外的所有参数,kwargs接收的只是键值对的参数,并保存在字典中。

def sum(*args):
    count = 0
    for i in args:
        count +=i
    return count
print(sum(1,2,3,4,6,8,9,70))
def func(*args,**kwargs):
    print(kwargs)
func(a='caoshirong',b=123)

*的魔性用法

在函数的定义时,在*位置参数,**位置参数聚合。

在函数的调用(执行)时,在*位置参数,**位置参数打散。

l1 = [1,2,3]
l2 = [111,22,33,'alex']
def func(*args,**kwargs):
    # print(args)
    print(kwargs)
# func(*l1,*l2)
func(**{'name':'alex'},**{'sex':'boy'})

#形参的顺序

#位置参数,*args,默认参数,**kwargs.

2.名称空间,作用域,取值顺序等

全局命名空间:代码在运行伊使部命名空间:在函数运行中临时临时开辟的空间叫局部#命名空间一共分为三种:

全局命名空间

局部命名空间(临时的)

内置命名空间:内置命民中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。

#2

作用域:

全局作用域:全局名称空间,内置名称空间

局部作用域:局部名称空间(临时)

#3

取值顺序:就近原则

局部名称空间----------->全局名称空间-------------->内置名称空间(单向从小到大范围)

len = 6
def func1():
    len = 3
func1()
print(len)
def len(l):
    return l
print(len([1,2,3]))

加载顺序:

内置名称空间---------->全局名称空间(当程序执行时)----------->局部名称空间(当函数调用的时候)

#4函数嵌套

def func1():
    print(111)
def func2():
    print(222)
    func1()
    print(333)
print(666)
func2()
print(555)

#global  nonloca

#局部名称空间  对全局名称空间的变量可以引用,但是不能改变。

count = 1
def func():
    count +=1
    print(count) # local variable 'count' referenced before assignment
func()


#如果你在局部名称空间 对一个变量进行修改,那么解释器会认为你的这个变量在局部中已经定义了,

但是对于上面的列题,局部中没有定义,所以他会报错。

#global

1.在局部名称空间声明一个全局变量。

2.在局部名称空间可以对全局变量进行修改。

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

count = 1
def func():
    global count
    count +=1
    print(count)
func()
li = [1,2,3]
dic = {'a':'b'}
def change():
    li.append('a')
    dic['q'] = 'g'
    print(dic)
    print(li)
change()
print(li)
print(dic)

#nonlocal

1.子函数对父函数的变量进行修改

2.此变量不能是全局变量

#在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,

#并且引用的那层,从那层及以下此变量全部发生改变

def func1():
    count = 666
    def inner():
        print(count)
        def func2():
            nonlocal count
            count += 1
            print('func2',count)
        func2()
        print('inner',count)
    inner()
    print('func1',count)
func1()