函数和装饰器

1、名称空间,作用域,取值顺序等

名称空间:当执行函数的时候,他会在内存中开辟一个临时名称空间,存放函数体内的所有变量与值的关系,随着函数的执行完毕,临时空间自动关闭。
作用域:是程序在执行过程中变量与值得起作用范围
取值顺序:对于变量和值最先起作用是函数内,然后是全局,最后是内置

2、函数的嵌套

在程序执行中,开始只会把函数名放到内存中 ,函数在调用的时候才执行。

代码从上至下依次执行, 调用函数:函数里面从上至下依次执行。

3、内置函数global(),nonlocal()

print(globals())  # 全局名称空间:所有变量
print(locals())  # 局部名称空间:所有变量
a = 2
b = 3
def func1():
    c = 5
    d = 6
    print(globals())  # 全局变量放在一个字典中
    return locals()  # {'c': 5, 'd': 6}
print(func1())

4、关键字global,nonlocal

global:在局部空间内改变一个全局变量

nonlocal:在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。

5、函数名的应用

函数名是函数的名字,本质:变量,特殊的变量。

5.1、单独打印函数名

def func1():
    print(666)
print(func1)  # <function func1 at 0x0000000000872378>
a = 6
print(a)

5.2、函数名的赋值

def func2():
    print(666)

f = func2
print(f())

5.3、函数名可以作为容器类数据的元素

l1 = []
for i in range(1,5):
    l1.append('f'+str(i))
print(l1)

5.4函数名可以作为参数

a = 1
def f1(x):
    print(x)
f1(a)

5.5、函数名可以作为函数的返回值。

def wraaper():
    def inner():
        print(666)
    inner()
wraaper()

 

6、闭包

闭包:就是内层函数对外层函数(非全局)变量的引用。
如何判断  内层函数名.__closure__  cell 就是=闭包
name = '老男孩'
def wraaper2(n):
    #  n = '老男孩' 相当于
    def inner():
        print(n)
    inner()
    print(inner.__clo

7、装饰器初识

7.1测是一个函数执行时间(直接加函数中)

 def func1():
     print('你有病呀,领导,测试我的执行效率干甚。')

 print(time.time())  # 时间戳
 start_time = time.time()
 func1()
 time.sleep(0.3)
 end_time = time.time()
 print('此函数的执行效率%s' % (end_time - start_time))

7.2测是一个函数执行时间(写成函数)

def func1():
    print('你有病呀,领导,测试我的执行效率干甚。')

def func2():
    print('你有病呀,领导2,测试我的执行效率干甚。')
func1()

def func1():
    print('你有病呀,领导,测试我的执行效率干甚。')
func1()
def timmer(f):
    start_time = time.time()
    f()
    time.sleep(0.3)
    end_time = time.time()
    print('此函数的执行效率%s' % (end_time - start_time))

7.3测是一个函数执行时间(使用装饰器)

f1 = func1  # f1 = func1
func1 = timmer  # 新变量func1 = timmer
func1(f1)


def func2():
    print('你有病呀,领导,测试我的执行效率干甚。')
def timmer(f):  # f = func1
    def inner():
        start_time = time.time()
        f()  #  func1()
        time.sleep(0.3)
        end_time = time.time()
        print('此函数的执行效率%s' % (end_time - start_time))
    return inner
# 语法糖@

@timmer  # func1 = timmer(func1)
def func1():
    print('你有病呀,领导,测试我的执行效率干甚。')

func1 = timmer(func1)  # inner
func1()  # inner()

7.4测是一个函数执行时间(优化装饰器)

def timmer(f):  # f = func1 函数名
    def inner(*args,**kwargs):
        start_time = time.time()
        f(*args,**kwargs)
        time.sleep(0.3)
        end_time = time.time()
        print('此函数的执行效率%s' % (end_time - start_time))
    return inner

@timmer # func1 = timmer(func1) # inner
def func1(a,b):
    print(a,b)
    print('你有病呀,领导,测试我的执行效率干甚。')

@timmer
def func2(a,b,c,d):
    print(a,b,c,d)
    print('你有病呀,领导,测试我的执行效率干甚。')

func1(1,2)  # inner()
func2(2,3,4,5)
def timmer(f):  # f = func1 函数名
    def inner(*args,**kwargs):
        start_time = time.time()
        ret = f(*args,**kwargs)
        time.sleep(0.3)
        end_time = time.time()
        print('此函数的执行效率%s' % (end_time - start_time))
        return ret
    return inner


@timmer # func1 = timmer(func1) # inner
def func1(a,b):
    print(a,b)
    print('你有病呀,领导,测试我的执行效率干甚。')
    return 666

print('************',func1(1,2))
原文地址:https://www.cnblogs.com/huihuangyan/p/9119890.html