1.命名空间
命名空间就是变量存储的位置。不同的作用域具有不同的命名空间,全局变量存储在全局命名空间中,局部变量存储在他所属函数的局部命名空间中。命名空间以字典的形式存储,可以通过locals()来查看当前作用域的命名空间,也可以在任意作用域通过globals()获取全局命名空间。
2.高阶函数
将函数作为参数,或者函数的返回值为另一个函数。
2.1闭包
在函数内部重新定义一个函数,并将内部函数作为外部函数的返回值,同时内部函数会使用到外部函数的局部变量,这种函数称之为闭包。
闭包的精髓在于 在全局作用域下我们无法直接访问访问函数的局部变量,但是可以通过内部函数去访问。通过这种编程方式,可以对一些数据起到保护作用。
例如:
def bibao():
nums=[0]
def func():
nums.append(nums[-1]+1)
return nums
return func
func = bibao()
print(func())
print(func())
print(func())
使用闭包,就是内层函数引用了外层函数的局部变量。如果只是读外层变量的值,返回的闭包函数调用一切正常,但如果是对外层变量进行修改,需要添加关键字nonlocal,否则python解释器会将其作为内部函数的局部变量。例如:
def bibao():
nums=0
def func():
nonlocal nums #如果不加这一行会报错
nums=nums+1
return nums
return func
func = bibao()
print(func())
print(func())
print(func())
2.2装饰器
有一批旧的函数,我们想对其进行类似的改造,为了满足开闭原则,不能直接修改原代码,因此可以使用装饰器对原函数进行改造。使用方式如下:
在一个函数内部新定义一个函数,内部函数就是随旧函数的改造。将旧函数作为参数传入,同时将改造后的函数作为返回值。
例如:
def decorator(func):
def new_func(*args,**kwargs):
print("执行函数{}".format(func.__name__))
return func(*args,**kwargs)
return new_func
#a=decorator(fun)
#print(a('abcd'))
@decorator
def fun(a):
str='i\'m '+a
return str
把@decorator放到函数的定义处,就对其进行了改造,可直接使用旧函数名对其进行调用。