一.函数对象
函数是第一类对象:函数名指向的值可以被当做参数传递
1.函数名可以传递给变量
def func() : print("函数执行") res = func res()
2.函数名可以被当做参数传递给其他函数
def func() : print("func函数执行") def display (x): print("display函数执行") x() display(func)
3.函数名可以被当做函数的返回值
def display (): print("display函数执行") def func(): print("func函数执行") return func res = display() res()
4.函数名可以被当做容器类型的参数(在选择功能的时候可以使用这种方式,方便程序的扩展。)
def max() : print("max") def min() : print("min") def exist() : print("exist") li = [max,min,exist] for i,key in enumerate(li) : print("%s %s" %(i,key)) key()
ps:函数名的本质是一个内存地址,它可以像其他类型变量一样被使用,它唯一特殊的地方在于加上()以后可以进行方法调用。
可以被callable 的变量之后可以加( )。类和变量可以加( ).
二.函数的嵌套
函数的嵌套分为两种:嵌套定义和嵌套调用
1.函数的嵌套调用(在函数中调用了其他的函数,连自身也可以调用)
def max (x,y) : if x > y : return x else: return y print(max(max(3,2),5))
2.函数的嵌套定义(该函数可以通过传参的不同控制函数执行不同的功能,给用户把多个函数封装成一个函数)
def area (x,y,mode = 0) : def rectangle (a,b) : return x*y def triangle (a,b) : return 1/2*x*y if mode == 0 : return rectangle (x,y) elif mode == 1 : return triangle(x,y) print(area(4,5)) print(area(4,5,1))
三.名称空间
名称空间:存放的是变量名与变量值的内存地址得绑定关系的地方(必须先找到名称空间里变量名才能访问对应的变量值)
名称空间的分类
1.内置名称空间:python解释器提前给你定义好的名字(已经存放到内置名称空间中了)
2.全局名称空间:文件级别的代码
3.局部名称空间:函数体内创建的名字都属于局部名称空间
生命周期:
内置名称空间:python解释器启动就立马创建 关闭python解释器的时候内置名称空间自动销毁
全局名称空间:右键运行py文件会自动创建 py文件程序运行结束自动销毁
局部名称空间:函数被调用的时候自动创建 函数指向结束立即销毁(动态创建动态销毁)
名字的查找顺序
需要先确定你当前所在位置(大前提)
1.站在全局: 全局 >>> 内置
2.站在局部: 局部 >>> 全局 >>> 内置
函数在定义阶段查找名字的顺序就已经固定了 不会因为函数的调用位置变化而改变
x=111 def outer(): def inner(): print('from inner',x) # local variable 'x' referenced before assignment x = 66666666 return inner f=outer() f()
四.作用域
作用域就是名称空间的范围
作用域的分类:1.全局作用域 2.局部作用域
1.全局作用域:包含内置与全局名称空间的名字 特点:全局存活,全局有效
2.局部作用域:包含局部名称空间的名字 特点:临时存活,局部有效
global 在局部修改全局的不可变数据类型
x = 1 # 不可变类型 def func(): global x # 修改全局变量 而不是创建局部名称空间 x = 999 func() print(x)
nonlocal 局部修改局部不可变数据类型
def func(): x = 1 def index(): x = 2 def deep () : nonlocal x x=4 deep() print(x) index() print(x) func() # nonlocal 只能修改上一层最近一次出现相同局部变量的值
global,nonlocal: 如果想修改多个变量可以用逗号隔开