函数的动态参数:对于传入的实参数量不固定,万能参数,动态参数,*args,**kwargs

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

  在函数调用的时候打散,在*位置参数打散

l1 = [1, 2, 3, 4]
l2 = [a, b, c, 'alex']
def funcl(*args):
    print(args)
funcl(*l1,*l2)

 形参的位置参数:

位置参数,*args,默认参数,**kwargs顺序不能错乱,会报错

def funcl(a,b,*args,sex='男',**kwargs)
    print(a,b)
    print(sex)
    print(*args)
    print(**kwargs)
funcl(10,20,34,55,6,77,87,45,sex='nv',name='alex',age=10)

  python中名称空间分为三种:

全局名称空间:所定义的值会在内存里开辟出一个空间,这个空间是存放着值跟变量的id

count = 0
def funcl():
    count += 1
print(count)
funcl()
#显示报错信息:UnboundLocalError: local variable 'count' referenced before assignment 

因为count=0是在全局名称空间中的,而局部名称空间只能引用,不能修改,而count+=1则是把count的值修改了

局部名称空间:所定义的函数,虽然系统会开辟出一个空间,但仅仅是存放这个函数的整体的,至于函数内部,系统并不关心,只有在调用时才会临时开辟出一个空间,当函数结束时,所开辟的空间也会一并消失

def funcl():
    count = 3
    print(count)
funcl()

  此时count输出的是3,而如果print放在函数外面,将会报错,并提示count没有被定义

def funcl():
    count = 3
funcl()
print(count)

  内置名称空间:对于内置函数来说,len,print....本身的出现就会在系统里开辟了空间

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

全局作用域分为:全局名称空间,内置名称空间,整个文件的任意位置都可以被引用,全局有效

局部作用域:局部作用空间,只能在局部范围内引用

取值顺序:局部名称空间  ------->全局名称空间----->内置名称空间      单向从小到大范围

加载顺序:内置名称空间---->全局名称空间(当程序执行时)------>内置名称空间(当函数被调用时)

global:

1,在局部名称空间中声明一个全局变量

def func1():
    global name
    name = 'alex'
func1()
print(name)

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

count = 0
def funcl():
    global count
    count += 1
funcl()
print(count)

 nonlocal:不能修改全局变量,在局部作用域中,对父级作用域的变量,进行引用或修改,并且修改的那层,从哪层及以下的变量全部发生改变

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()
 posted on 2018-08-16 20:10  beriuta  阅读(109)  评论(0编辑  收藏  举报