Python学习(十一)——闭包与装饰器


高阶函数:函数可以作为参数传入;函数可以作为返回值。(满足其一即为高阶函数)

闭包

闭包:读取其它函数内部变量的函数

闭包 = 内部函数+定义函数时的环境

闭包的作用:保存外部函数的变量,不会随着外部函数调用完而销毁。
闭包的形成条件:

  1. 函数嵌套。
  2. 内部函数必须使用了外部函数的变量或者参数。
  3. 外部函数返回内部函数 这个使用了外部函数变量的内部函数就称为闭包。
# 闭包函数
def f():
    x = 1
    def g():
        print(x)
    return g
h = f()
h()	# 即f()()  f()相当于g  f()()相当于g()
# 结果:1
# 不是闭包函数
def f():
    x = 10
    def g():
        y = 5
        print(y)	# y属于g(),没有对外部函数进行引用
    return g
f()()
# 闭包函数
def f(x):
    def g():
        print(x)
    return g
h = f(1)	# x的值在g()外
h()

装饰器

装饰器的作用:在不改变原函数的情况下,对已有的函数进行额外的功能扩展。
装饰器的形成条件:

  1. 不修改已有函数的源代码。
  2. 不修改已有函数的调用方式。
  3. 给已有函数增加额外的功能。

闭包与装饰器的区别:

  • 装饰器实质上是一个闭包函数。
  • 装饰器的参数仅有一个,且为函数类型时,它才是装饰器,否则就是闭包函数。

无参

时间模块:time
导包:import time
导包的作用:在不修改源代码的基础上给函数增加新的功能。

import time

start = time.time()
print(start)  # 输出1970年01月01日00:00:00秒起至今的总秒数
# 结果:1664953651.1475735
time.sleep(1)  # 休眠程序1秒
import time

def fn():
    start = time.time()
    print("fn..")
    time.sleep(1)
    end = time.time()
    print(f"运行了{end-start}秒")
fn()
# 结果:fn..
#		运行了1.0006623268127441秒
import time

def fn():
    print("fn..")
    time.sleep(1)
def show_time(func):  # 该函数的功能为展示时间
    def inner():
        start = time.time()
        func()
        end = time.time()
        print(f"运行了{end - start}秒")
    return inner

f = show_time(fn)
f()	 # 相当于inner()
# 结果:fn..
#		运行了1.0004348754882812秒

@ 语法糖

import time
 
def show_time(func): 
    def inner():
        start = time.time()
        func()
        end = time.time()
        print(f"运行了{end - start}秒")
    return inner

@ show_time  # fn = show_time(fn)
def fn():
    print("fn..")
    time.sleep(1)
fn()
# 结果:fn..
#		运行了1.0008530616760254秒

原函数参数

import time 

def show_time(func):
    def inner(a,b):
        start = time.time()
        func(a,b)
        end = time.time()
        print(f"运行了{end - start}秒")
    return inner
 
@ show_time
def add(a,b):
    print(a+b)
    time.sleep(1)
add(1,2)
# 结果:3
#		运行了1.000861406326294秒

*args **kwargs

import time

def show_time(func): 
    def inner(*args,**kwargs):
        start = time.time()
        func(*args,**kwargs)
        end = time.time()
        print(f"运行了{end - start}秒")
    return inner
@ show_time
def add(*args,**kwargs):
    sum1 = 0
    for i in args:
        sum1+=i
    print(sum1)
    time.sleep(1)
add(1,2,3,4,5)
# 结果:15
#		运行了1.0001788139343262秒
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mport

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值