首页 > 其他分享 >函数对象,闭包函数及装饰器了解

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

时间:2024-04-15 16:13:54浏览次数:32  
标签:闭包 函数 add func time print 装饰 def

函数对象

【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

标签:闭包,函数,add,func,time,print,装饰,def
From: https://www.cnblogs.com/zyb123/p/18136163

相关文章

  • hash()函数在python2和python3的区别
    在Python3中,对于字符串类型的对象,hash()函数会根据当前进程的种子值计算哈希值。这个种子值在每次Python进程启动时都会随机生成。因此,即使是相同的字符串,在不同的Python进程中调用hash()函数会得到不同的哈希值。这种设计的目的是为了增加哈希表的随机性,从而提高安全性......
  • 析构函数与 -O2 优化的一个问题
    在赋值时,我们需要先对原有对象调用析构函数。我的析构函数实现如下:~vector() { for(ptr*itr=begin_p;itr!=finish_p;itr++) { delete*itr; } delete[]begin_p; begin_p=nullptr;finish_p=nullptr;end_p=nullptr; }不使用-O2优化,程序运行正常,调用完析构函......
  • PHP strlen() 和mb_strlen()函数
    <?php   //测试时文件的编码方式要是UTF8   $str='中文a字1符';   echostrlen($str).'<br>';//14   echomb_strlen($str,'utf8').'<br>';//6   echomb_strlen($str,'gbk').'<br>';//8   echomb_s......
  • python-函数以及函数的返回值
    '''函数:把具有独立功能的代码块组合成一个个小模块作用:提高代码的效率,实现代码重复---流程标准化#可以在不同的地方多次调用,想要使用几次就使用几次,更加灵活,只需要调用,不需要重新定义'''#def函数名():#函数的定义#函数名需要复合标志符的命名规范(必须是字母,下划线,数......
  • 定义存储过程和函数
    定义存储过程和函数本文出处:https://www.modb.pro/db/222642学习地址https://www.modb.pro/course/133学习目标学习openGauss定义存储过程和函数课后作业1.创建带有入参和出参的函数1,调用函数时使用按参数值传递和命名标记法传参omm=#createfunctionfunc_multiply(......
  • 函数式编程思想 VS 可变性理论 20240415
    函数式编程(FunctionalProgramming,FP)是一种编程范式,它将计算视为数学函数的求值,并避免使用程序状态以及易变对象。函数式编程的核心思想包括:不可变性(Immutability):在函数式编程中,数据是不变的。一旦创建了一个数据结构,就不能再改变它。所有的操作都会产生新的数据结构。纯......
  • 函数的参数传递是值传递
    1.基本值,会直接将值传递给函数的参数2.引用值传递,是将引用值地址值传递给函数参数外界定义的a并没有被修改引用地址,说明参数传递进来的是地址值,如果参数是引用传递,那么外界的a应该被修改为a=此时值被改变,是直接操作了引用对象地址指向的内存空间,函数参数传递进......
  • vscode使用ES6装饰器器语法
    1.react项目配置package.json需要安装npmi@babel/plugin-proposal-decorators可能需要重启项目{"babel":{"plugins":[["@babel/plugin-proposal-decorators",{"legacy":true}......
  • 异步函数
    0.为什么使用异步因为js本身是单线程,如果所有的任务都是同步的,那么一些非常耗时的任务就会严重影响到用户体验1.回调函数constfs=require('fs');functionread(fileName){fs.readFile(fileName,'utf-8',(err,data)=>{if(err){console.log('err'......
  • httprunner 4.x学习 - 06辅助函数(debugtalk)的使用
    前言支持go语言和python语言写辅助函数debugtalk辅助函数在根目录编辑debugtalk.py文件写辅助函数实现自动化生成动态参数。 如下两个int相加和获取登录用用户名函数defsum_two_int(a:int,b:int)->int:returna+b defget_longin_name():retur......