• 330 函数名的应用 , 闭包, 装饰器初始


    一、函数名的应用

    函数名是函数的名字,本质上是个变量,特殊的变量

    函数名由:函数+()组成

    函数()  执行函数

    1,单独打印函数名,返回的是函数的内存地址。

    2函数名的赋值

    def func1():
        print(666)
    f=func1
    f()# f=666

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

    def f1():
        print(666)
    def f2():
        print(662)
    def f3():
        print(646)        
    def f4():
        print(466)
    li=[f1,f2,f3,f4]  #函数名作为列表的元素,是一个变量名。
    for i in li:
        i()

    4,函数名可以作为参数

    def f1():
        print(666)
    def f2(x):
            x()
    f2(f1)

    5,函数名可以作为函数的返回值

    def f1(x):
        return x
    ret=f1(5)  
    print(ret)

    二、闭包

    闭包:内层函数对外层函数(非全局)变量的引用

    如何判断:内层函数名.—closure—  cell就是闭包

    def wrapper():
        a =666
        def inner():
            print(a)   #inner引用外层wrapper的变量a=666
        inner()
        print(inner.__closure__)
    wrapper()
    #666
    (<cell at 0x005910D0: int object at 0x001FED90>,)
    闭包:当函数开始执行时,如果遇到了闭包,他有一个机制,
    他会永远开辟一个内存空间,将必包中的变量等值放入其中,不会随着函数的执行完毕而消失。
    name='老男孩'
    def wrapper(n):
    #n=老男孩
    def inner(): print(n) inner() print(inner.__closure__) wrapper(name)
    #老男孩
    (<cell at 0x00476410: str object at 0x0046DBB8>,)

    三、装饰器初识

    在不改变原函数的执行的情况下,为原函数增加额外的功能。

    import
    time def func1(): 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) func1 = timmer(func1) # inner func1() # inner()

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

    import time
    def timer(func):
        def inner(*args,**kwargs):
            start = time.time()
            re = func(*args,**kwargs)
            print(time.time() - start)
            return re
        return inner
    
    @timer   #==> func1 = timer(func1)
    def func1(a,b):
        print('in func1')
    
    @timer   #==> func2 = timer(func2)
    def func2(a):
        print('in func2 and get a:%s'%(a))
        return 'fun2 over'
    
    func1('aaaaaa','bbbbbb')
    print(func2('aaaaaa'))

     装饰器模板

    def wrapper(f):
        def inner(*args,**kwargs):
            '''执行函数之前的相关操作'''
            ret = f(*args,**kwargs)
            '''执行函数之后的相关操作'''
            return ret
        return inner
  • 相关阅读:
    gitlab文件夹的权限不要随便给777
    记python版本管理--pyenv
    centos7上基于kubernetes的docker集群管理
    centos下修改docker连接docker_host默认方式为tls方式
    微信公众帐号开发之一(java)
    java抓取12306火车余票信息
    对Word2Vec的理解
    软件工程课程助教总结
    2017面向对象程序设计(Java)第十七周助教工作总结
    2017面向对象程序设计(Java)第十三周助教工作总结
  • 原文地址:https://www.cnblogs.com/Mr-Murray/p/8682264.html
Copyright © 2020-2023  润新知