定义函数 最全的写法:位置形参 默认形参 * 命名关键字形参 **
补充知识点:type hinting #添加注解说明的一种机制
def register(name,age): def register(name:str,age:int)->str print(name,age) return 'ok' register 登记注册
闭包函数: (一)函数对象 (可以把一个函数当做变量去用) 在python中函数是第一类对象,是第一等公民
def func(): # func=内存地址(凡是名字均指向内存地址) pass func() #函数名加()可以触发函数体代码的运行 func #代表函数的内存地址
1、变量可以被赋值 函数的内存地址可以被赋值 数的内存地址 def func(): # func = print('from func') #x = 10 # x = 10的内存地址 #y=x # 变量名可以被赋值 #print(id(x),id(y)) #赋值后与原来的变量指向同一内存地址 f=func #print(f) print(f is func)
2、函数的内存地址可以当做参数传给另一个函数
3、函数的内存地址可以当做函数的返回值 #def foo(f): #return f #res = foo(func) #print(res) #res()
4、函数的内存地址可以当做容器类型的元素 #l = [x,func] #print(l[0]) #print(l) #l[1]()
(二)函数嵌套 1、函数定义的嵌套 #def f1(): #x = 111 #def f2(): #print('from f2') #print(x) #print(f2) #f2() #f1() 定义在函数内部的变量和函数,只能在内部用(有封闭的效果)
2、函数调用的嵌套 def max2(x,y): if x > y: return x else: return y
def max4(a,b,c,d): res1 = max2(a,b,) res2 = max2(res1,c) res3 = max2(res2,d) return res3 用处:可以把一个大功能拆解成无数的小功能,实现小功能可能只需少量代码,再在大功能中把小功能依次调用即可(一种编程套路)
(三)名称空间 存放名字与其对应内存地址的地方 分为三大类 内置名称空间 存放的是python解释器自带的名字 print(len) #build in print(input) #build in 生命周期:解释器启动则产生,解释器关闭则销毁
全局名称空间 只要在顶级定义的名字都叫全局 py程序刚开始运行则立即产生 py程序结束则全局名称空间结束 #if True: #y = 2 #def foo(): #z = 3 局部名称空间 存放的是函数内的名字 生命周期:函数调用则产生,函数调用结束则销毁
存在访问的优先级 从当前优先级向上找 L(肚子里)E(外层函数) G B 总结 1.名字访问优先级: L->E->G->B 基于自己当前所在位置一层一层向外查找 2.名称空间的嵌套关系是函数定义阶段、扫描语法时生成的,与调用位置无关
(四)作用域 1、全局作用域:内置名称空间、全局名称空间(全局存活,全局有效) 2、局部作用域:局部名称空间(临时存活)
globals() #用来在局部修改全局中不可变类型变量 案例一 dic={"username":None} #定义的变量是可变类型 def log(): dic=123 #局部定义对全局无影响 dic['username']='egon' log() print(dic) 案例二 x=100 def log(): global x #声明x变量是全局变量 x=200 log() print(x)
nonlocal() #用来在局部改外层级别中不可变类型变量 def f1(): x = 100 def f2(): nonlocal x x = 200 f2() print(x) f1()
查看更多关于函数-对象、嵌套、名称空间与作用域的详细内容...