• 目录:

    • 闭包函数简介

    • 闭包函数的实际应用

    • 装饰器简介

    • 装饰器初期-完整版

    • 装饰器语法糖
  • 闭包函数简介

1.定义在函数内部的函数(函数的嵌套)

2.内部函数运用外部函数局部名称空间中的变量名

注:函数名还可以当做函数的返回值
  如何接收返回值(统一语法):变量名 = 函数()
  函数名也可以被用来多次赋值

def func(username):
# username = 'jason'
def name():
print(username)
return name
res = func('jason')
print(res)
res()
  • 闭包函数的实际应用

  • 1.给函数体代码传值方式

    1.1 通过形参传值:在函数定义时定义形参,调用时临时绑定形参与实参完成传值
    def func(username):
    print(username)
    func('jason') # jason
    1.2 通过闭包函数传值:通过返回值内部函数函数名,通过接收返回值完成传值
    def func(username):
    def name():
    print(username)
    return name
    res = func('jason')
    res() # jason
    res1 = func('kevin')
    res1() # kevin
  • 装饰器简介

  • 1.本质:不改变'内部代码'及'调用方式'添加新功能

  • 2.原则:对修改封闭,对扩展开放

  • 3.扩展知识:时间戳

    3.1时间戳:截至目前至1970年1月1日0时0分0秒的秒数
    import time
    print(time.time()) # 1657008257.5792694
    3.2可以统计代码运行的时间(打印0-1000所需秒数)
    import time
    start_time = time.time()
    for i in range(0, 1000):
    print(i)
    end_time = time.time()
    print('%s'%(end_time-start_time)) # 0.027039527893066406
    3.3睡眠时间 time.sleep(2)括号里的数字代表几秒
    import time
    time.sleep(2)
    print('快睡着了')
  • 装饰器初期-完整版

  • 1.装饰器初期

    1.1 缺陷:如果有多个func函数统计执行时间,则需要多次写代码(统计func函数的执行时间)
    import time
    def func():
    time.sleep(2)
    print('快睡着了')
    start_time = time.time()
    func()
    end_time = time.time()
    print(end_time-start_time) # 2.002647638320923
    1.2 缺陷:只能统计func函数的执行时间,不能统计其他函数(将多次需要写的代码封装成函数)
    import time
    def func():
    time.sleep(2)
    print('快睡着了')
    def get_time():
    start_time = time.time()
    func()
    end_time = time.time()
    print(end_time-start_time)
    get_time() # 2.0140273571014404
    get_time() # 2.008859157562256
    1.3 定义的函数存在形参,调用时必须传实参(可以统计多个函数的执行时间)
    import time
    def func():
    time.sleep(2)
    print('快睡着了')
    def username():
    time.sleep(2)
    print('他的名字是kevin')
    def get_time(xxx):
    start_time = time.time()
    xxx()
    end_time = time.time()
    print(end_time-start_time)
    get_time(func) # 快睡着了 2.005340099334717
    get_time(username) # 他的名字是kevin 2.0011959075927734
    注:暂无法解决
    import time
    def func1(a):
    time.sleep(2)
    print('我是存在形参的a')
    def get_time(xxx):
    start_time = time.time()
    xxx(*args, **kwargs) # 暂无法解决
    end_time = time.time()
    print(end_time-start_time)
    get_time(func)
    get_time(username)
    get_time(func1)
    1.4 缺陷:调用函数名发生变化(解决办法:装饰器)
    # 传值方式-参数传值不能改变调用函数方式
    import time
    def get_time(xxx):
    start_time = time.time()
    xxx()
    end_time = time.time()
    print(end_time-start_time)
    get_time(func)
    get_time(username)
    # 传值方式-闭包函数(缺陷:只能计算func函数执行时间)
    def func2():
    xxx = func
    def get_time():
    start_time = time.time()
    xxx()
    end_time = time.time()
    print(end_time-start_time)
    return get_time
    res = func2()
    res() # 快睡着了 2.0147109031677246
    1.5 所有函数执行时间(可以统计多个函数执行时间、不改变调用函数名,使用闭包函数)
    import time
    def func():
    time.sleep(2)
    print('快睡着了')
    def username():
    time.sleep(2)
    print('他的名字是kevin')
    def func2(xxx):
    # xxx = func
    def get_time():
    start_time = time.time()
    xxx()
    end_time = time.time()
    print(end_time-start_time)
    return get_time
    func = func2(func)
    func() # 快睡着了 2.0079562664031982
    username = func2(username)
    username() # 他的名字是kevin 2.001535177230835
  • 2.装饰器优化版本(可以统计多个函数执行时间、并且有参无参都可以使用,不改变调用函数名,使用闭包函数)

    import time
    def func(xxx):
    def get_time(*args, **kwargs): # 形参
    start_time = time.time()
    xxx(*args, **kwargs) # 实参
    end_time = time.time()
    print(end_time-start_time)
    return get_time
    func2 = func(func2)
  • 3.装饰器完整版本

    import time
    def func(xxx):
    def get_time(*args, **kwargs): # 形参
    start_time = time.time()
    res = xxx(*args, **kwargs) # 实参
    end_time = time.time()
    print(end_time-start_time)
    return res
    return get_time
  • 4.装饰器最终版本

    from functools import wraps
    def outer(func_name):
    @wraps(func_name) # 仅仅是为了让装饰器不容易被别人发现 做到真正的以假乱真
    def inner(*args, **kwargs):
    print('执行被装饰对象之前可以做的额外操作')
    res = func_name(*args, **kwargs)
    print('执行被装饰对象之后可以做的额外操作')
    return res
    return inner
  • 装饰器语法糖

    import time
    @outer # home = outer(真正的函数名home)
    def home():
    '''我是home函数 我要热死了!!!'''
    time.sleep(1)
    print('from home')
    return 'home返回值'
 

