55 函数嵌套定义、可调用对象与修饰器

news2024/11/24 11:10:53

1 函数嵌套定义

Python 允许函数的嵌套定义,在函数内部可以再定义另外一个函数。

def func(iterable, operator, value):  # 自定义函数
    if operator not in '+-*/':
        return 'operator error'

    def nested(item):  # 嵌套定义函数
        return eval(repr(item) + operator + repr(value))

    return map(nested, iterable)


print(list(func(range(5), '+', 5)))
print(list(func(range(5), '/', 5)))

在这里插入图片描述

2 可调用对象

函数属于 Python 可调用对象之一,由于构造方法的存在,类也是可调用的。像 list()、tuple()、dict()、set() 这样的工厂函数实际上都是调用了类的构造方法。另外,包含任何 _ _ call _ _ () 方法的类的对象也是可调用的。

# 使用嵌套函数的定义实现可调用对象的定义
def linear(a, b):
    def get(x):
        return a * x + b

    return get  # 返回可被调用的函数


#  定义一个可调用对象
obj = linear(0.3, 2)
# 调用该对象
print(obj(5))

在这里插入图片描述

# 可调用对象类的定义
class linear:
    def __init__(self, a, b):
        self.a, self.b = a, b

    def __call__(self, x):  # 这里是关键
        return self.a * x + self.b


#  定义一个可调用对象
obj = linear(0.3, 2)
# 调用该对象
print(obj(5))

在这里插入图片描述

3 修饰器

修饰器是函数嵌套定义的另一个重要应用。修饰器本质上也是一个函数,只不过这个函数接收其他函数作为参数并对其进行一定的改造之后返回新函数。
静态方法、类方法、属性等也都是通过修饰器实现的,Python 中还有很多这样的用法。

def before(func):  # 定义修饰器
    def wrapper():
        print('before() called.')
        return func()

    return wrapper


@before
def test():
    print('127')
    return 'python'


# 调用被修饰的函数
x = test()
print('x: ', x)

在这里插入图片描述

def before(func):  # 定义修饰器
    def wrapper():
        print('before() called.')
        return func()

    return wrapper


def after(func):  # 定义修饰器
    def wrapper(*args, **kwargs):
        get = func(*args, **kwargs)
        print('after() called.')
        return get

    return wrapper


@before
@after
def test():  # 同时使用两个修饰器改造函数
    print(3)


# 调用被修饰的函数
test()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1982809.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

陷入复杂度深渊的ModularRAG..

最近又有一篇ModularRAG的论文,虽然没有太让人汗毛竖起的惊艳,但我想文中的几张配图冷不丁的也着实让部分密集恐惧症患者又一次炸毛了一下吧;)...ps,图画的还是十分规整和可读的,逻辑也很是清晰,为作者的用心点赞&…

如何快速上手Linux操作系统

🐟作者简介:🪴 🐡🐙个人主页🥇:Aic山鱼 🐠WeChat:z7010cyy 🦈系列专栏:🏞️ 前端-JS基础专栏✨前端-Vue框架专栏✨✨前端-Vue3速学专…

OLAP知识地图思考(附地图)

OLAP知识地图思考(附地图) OLAP技术在当今数据驱动的时代具有举足轻重的地位。它的核心技术模块包括数据存储、计算引擎和查询语言等,这些模块的有效协同是实现高效数据分析的基础。然而,OLAP在运维方面面临着诸多挑战&#xff0c…

【驱动篇】龙芯LS2K0300之RTC设备驱动

实验介绍 本次实验是关于pcf8563 RTC模块的驱动移植,大致流程如下: 注册i2c设备驱动编写RTC设备驱动将device和driver驱动部署到开发板并装载,通过hwclock命令来测试 模块连接 VCC接Pin2,GND接Pin1,SCL接Pin16&…

一加Ace3 ColorOS14系统精简列表(免root)

#adb工具 https://www.123pan.com/s/Z3kujv-NHRPA.html 提取码:DZOD 使用: 1. 手机 设置 -- 关于本机 -- 版本信息 -- 版本号 ,点5次 2. 设置 -- 其他设置 -- 开发者选项 -- USB调试 -- 无线调试 3.adb工具 -- adb connect 10.0.0.156:37909&#xff…

opencv-霍夫变换

霍夫变换就是一个可以让计算机学会自己找图形的算法。是图形处理领域内从图像中检测几何形状的基本方法之一。经典霍夫变换用来检测图像中的直线,后来霍夫变换经过扩展可以进行任意型状物体的识别,例如圆和椭圆。 霍夫变换运用两个坐标空间之间的变换&a…

