函数-对象、嵌套、名称空间与作用域

定义函数
最全的写法:位置形参 默认形参 * 命名关键字形参 **

补充知识点: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()

猜你喜欢

转载自blog.51cto.com/15129993/2676367
今日推荐