python闭包函数及装饰器简介的更多相关文章

  1. python闭包函数与装饰器

    目录 闭包函数 闭包概念 实际应用 装饰器 简介 简单版本装饰器 进阶版本装饰器 完整版本装饰器 装饰器模板 装饰器语法糖 装饰器修复技术 问题 答案 闭包函数 闭包概念 闭:定义在函数内部的函数 包 ...

  2. python 闭包函数与装饰器

    1.什么是闭包函数 (1):什么是闭包函数: #内部函数包含对外部作用域而非全局作用域的引用, 简而言之, 闭包的特点就是内部函数引用了外部函数中的变量. 在Python中,支持将函数当做对象使用,也 ...

  3. python闭包函数、装饰器

    闭包函数的传值方式: 方式1:通过参数传值 def func(x): print(x)func(1) 方式2:闭包函数传值 def outter(x): def inner(): print(x) r ...

  4. python基础-闭包函数和装饰器

    闭包函数和装饰器 闭包函数 概念:在函数中(嵌套)定义另一个函数时,内部函数引用了外层函数的名字. 特性 闭包函数必须在函数内部定义 闭包函数可引用外层函数的名字 闭包函数是函数嵌套.函数对象.名称空 ...

  5. day11 闭包函数和装饰器

    1.函数不是新知识点 主要是学习函数的用法 在面向对象编程中,一切皆对象,函数也不例外 具体的表现 1.函数可以引用 2.函数可以作为函数的参数 3.函数可以作为函数的返回值 4.可以被存储到容器类型 ...

  6. Python之函数对象、函数嵌套、名称空间与作用域、闭包函数、装饰器

    目录 一 函数对象 二 函数的嵌套 三 名称空间和作用域 四 闭合函数 五 装饰器 一.函数对象 1.函数是第一类对象 #第一类对象的特性:# 可以被引用 # 可以当做参数传递 # 返回值是函数 # ...

  7. 【Python3的命名空间与作用域,闭包函数,装饰器】

    一.命名空间与作用域 命名空间是名字和对象的映射,就像是字典,key是变量名,value是变量的值 1.命名空间的定义 name='egon' #定义变量 def func(): #定义函数 pass ...

  8. day11_7.11 闭包函数与装饰器

    补充: callable 代表可调用的,加括号可以执行.(函数或者类) import this  查看python之禅 一.闭包函数 所谓闭包函数,就是定义在函数内部的函数,也就是函数定义的嵌套.而在 ...

  9. CSIC_716_20191112【闭包函数和装饰器】

    闭包函数 什么是闭包函数:闭包函数是函数嵌套.函数对象.名称空间和作用域的集合体. 闭包函数必须在函数内部定义,闭包函数可以引用外层函数的名字. # _*_ coding: gbk _*_ # @Au ...

随机推荐

  1. Sharding JDBC案例实战

    基础分库 以下实例基于shardingsphere 4.1.0 + SpringBoot 2.2.5.RELEASE版本 依赖导入: <properties> <project.bu ...

  2. 设置VisualStudio以管理员身份运行

    以vs2013为例 vs右键属性 ----- 找到目标位置如下 "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\ID ...

  3. Linux用户权限集中管理方案

    一.问题 服务器多,各个服务器上的管理人员多,ROOT权限泛滥,经常导致文件莫名其妙丢失,老手和新手对服务器的熟知程度不同,安全存在不稳定和操作安全隐患. 二.方案 利用sudo配置指定用户只能执行指 ...

  4. 101_Power Pivot DAX 累计至今,历史累计至今

    焦棚子的文章目录 一.背景 DAX中已经有诸如YTD,QTD,MTD时间智能函数.用起来也比较方便. 但很多时候需要看历史累计至今的数据,需要自己根据实际情况写dax. 今天抛砖引玉,写一个示例. 二 ...

  5. TyepScript学习

    前提 JS缺陷 (1)变量频繁变换类型,类型不明确难以维护 TS定义 (1)定义 以JavaScript为基础构建的语音,一个JavaScript的超集,扩展js添加了类型, 可以在任何支持js的平台 ...

  6. 关于git flow的一点思考

    本文首发自我的公众号:成都有娃儿,这里把三篇文章合一,方便阅读. 现在相当多的公司或者团队都在使用git来做版本控制,结合我这些年的工作经历,我总结了一些个人认为不错的使用规范和习惯. 脱离背景来讲规 ...

  7. 使用 .NET MAUI 创建移动应用——Get Start

    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 1.IDE下载安装 如果你还没安装Visual Studio 2022 预览版 你 ...

  8. java中的方法重载(overload)

    什么时候方法重载:当两个方法的功能是相似的,可以考虑使用方法重载.若两个方法根本没有关系,无必要使用方法重载. 什么时候代码会发生方法重载:三个条件:1,在同一个类中.2,方法名相同.3,参数列表相同 ...

  9. 关于个人全栈项目【臻美Chat】遇到的BUG以及解决方法

    项目展示: 问题总结:一.单用户重复登录设备 将每次输入的用户名与已经记录在后台的数组ar比较,如果存在则表示重复. // 生成数组var ar="";socket.on('arr ...

  10. python基础知识-day8(动态参数)

    1.动态参数 函数的形式参数个数不确定.函数的形式数据类型不确定,使用动态参数,*代表元组,**代表字典. 2.代码案例演示 1 def func(*args,**kwargs): 2 print(a ...