可变长参数,函数的嵌套,名称空间,关键字

5.30自我总结

一.可变长参数

1.可变长形参之(*)

形参中的会将溢出的位置实参全部接收,然后存储元组的形式,然后把元组赋值给后的参数。需要注意的是:*后的参数名约定俗成为args。

def sum_self(*args):
    res = 0
    for num in args:
        res += num
    return res


res = sum_self(1, 2, 3, 4)
print(res)
#10

2.可变长实参之(*)

实参中的会将后参数的值循环取出,打散成位置实参。以后但凡碰到实参中带的,它就是位置实参,应该马上打散成位置实参去看。

def func(x, y, z, *args):
    print(x, y, z, args)


func(1, *(1, 2), 3, 4)
#1 1 2 (3,4)

3.可变长形参之(**)

形参中的会将溢出的关键字实参全部接收,然后存储字典的形式,然后把字典赋值给后的参数。需要注意的是:**后的参数名约定俗成为kwargs。

def func(**kwargw):
    print(kwargw)


func(a=5)
#{'a': 5}

4.可变长实参之(**)

实参中的会将后参数的值循环取出,打散成关键字实参。以后但凡碰到实参中带的,它就是关键字实参,应该马上打散成关键字实参去看。

def func(x, y, z, **kwargs):
    print(x, y, z, kwargs)
func(1, 3, 4, **{'a': 1, 'b': 2})
#1 3 4 {'a': 1, 'b': 2}

5.可变长参数应用

def index(name, age, sex):
    print(f"name: {name}, age: {age}, sex: {sex}")


def wrapper(*args, **kwargs):
    print(f"args: {args}")
    print(f"kwargs: {kwargs}")
    index(*args, **kwargs)


wrapper(name='nick', sex='male', age=19)

'''
args: ()
kwargs: {'name': 'nick', 'sex': 'male', 'age': 19}
name: nick, age: 19, sex: male
'''

二.关于函数的嵌套

最好返回值为函数名,不要是函数调用

#第一种
def f1():
    def f2():
        print('asdad')
    return f2
f2 = f1()
f2()
#第二种
def f1():
    def f2():
        print('asdad')
    return f2()
f1()

#最好用第一种方法运行,第二种运行可能会造成一些不必要的麻烦

函数内部的函数只能在函数内部调用,不能在函数外部调用

def f1():
    def f2():
        print('asdad')

f2() 会报错 ,f2没有定义

三.名称空间

1.内置名称空间

名称空间(name spaces):在内存管理那一章节时,我们曾说到变量的创建其实就是在内存中开辟了一个新的空间。但是我们一直在回避变量名的存储,其实在内存中有一块内存存储变量名与变量间的绑定关系的空间,而这个空间称为名称空间。

生命周期:在python启动时候,python关闭时候

2.全局名称空间

全局名称空间:除了内置和局部的名字之外,其余都存放在全局名称空间.

生命周期:在文件执行时生效,在文件执行结束后失效

3.局部名称空间

局部名称空间:用于存放函数调用期间函数体产生的名字.`

生命周期:在文件执行时函数调用期间时生效,在函数执行结束后失效

如:

x = 1                    # 其中X,f1为全局名称空间,print为内置名称空间,f2为局部名称空间

print(x) 

def f1():
    def f2():
        print('from f2')
    f2()

f1() 

关于三种名称空间的加载顺序:

内置名称空间→全局名称空间→局部名称空间

名称空间的查找顺序

x=1
def f1():
    def f2():
        x = 3 
        print(x)
    f2()
x=3
f1()
print(x)

关于查找:

如果查找的起点在局部名称空间内,他会先在局部空间他的位置开始自之下而上开始寻找,如果在局部空间内找不到,再去全局名称空间开始寻找如果还没找打他会去去内置名称空间寻找他不会去另外的局部空间进行查找

如果起点在全局名称空间,他不会去局部空间开始查找,他会去全局开始寻找,如果全局没找到他会去内置名称空间寻找.

四.关键字

1..global关键字

修改全局作用域中的变量。

x = 1


def f1():
    x = 2

    def f2():
        global x  # 修改全局
        x = 3
    f2()


f1()
print(x)
#3

2.nonlocal关键字

修改局部作用域中的变量。

x = 1


def f1():
    x = 2

    def f2():
        nonlocal x
        x = 3

    f2()
    print(x)


f1()

3.注意点

1,两个关键字必写在须在局部名称空间变量名第一次出现的上面
2.在局部想要修改全局的可变类型,不需要任何声明,可以直接修改。
3.在局部如果想要修改全局的不可变类型,需要借助global声明,声明为全局的变量,即可直接修改。
posted @ 2019-05-30 22:39  小小咸鱼YwY  阅读(708)  评论(0编辑  收藏  举报