今天是在老男孩学习的第十天,主要对函数知识做了大致的补充,内容整理如下:
函数的优点:
可读性强,复用性强。
默认参数的陷阱:
如果参数的默认参数是可变数据类型,那么每一次调用函数的时候,如果不传值则会公用资源,也就是说这个可变类型不会初始化
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 方法可以在函数中修改全局变量的值,但是只能影响到全局变量