函数命名空间

时间:2022-09-08 09:12:45

今天是在老男孩学习的第十天,主要对函数知识做了大致的补充,内容整理如下:

函数的优点:

  可读性强,复用性强。

默认参数的陷阱:

  如果参数的默认参数是可变数据类型,那么每一次调用函数的时候,如果不传值则会公用资源,也就是说这个可变类型不会初始化

def func(v,k = []):
    k.append(1)
    return k
v = 1
print(func(v))
v = 2
print(func(v))

函数命名空间如图,k的原本是空列表,但是在第一次调用后,k并没有初始化,所以在第二次的时候又加了1,第二次输出[1,1]

 

三元运算:

  变量 = True时要返回的结果 if 条件 else Falses时的结果  目的:简化代码

def fuck(s,b):
    c = s if s > b else b
    return  c

def fuck(s,b):
    if s > b:
        c = s
    else:
        c = b
    return c

这两个代码的作用是一样的  三元运算的要求:必须直接有结果,必须有if 和 else 

 

函数进阶

命名空间和作用域

函数命名空间在这段程序中,input属于内置命名空间,它是由python解释器自带的,在你打开python时就自动加载,不依赖个人。

input1 属于全局命名空间,她由用户自己定义,一般是函数或者变量,当你只有你建立后才可以使用。当关闭后随之消失。

h是在用户自己定义的函数里存在的,只有在这个函数里才可以使用叫局部命名空间。当调用该函数的时候才会创建,函数结束后就消失。要想在外使用必须重新定义。

 

全局命名空间,内置命名空间,局部命名空间的关系

函数命名空间

在局部空间中可以使用全局和内置的命名

在全局中可以使用内置的命名,不能使用局部的命名

内置中全局和内置都不能使用  (python自己编的,不能更改)

当我们在全局中定义了和内置命名空间中同名的名字时,会使用全局名字

多个自定义函数有多个独立的局部空间,相互之间不能调用

 

当我们在调用函数的时候,实际上是根据函数名找到这个函数的地址然后再执行

 

作用域:

全局作用域:里面是全局命名和内置命名

局部作用域:局部中的名字

 

全局中的变量可以拿来局部中查看,但是在局部中对全局中变量的操作不会改变全局中的数据。

s = input('>>>')
h = 0

def input1(s):
    h = 1

print(h)

函数命名空间

def max(a,b):
    return a if a>b else b

def the_max(x,y,z):  #函数的嵌套调用
    c = max(x,y)
    return max(c,z)

print(the_max(1,2,3))

函数的嵌套定义
内部函数可以使用外部函数的变量
a = 1
def outer():
    a = 1
    def inner():
        a = 2
        def inner2():
            nonlocal a  #声明了一个上面第一层局部变量
            a += 1   #不可变数据类型的修改
        inner2()
        print('##a## : ', a)
    inner()
    print('**a** : ',a)

outer()
print('全局 :',a)

nonlocal 只能用于局部变量 找上层中离当前函数最近一层的局部变量
声明了nonlocal的内部函数的变量修改会影响到 离当前函数最近一层的局部变量
对全局无效
对局部 也只是对 最近的 一层 有影响
a = 0
def outer():
    # a = 1
    def inner():
        # a = 2
        def inner2():
            nonlocal a
            print(a)
        inner2()
    inner()

# outer()

def func():
    print(123)

# func()  #函数名就是内存地址
func2 = func  #函数名可以赋值
func2()

l = [func,func2] #函数名可以作为容器类型的元素
print(l)
for i in l:
    i()

def func():
    print(123)

def wahaha(f):
    f()
    return f           #函数名可以作为函数的返回值

qqxing = wahaha(func)   # 函数名可以作为函数的参数
qqxing()

闭包

  闭包指的是在嵌套函数中,内部函数调用了外部变量。

 

nonlocal 方法只能修改上一层的局部变量如果上一层没有则继续向上找,但是如果该变量在全局变量中则不行。

global 方法可以在函数中修改全局变量的值,但是只能影响到全局变量