函数对象,闭包函数及装饰器了解

函数对象

【1】定义

函数对象指的是函数可以被当做数据来处理

【2】可以直接被引用

定义一个函数用一个新的变量名来存,用新的变量名来调用

# 定义一个函数
def add(x, y):
    return x + y

# 将函数地址绑定给一个变量
func = add
# 通过这个变量找到对应的地址,从而调用函数
res = func(1, 2)
print(res) # 3

【3】函数可以作为参数传递给另一个函数

def add(x, y):
    return x + y

def foo(x, y, func):
    return func(x, y)

res = foo(1, 2, add)
print(res) # 3

【4】函数的返回值可以是函数

我们直接将函数的内存地址返回

def add(x, y):
    return x + y

def bar():
    return add

func = bar()
print(func)  # <function add at 0x000001F57A053E20>
res = func(1, 2)
print(res)  # 3

闭包函数

【1】概念

闭包函数就是对外部作用域有引用的函数

内部函数对外部函数作用域有引用,这个内部函数就叫做闭包函数

x_global = 1

def outer():
    # 定义局部变量,覆盖全局变量
    x_global = 2

    def inner():
        # 打印外部函数的局部变量
        print(x_global)   # 2    inner()就是闭包函数

    return inner

func = outer()
func()  

【2】闭包函数的应用

  • 装饰器
  • 函数工厂模式
  • 封装

【3】装饰器

闭包函数就是内嵌函数对外部函数作用域有引用的函数

def outer():
    def inner():
        print("hello world")

    return inner

res = outer()

print(res)  # <function outer.<locals>.inner at 0x000001A2012637F0>
print(res())

(1)时间模块

可以用来获取时间

import time

def add():
    ...

start_time = time.time()

time.sleep(4)
end_time = time.time()
print(f'{end_time - start_time}s') # 4.0009307861328125s
import time

def add():
    time.sleep(3)

start_time = time.time()
add()  # 调用不同函数
end_time = time.time()
print(f"{end_time - start_time} s") # 3.0077402591705322 s
# 两个都可以调用
import time

def add():
    time.sleep(3)

def delete():
    time.sleep(4)

def check_time(func):
    start_time = time.time()
    func()
    end_time = time.time()
    print(f"{end_time - start_time} s")

check_time(add) # 3.006422996520996 s
check_time(delete) # 4.012505769729614 s
# 装饰器就是在不改变原来函数调用方式的基础上增加额外的新功能
import time

def add():
    time.sleep(3)

def delete():
    time.sleep(4)

def outer(func):
    func = func

    def inner():
        start_time = time.time()
        func()
        end_time = time.time()
        print(f"{end_time - start_time} s")

    return inner

add = outer(add)
add()
# 3.0092411041259766 s

(2)装饰器的语法糖

  • 用timer来装饰带参数或不带参数的函数
  • 为了简洁而优雅地使用装饰器,Python提供了专门的装饰器语法来取代index=timer(index)的形式
    • 需要在被装饰对象的正上方单独一行添加 @timer, 时就会调用timer函数
import time
def outer(func):
    func = func

    def inner():
        start_time = time.time()
        func()
        end_time = time.time()
        print(f"{end_time - start_time} s")

    return inner

@outer # add = outer(add)
def add():
    time.sleep(3)

@outer  # delete = outer(delete)
def delete():
    time.sleep(4)
 
add() # 3.004960298538208 s
delete() #4.009537220001221 s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值