Python 装饰器与偏函数

目录

装饰器

概念

简单的装饰器

复杂点的装饰器

通用装饰器

定义通用装饰器

使用装饰器

偏函数

引入类库

应用

总结


装饰器

概念

装饰器就是个闭包;把一个函数当做参数,返回一个修改过功能的函数;

本质上是一个返回函数的函数。

简单的装饰器

定义一个fun1函数,然后定义一个outer函数在不对fun1函数修改的前提下,

fun1返回进行修饰。

示例如下:

def fun1():print('this is fun1')def outer():print('对方法进行装饰')fun1()outer()# 执行结果
# 对方法进行装饰
# 这是 fun1 方法

不过一般会传递函数参数,并把对方法装饰写在一个内部函数中处理,并返回装饰函数。

示例如下:

def fun1():print('这是 fun1 方法')def outer(fun):def inner():print('对 %s 方法进行修饰' % (str(fun)))fun()return innerf1 = outer(fun1)
f1()# 执行结果
# 对 <function fun1 at 0x000001DED3ED1288> 方法进行修饰
# 这是 fun1 方法

说明:

复杂点的装饰器

使用@符号将装饰器应用到函数。

写一个函数获得张三家的剩余苹果数量;

通过装饰器判断参数如果小于0,则参数值修改为0。

示例如下:

def get_apple(num):print('张三有%d个苹果' % num)# 没有装饰器 结果为负数
get_apple(-1)def outer(fun):def inner(num):if num < 0:num = 0fun(num)return inner@outer
def get_apple(num):print('张三有%d个苹果' % num)# 通过装饰器修改 如果数量小于0 则数量为0
get_apple(-1)

通用装饰器

上面的装饰器,只能说是定制的装饰器,只能接收特定的值。

下面通过之前学到的不定长参数定义一个通用的装饰器。

定义通用装饰器

*args接收单个值的参数;

**kwargs接收关键字方式的值参数。

示例如下:

def outer(fun):def inner(*args, **kwargs):# 添加修改的功能语句print('添加修改的功能语句')fun(*args, **kwargs)return inner

使用装饰器

示例如下:

@outer
def get_student(name, address):print('My name is %s, and I come from %s!' % (name, address))get_student('zhang san', 'hebei')# 执行结果
# 添加修改的功能语句
# My name is zhang san, and I come from hebei!

 

偏函数

偏函数是指固定一个函数的某些参数,并生成一个新的函数。 换句话说,偏函数是通过一个已有函数创建一个新函数,这个新函数固定住原函数的一些参数,从而减少了参数的个数。

 

引入类库

示例如下:

from functools import partial

应用

字符串转化为二进制数,通过使用偏函数将int函数的base参数固定为2。

示例如下:

str_to_bin = partial(int, base=2)
print(str_to_bin("1000"))
print(str_to_bin("1010"))# 执行结果
# 8
# 10

总结

本篇是对python 中装饰器和偏函数的简单内容整理;偏函数比较简单一些日常开发中也用到过,只是不知道这属于偏函数;装饰器在django框架中验证请求方法和csrf时使用过。

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

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

相关文章

Redis面试常见问题

Redis中的Lua脚本到底能不能保证原子性&#xff1f; Redis中Lua脚本的执行&#xff0c;可以保证并发编程中不可再拆分的这个原子性&#xff0c;但是没有保证数据库ACID中要么都执行要么都回滚的这个原子性。Lua脚本执行过程中命令产生错误&#xff0c;是不会回滚的&#xff0c…

基于Java SSM框架+Vue实现垃圾分类网站系统项目【项目源码+论文说明】

基于java的SSM框架Vue实现垃圾分类网站系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个垃圾分类网站 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述…

java8 lambda常用整理(2)

list集合数据分组 使用Collectors.groupingBy()方法来实现List集合数据的分组。groupingBy()方法接受一个分类函数&#xff0c;该函数将根据指定的条件将元素分组。 1.1. 示例1 import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.st…

2023年国内主流的低代码平台

低代码开发平台&#xff08;Low-Code Development Platform, LCDS&#xff09;为企业和开发者提供了高效的应用开发方式。这些平台使得开发者可以通过简化的设计界面快速创建和部署应用&#xff0c;大大提高了开发效率并降低了开发成本。 伴随数字化转型推进&#xff0c;选购低…

C++中用于动态内存的new和delete操作符

文章目录 1、动态分配内存的应用2、动态分配内存与分配给普通变量的内存有什么不同?3、C 中如何分配/释放内存4、new 操作符4.1 使用new的语法4.2 初始化内存4.3 分配内存块4.4 普通数组声明 Vs 使用new4.5 如果运行时没有足够内存可用怎么办&#xff1f; 5、delete 操作符 C/…