CSP-J复赛 模拟题3

1.匿名信: 题目描述 出于对社会现状的担忧,Alice 决定给市长写一封建议信,考虑到市长的暴脾气,Alice 最终还是决定匿名上书,为了保证自己的绝对神秘,她还会从当天的报纸上将一些单词(或字母)裁剪下来并重…

安装glibc+mysql的权限问题

安装glibc glibc mysql 俗称绿色mysql 安装之前删掉mariadb: 数据库初始化时候,会⾃动找my.cnf配置,但是原有的mariadb配 置⽂件,会失败 [rootmysql3 ~]# ls -l /etc/my.cnf -rw-r--r--. 1 root root 570 6月 8 2017 /etc/my.cnf [rootm…

Vue路由入门学习

文章目录 路由的基本使用1.目标2.作用3.说明4.官网5.VueRouter的使用(52)两个核心步骤 组件的存放目录问题1.组件分类存放目录 路由的封装抽离 Vue中的路由: 路径和组件的 映射关系 路由的基本使用 1.目标 认识插件 VueRouter&#xff0c…

Midjourney仅10分钟搞定⼀套漫画,含MJ提⽰词分享

Midjourney能帮我们画漫画了,你敢信?⼀起来和⽹易设计师学习如何只⽤10分钟,即使你是设计⿇⽠,也能轻轻松松完成⼀张属于你⾃⼰的短⽚⼩漫画!今天就⽤MJ来实战⼀套漫画,包含创作⽤的⼯ 具和提⽰词的应⽤,以前来学习吧! 漫画先看成品图: ▍ Part1你要画个啥? 画漫画当…

复现一下最近学习的漏洞(sqlab 1-10)

第一个问题:为什么不能用#来闭合单引号呢? 在进行URL地址栏传参的时候,是有一套编码规范的。他不会编码英文、数字和某些符号。但是#它会进行编码。也就是%23。(先转ascii码,然后再转十六进制,之后加上%就是…

小白暴力学习001---Vue---第一个Vue

做本文主要是采用Vue3的教程,来源于菜鸟教程, https://www.runoob.com/vue3/vue3-tutorial.html 主要记录从小白开始如何使用Vue建立一个笔记本的网站,并用于记录 基础条件: 有明确的目标有兴趣能使用电脑,会百度 视…

前端的学习-CSS(二)-弹性盒子-flex

一:子元素的属性 order:项目的排列顺序,数值越小,排列越靠前,默认为0。 flex-grow:定义项目的放大比例,默认为 0 ,即如果存在剩余空间,也不放大。 flex-shrink&#xff1…

【链表OJ】常见面试题 2

文章目录 1.[链表分割](https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70?tpId8&&tqId11004&rp2&ru/activity/oj&qru/ta/cracking-the-coding-interview/question-ranking)1.1 题目要求1.2 哨兵位法 2.[链表的回文结构](https://www.…

Spring Boot集成liquibase快速入门Demo

1.什么是liquibase? Liquibase是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据)都保存在 changelog 文件中,便于版本控制,它的目标是提供一种数据库类型无关的解决…

小厂也是厂,3000我也干

2018年6月,大三暑假 那一天,我投递了家里附近的一家公司有响应了,他线上问我什么时候可以去面试,我说什么时候都行。 HR:“要不你下午来吧?” 我:“行,我家里离面试地点不远” 我…

zdpy+vue3+onlyoffice文档系统实战上课笔记 20240805

上次 上次计划 1、最近文档表格完善 2、实现登录功能 3、新建文件,复制文件,删除文件 4、其他 目前任务:最近文档表格完善 1、在名称前面,渲染这个文档的图标 2、大小的基本的单位是kb,超过1024kb则换成mb&#xff0…

编写一个期货跨期套利的程序,谈谈思路及案例

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

8.5 C++

思维导图 试编程 提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 要求使用C风格字符串完成 #include <iostream> #include <array>using namespace std;int main() {cout << "请输入一个字符…

Python 字典 ({})的概念与操作

1、使用字典 在Python中&#xff0c;字典(dictionary)是一系列键值对(k-v pair)。每个键都有相应的值对应&#xff0c;使用键来访问与之关联的值&#xff0c;与键关联的值可以为数、字符串、列表乃至字典。 在Python中&#xff0c;字典放在花括号&#xff08;{}&#xff09;中…