首页 > 编程语言 >Python学习 -- 高阶、闭包、回调、偏函数与装饰器探究

Python学习 -- 高阶、闭包、回调、偏函数与装饰器探究

时间:2023-08-19 20:31:46浏览次数:42  
标签:闭包 function return 函数 Python -- 高阶 def

Python函数作为编程的核心,涵盖了众多令人兴奋的概念,如高阶函数、闭包、回调、偏函数和装饰器。本篇博客将深入研究这些概念,结合实际案例为你解析函数的精妙,以及如何巧妙地运用它们来构建更强大、灵活的程序。

高阶函数:进一步探索

在上文基础上,再次回顾高阶函数,展示它们如何将函数作为参数或返回值,构建更智能的代码逻辑。

闭包函数:隐藏的神奇力量

闭包是指一个函数能够访问其外部函数的局部变量,并将其“封闭”在函数内部。这种机制可以用来创建具有记忆效应的函数。

def outer_function(x):
    def inner_function(y):
        return x + y
    return inner_function
add_5 = outer_function(5)
result = add_5(3)  # 输出:8

在这个案例中,inner_function是一个闭包,它可以访问外部函数outer_function的局部变量x,并将其“封闭”在内部,使得add_5成为了一个具有记忆效应的函数。

回调函数:灵活的代码协作

回调函数是一种将函数作为参数传递给其他函数,以在特定情况下被调用的技术。

def process_data(data, callback):
    result = []
    for item in data:
        result.append(callback(item))
    return result




def square(x):
    return x ** 2




numbers = [1, 2, 3, 4, 5]
squared_numbers = process_data(numbers, square)
print(squared_numbers)  # 输出:[1, 4, 9, 16, 25]


在这个案例中,我们定义了一个process_data函数,它接受一个回调函数作为参数,用于处理数据列表中的每个元素。

偏函数:定制的函数工厂

偏函数是指通过固定一个或多个参数,从而创建一个新的函数的技术。

from functools import partial




def power(base, exponent):
    return base ** exponent




square = partial(power, exponent=2)
cube = partial(power, exponent=3)




result1 = square(4)  # 输出:16
result2 = cube(3)    # 输出:27

在这个案例中,我们使用functools.partial创建了square和cube两个偏函数,定制了基础的幂运算。

函数装饰器:代码的魔法加持

函数装饰器是一种能够在不修改原函数代码的情况下,为函数添加额外功能的技术。

def my_decorator(func):
    def wrapper():
        print("在函数执行之前")
        func()
        print("在函数执行之后")
    return wrapper
@my_decorator
def say_hello():
    print("Hello!")
say_hello()

在这个案例中,我们定义了一个my_decorator装饰器,它可以在函数执行之前和之后分别打印信息,然后使用@my_decorator将装饰器应用到say_hello函数。

总结

Python函数世界中蕴含着高阶、闭包、回调、偏函数和装饰器等多重概念,它们是构建高效、灵活程序的关键。本篇博客深入介绍了这些概念,结合实际案例展示了它们的应用,从高阶函数到闭包的神奇力量,再到偏函数和装饰器的定制和增强,逐一揭示了函数世界的奥秘。在实际编程中,灵活运用这些概念,将会使你的代码更具可读性、可维护性,提高开发效率,引领你踏入高级编程的新境界。

Python学习 -- 高阶、闭包、回调、偏函数与装饰器探究_回调函数

标签:闭包,function,return,函数,Python,--,高阶,def
From: https://blog.51cto.com/u_15288375/7151961

相关文章

  • QINQ技术
    概述随着以太网技术在网络中的大量部署,利用vlan对用户进行隔离和标识受到很大限制。因为IEEE802.1Q中定义的vlantag域只有12个bit,仅能标识4094个VLAN,无法满足城域以太网中标识大量用户的需求,于是QINQ技术应运而生QINQ(802.1QIN801.1Q)技术是一项扩展VLAN空间的技术,通过在802.1Q标......
  • tracer ftrace笔记(20)—— Systrace中tag汇总
    一、视频显示1.HW_VSYNC_ON_XXX(1)类型布尔值,1表示HWVSYNC信号开关被打开,0表示开关被关闭。(2)时机HWVYSNC硬件信号被打开和关闭的时候。(3)解释HW_VSYNC_ON_XXX后面的XXX一般是一串数字,代表的是displayid,如果你的机器有外接了显示器,那么可以通过displayid......
  • Widget、Element、RenderObject三者之间的关系
     Widget不是真正渲染UI的对象,它只是Element的一个配置描述,去通知Element应该如何去渲染,Widget和Element之间是⼀对一的关系Element持有RenderObject和Widget。RenderObject才是实际渲染的对象,三者的关系是:配置⽂件Widget⽣成了Element,⽽后创建RenderObject关联到Element......
  • 记一次Ubuntu修改密码的乌龙事件
    虚拟机装的Ubuntu系统忘记密码,按网上的教程修改之后,用ssh远程连接总是连不进去,尝试了各种办法都无效果。后来发现,在虚拟机的登录有时候也不行。忽然想起设置密码的时候用的是小键盘,会不会因为当时数字键没按下,输入的是乱码而不是数字。于是用键盘第二排的数字键重设了密码,故障解......
  • 双目测距方案
    双目测距方案WrittenOn2023-01-26.双目测距方案流程为:立体校正得出重投影矩阵识别得到左右目中,待测物体的中心像素点坐标计算距离(深度信息)立体校正得出重投影矩阵通过立体校正,可用求得重投影矩阵\(Q\)。重投影矩阵\(Q\)实现了世界坐标系到图像像素坐标系之间的转......
  • OpenCV双目视觉
    OpenCV双目视觉参考资料:[双目立体视觉:标定和校正双目立体视觉:标定和校正双目立体视觉:块匹配视差图计算教你如何提高双目立体视觉系统的精度立体标定cv::stereoCalibrate()flagsCV_CALIB_FIX_INTRINSIC:K和D个矩阵是固定的。这是默认标志。如果你校准好你的相机,你可......
  • 项目
    1.分库分表的优化将原来同一个库的表,分别进行区分,有交易库、基础库等等。分库分表,分析原sql中的表,看是否有移动,如果这张表迁移了,sql还是连表状态,就需要重写,重现业务逻辑,写好注解@DS,当@DS注解未起作用时,可以通过在@Transactional注解中添加propagation参数来指定事务的传播......
  • P9571 Horizon Blue 题解
    P9571HorizonBlue题解这个题拿平衡树写是不是小题大做了咳咳咳进入正题。首先转化一下题意。第一个操作是加入直线,第二个操作就是求所有斜率不等于\(k\)的直线的数量,第三个操作就是删掉所有斜率不等于\(k\)的和所有与该直线重合的直线。感觉这题完全就是FHQ_Treap的......
  • 手眼标定原理
    手眼标定原理WriteByChamprinFrom2022-11-03To2022-11-04.GUETEvolutionTeamVisualGroup参考资料:外文教程5.2-手眼标定(外参标定)要实现由图像目标点到空间实际物体上抓取点之间的坐标转换,就必须拥有相机与机械臂之间的位姿转换关系,即手眼关系,因此这种标......
  • PaddleOCR学习笔记3-通用识别服务
    今天优化了下之前的初步识别服务的python代码和html代码。采用flask+paddleocr+bootstrap快速搭建OCR识别服务。代码结构如下: 模板页面代码文件如下:upload.html:<!DOCTYPEhtml><html><metacharset="utf-8"><head><title>PandaCodeOCR</title><!-......