使用Perplexity AI免费白嫖GPT4的使用次数((智能搜索工具)

一、Perplexity AI是什么 Perplexity AI是一款高质量的智能搜索工具&#xff0c;它可以为用户提供简洁清晰的搜索体验。Perplexity AI内置了基于GPT-4的Copilot搜索功能&#xff0c;用户可以在每四个小时使用五次(白嫖GPT-4)。此外&#xff0c;Perplexity AI有免费和付费&#…

C++——取地址和自增运算

今天做了道题一下给我整蒙了&#xff0c;把实验探索发篇文章&#xff0c;题目如下&#xff1a; int a[]{10,11,12},*p&a[0];执行完*p;*p1;后a[0],a[1],a[2]的值各为多少 答案是 10, 12, 12怎么理解*p,*p1呢&#xff0c;我觉得可以用汉语把代码读一下&#xff0c;p&#xf…

【寒武纪(6)】MLU推理加速引擎MagicMind,最佳实践(三)使用框架模型ONNX

支持情况 Pytorch 只支持 1.6.0 导出。 如何生成ONNX&#xff1f; 解析失败 包括&#xff1a;Parse 过程转换失败node index&#xff0c;不支持的模型输入tensor name&#xff0c;不支持的控制流子图输入tensor name。 提取支持的子图

sizeof与strlen有哪些区别

sizeof是操作符&#xff0c;strlen是函数。sizeof操作符的结果类型是size_t&#xff0c;它在头文件中typedef为unsignedint类型&#xff0c;该类型保证能容纳实现所建立的最大对象的字节大小。sizeof可以用类型做参数&#xff0c;strlen只能用char*做参数&#xff0c;且必须是以…

ArkTs变量类型、数据类型

可以参考官网学习路径学习HarmonyOS第一课|应用开发视频教程学习|HarmonyOS应用开发官网 一、变量 1、ArkTS语言 ArkTS是华为自研的开发语言。它在TypeScript&#xff08;简称TS&#xff09;的基础上&#xff0c;匹配ArkUI框架&#xff0c;扩展了声明式UI、状态管理等相应的…

acwing算法基础之动态规划--DP习题课1

目录 1 基础知识2 模板3 工程化 1 基础知识 暂无。。。 2 模板 暂无。。。 3 工程化 题目1&#xff1a;最长上升子序列&#xff0c;要求时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)。 解题思路&#xff1a;保存每个长度下的最小的结尾元素值&#xff0c;遍历数组元素…

hadoop源码解读

一、hadoop rpc总结 1、RPC指的是不同进程的方法调用&#xff0c;分为客户端和服务端&#xff0c;客户端调用服务端的方法&#xff0c;方法的执行在服务端。 2、如何实现Hadoop RPC的调用&#xff0c;必须要实现协议&#xff0c;这个协议其实就是一个接口&#xff0c;但是这个…

【Android Jetpack】Room数据库

文章目录 引入EntitiesPrimary Key主键索引和唯一性对象之间的关系外键获取关联的Entity对象嵌套对象Data Access Objects&#xff08;DAOs&#xff09;使用Query注解的方法简单的查询带参数查询返回列的子集可被观察的查询 数据库迁移用法 引入 原始的SQLite有以下两个缺点: …

LCD屏接口与模式详解:干货超多

前言 随着时代的发展&#xff0c;现如今我们生活上已经随处可见的各种电子产品了&#xff0c;诸如手机、平板、电脑、一些其它智能单品上都有用到显示屏&#xff0c;它作为人机交互的重要桥梁之一&#xff0c;我认为它是生活中必不可少的存在&#xff0c;如果少了它&#xff0c…

【Electron】上下键切换消息

需求&#xff1a; 如图&#xff0c;需要监听上下键切换消息 Electron 注册 全局快捷键【globalShortcut】监听 在focus注册 在blur 注销 如苹果系统在使用某个软件(focus)时 右上角会有应用标题 Electron 代码&#xff1a; win.on(focus, ()>{globalShortcut.register(U…

物联网边缘计算是什么?如何实现物联网边缘计算?

物联网边缘计算是一种在物联网设备和网络中实施计算和数据处理的技术。它允许在物联网设备或网络边缘进行数据分析和处理&#xff0c;而不需要将所有数据传输到远程数据中心或云端进行处理。物联网边缘计算将计算和数据处理的能力迁移到物联网设备的边缘&#xff0c;使得设备能…

如何群发发票邮件内容

群发发票邮件内容需要仔细考虑邮件的主题、正文和附件内容&#xff0c;以确保邮件的准确性和完整性。以 一、明确邮件目的 在群发发票邮件时&#xff0c;首先需要明确邮件的目的。一般来说&#xff0c;发票邮件的目的是向客户或供应商提供交易的详细记录和证明。因此&#xf…

啊哒-MISC-bugku-解题步骤

——CTF解题专栏—— 题目信息&#xff1a; 题目&#xff1a;啊哒 作者&#xff1a;第七届山东省大学生网络安全技能大赛 提示&#xff1a;无 解题附件&#xff1a; 解题思路&#xff1a; 图片的话还是老三样斧winwalk、010Editor、Stegsolve。ok直接开搞&#xff01; 解题…

基于UDP的TFTP文件传输

代码&#xff1a; #include <myhead.h>//实现下载功能 int download(int cfd,struct sockaddr_in sin) {char buf[516] ""; //定义资源包char fileName[128] ""; //定义文件名printf("请输入文件名:");scanf("%s",fileName…

Re0: 从零实现一个置顶任意窗口的小工具

前言 话不多说&#xff0c;先上效果&#xff1a; 这里展示的是通过下拉框选择窗口&#xff0c;让窗口显示并置顶&#xff0c;其实还可以直接通过快捷键&#xff08;先鼠标点击要置顶的窗口&#xff0c;再使用CTRLSHIFTT&#xff09;&#xff0c;本文涉及到的完整代码已上传到G…