python 11days

python 11days

一:函数名的应用(第一对象)

1,直接打印函数名得到的是函数的内存地址 <function func1 at 0x0000000002876B70>

print(func1)

def func1():
    print(666)

结果:   空
函数名的应用

 2,函数名可以赋值运算

def func1():
    print(666)
f1 = func1
f1()
结果: 666
函数名可以赋值运

 3,函数名可以作为函数的参数

1 def func1():
2     print(666)
3 def func2(x):
4     x()
5     print(555)
6 func2(func1)
7 
8 结果:666 
9          555
View Code

4,函数名可以作为容器类数据类型的元素

def func1():
    print(666)

def func2():
    print(222)

def func3():
    print(111)
def func4():
    print(777)
l1 = [func1, func2, func3, func4]
for i in l1:
    i()
dic1 = {
    1:func1,
    2:func2,
    3:func3,
    4:func4,
}
dic1[1]()
结果:  666
       222
       111
       777
       666
View Code

5,函数名可以当做函数的返回值

def func1():
    print(666)
def func2(x):  # x = func1
    print(222)
    return x
ret = func2(func1)
ret()

结果:  222
       666
View Code

二:闭包

内层函数对外层函数非全局变量的引用就叫闭包

判断是不是闭包 函数名.__closure__

返回的None则不是闭包,返回的是cell.... 则是闭包

闭包有什么用?

当执行一个函数时,如果解释器判断此函数内部闭包存在,这样

Python就一个机制,闭包的所在的临时名称空间不会随着函数的执行完毕而消失。

def func1():
    name = '老男孩'
    def inner():
        print(name)
    inner()
    print(inner.__closure__)  # <cell at 0x000000000282A768: str object at 0x0000000002856E10>
func1()

结果:老男孩
     (<cell at 0x000002DF3B996498: str object at 0x000002DF3B972630>,)       (cecc)是闭包
View Code
def func1():
    global name
    name = '老男孩'

    def inner():
        print(name)

    inner()
    print(inner.__closure__)  # None
func1()

结果:    老男孩
         None
View Code
def func1(x):
    def inner():
        print(x)
    inner()
    print(inner.__closure__)

name = '老男孩'
func1(name)

结果:   老男孩
        (<cell at 0x0000011E14226498: str object at 0x0000011E14202630>,)   闭包
View Code
def func():
    def func1():
        name ="老男孩"
    def func2():
        nonlocal name
        name = "alex"
    def func3():
        global name
        name = "太白"
    name = "日天"

    func1()
    print(name)  # 1 日天
    func2()
    print(name)  # 2,alex
    func3()
    print(name)  # 3,alex
func()
print(name)  # 4,太白

结果:   日天
        alex
        alex
        太白
View Code

 三:装饰器

1,这个版本不太好

def login():
    time.sleep(0.3)
    print('洗洗更健康...')

def timmer():
    start_time = time.time()
    login()
    end_time = time.time()
    print('此函数的执行时间%s' % (end_time - start_time))
timmer()
  
结果:  洗洗更健康...
       此函数的执行时间0.30033349990844727
View Code

2,改变了我原来执行函数的执行方式,不好

def login():
    time.sleep(0.3)
    print('洗洗更健康...')
# login()

def register():
    time.sleep(0.4)
    print('洗洗更健康22222...')
# register()
def timmer(f):
    start_time = time.time()
    f()
    end_time = time.time()
    print('此函数的执行时间%s' % (end_time - start_time))

timmer(login)
timmer(register)

结果:    洗洗更健康...
         此函数的执行时间0.30036020278930664
         洗洗更健康22222...
         此函数的执行时间0.4000685214996338
View Code

3,虽然执行函数的方式已经无限接近于原方式,但是更麻烦了,增加了两步代码,还是需要改进。

def login():
    time.sleep(0.3)
    print('洗洗更健康...')
# login()

def timmer(f):
    start_time = time.time()
    f()
    end_time = time.time()
    print('此函数的执行时间%s' % (end_time - start_time))
#
f1 = login  # 将login函数名给了f1
login = timmer  # 将timmer函数名给了login
login(f1)  # timmer(login)

结果:
      洗洗更健康...
      此函数的执行时间0.30034470558166504
View Code

4,初级装饰器

def login():
    time.sleep(0.3)
    print('洗洗更健康...')
# login()

def timmer(f):  # f = login函数名

    def inner():
        start_time = time.time()
        f()  # login()
        end_time = time.time()
        print('此函数的执行时间%s' % (end_time - start_time))
    return inner

login = timmer(login)  # inner 此login是新变量
login()  # inner()

name = 'alex'
name = '老男孩'

结果:    洗洗更健康...
         此函数的执行时间0.30029988288879395
View Code

5,简单版装饰器:语法糖

def timmer(f):  # f = login函数名
    def inner():
        start_time = time.time()
        f()  # login()
        end_time = time.time()
        print('此函数的执行时间%s' % (end_time - start_time))
    return inner

@timmer  # login = timmer(login)  # inner 此login是新变量
def login():
    time.sleep(0.3)
    print('洗洗更健康...')
login()

@timmer  # register = timmer(register)
def register():
    time.sleep(0.2)
    print('洗洗更健康22...')

login()  # inner()

结果:    洗洗更健康...
         此函数的执行时间0.3002970218658447
         洗洗更健康...
         此函数的执行时间0.30034828186035156
View Code

6,被装饰器的函数带参数的装饰器

def timmer(f):  # f = login函数名
    def inner(*args,**kwargs):  # args (2, 3)
        start_time = time.time()
        f(*args,**kwargs)  # login() *(2, 3) 2,3
        end_time = time.time()
        print('此函数的执行时间%s' % (end_time - start_time))
    return inner

@timmer  # login = timmer(login)  # inner 此login是新变量
def login(a,b):
    print(a,b)
    time.sleep(0.3)
    print('洗洗更健康...')

login(2,3)  # inner(2,3)

@timmer  # register = timmer(register)
def register(a):
    time.sleep(0.2)
    print('洗洗更健康22...')

register(1)  # inner(1)

结果:   2 3
       洗洗更健康...
       此函数的执行时间0.30082106590270996
       洗洗更健康22...
       此函数的执行时间0.20047879219055176
View Code

7,举个列子:

def func1(x):
    x = 0
    print(x)
func1(0)

结果:  0
View Code

8,函数带返回值的装饰器(万能装饰器)

def timmer(f):  # f = login函数名
    def inner(*args,**kwargs):  # args (2, 3)
        start_time = time.time()
        ret = f(*args,**kwargs)  # login() *(2, 3) 2,3
        end_time = time.time()
        print('此函数的执行时间%s' % (end_time - start_time))
        return ret
    return inner

@timmer  # login = timmer(login)  # inner 此login是新变量
def login(a,b):
    print(a,b)
    time.sleep(0.3)
    print('洗洗更健康...')
    return 666

print(login(2,3))  # inner(2,3)

结果:  
       2 3
      洗洗更健康...
      此函数的执行时间0.30029869079589844
      666
View Code

知识点击:

装饰器功能:在不改变原函数的基础上,为原函数增加一些额外的功能,log,登录注册,等等。

def wrapper(f):
    def inner(*args,**kwargs):
        '''执行被装饰函数之前的操作'''
        ret = f(*args,**kwargs)
        """执行被装饰函数之后的操作"""
        return ret
    return inner
View Code

 

原文地址:https://www.cnblogs.com/juxiansheng/p/9025333.html