当前位置: 首页 > news >正文

Day 09 python学习笔记

函数


装饰器

回顾内容:

  1. 函数可以作为参数进行传递
  2. 函数可以作为返回值
  3. 函数名称可以像变量一样进行赋值操作

装饰器:要求记住结论

引入:

def play_dnf():print("你好啊,我是赛利亚,今天又是美好的一天")def play_lol():print("德玛西亚")print("开挂")
play_dnf()
print("关闭外挂")print("开挂")
play_lol()
print("关闭外挂")

太麻烦,聘请管家帮我开启外挂

#函数作为参数进行传递
def guanjia(fn):print("开挂")fn()print("关闭外挂")def play_dnf():print("你好啊,我是赛利亚,今天又是美好的一天")def play_lol():print("德玛西亚")guanjia(play_dnf)

但成了管家在打游戏了

解决办法:

#函数作为参数进行传递
def guanjia(fn):def inner():print("开挂")fn()print("关闭外挂")return innerdef play_dnf():print("你好啊,我是赛利亚,今天又是美好的一天")def play_lol():print("德玛西亚")play_dnf = guanjia(play_dnf)
#让管家把游戏重新封装了,我这边把原来的游戏替换掉
play_dnf()    #此时运行的是内部函数inner
play_lol = guanjia(play_lol)
play_lol()

还是太麻烦:

#函数作为参数进行传递
def guanjia(fn):def inner():print("开挂")fn()print("关闭外挂")return inner@guanjia        #相当于play_dnf = guanjia(play_dnf)
def play_dnf():print("你好啊,我是赛利亚,今天又是美好的一天")@guanjia        #相当于play_lol = guanjia(play_lol)
def play_lol():print("德玛西亚")play_dnf()
play_lol()

本质
装饰器本质上是一个闭包,作用是在不改变原有函数的前提下,为函数添加新的功能,可以在函数的前后添加新的功能,但是源代码不改变
运用:

  1. 在用户登录的地方
  2. 日志
  3. ……

雏形:

def wrapper(目标函数):def inner:之前,添加事情目标函数执行 fn()之后,添加功能return inner    #千万别加()@wrapper   # 目标函数 = wrapper(目标函数)

__name__

__name__属性:帮助获取函数的名字

例:
def now():print("1111111111111")a = now  #a是now的别名
b = a    #b是a的别名 
#若别名套用太多,不知道别名是哪个函数的
print(b.__name__)   #获取别名本身的函数名字结果:
now还可以:
def guanjia(fn):print(fn.__name__)   #看fn是指向哪个函数

练习:

记录玩游戏的时间(装饰器)

import time           #引入时间模块(后面会讲)

time.time()            #时间戳:指格林威治时间1970年01月01日00时00分00秒(北京时间                               1970年01月01日08时00分00秒)起至现在的总秒数

time.sleep(x)        #沉睡x秒

例:
import timedef time_01(fn):def inner():start_time = time.time()fn()end_time = time.time()execution_time = end_time - start_timeprint(f"{fn.__name__}函数的执行时间是{execution_time}")return inner@time_01
def test1():time.sleep(3)print("1111")test1()结果:
1111
test1函数的执行时间是3.002014398574829

被装饰函数的参数问题

因为装饰器是将        目标函数 = wrapper(目标函数)

即                             目标函数 = wrapper(目标函数)========>wrapper.inner

所以我们要传参的话inner(x,x)需要有形参接收

例:
def inner(name,pwd):

但装饰器如果装饰不同函数的话,不同函数的形参需求不同的话还是会报错

例:
@guanjia 
def play_wz(uname,pwd):@guanjia
def play_lol(uname,pwd,area):

所以我们可以用可变参数来解决(*args, **kwargs)

def guanjia(fn):def inner(*args, **kwargs):#* ,** 表示借助所有传进来的实参,打包成元组和字典print("开挂")fn(*args, **kwargs)#*,**表示把元组和字典打散成位置参数以及关键字参数传递进去print("停止游戏,关闭外挂")return inner@guanjia # 相当于play_wz=gunajia(play_wz)
def play_wz(uname, password):print(f"用户名是{uname},密码是{password}")print("来和妲己玩耍吧")@guanjia
def play_cj(uname, password, hero):print(f"用户名是{uname},密码是{password},英雄是{hero}")print("注意标记点")play_wz('gouxin', 123456)
play_cj("gouxin", 123456, 'daji')
play_cj(uname = "lisi",password ="123456",hero ="nanjing")结果:
开挂
用户名是gouxin,密码是123456
来和妲己玩耍吧
停止游戏,关闭外挂
开挂
用户名是gouxin,密码是123456,英雄是daji
注意标记点
停止游戏,关闭外挂
开挂
用户名是lisi,密码是123456,英雄是nanjing
注意标记点
停止游戏,关闭外挂

添加**kwargs的原因是:

如果有人传参时是用关键字形式传参,只写*args就会报错(如下)

def inner(*args):play_cj(uname = "lisi",password ="123456",hero ="nanjing")

装饰器的返回值

如果游戏函数结束后要返回一个值,这怎么解决呢?

直接上代码(注释讲解)

def guanjia(fn):def inner(*args,**kwargs):print("开挂")ret = fn(*args,**kwargs)  #用ret接收返回的值print("关闭外挂")return ret         #再将ret返回出去,作为inner(即play_wz)的返回值return inner@guanjia    #   play_wz = guanjia(play_wz)
def play_wz(uname,pwd):print("来和妲己玩耍啊~")print(f"用户名是{uname},密码是{pwd}")return "妲己66666"      #运行完返回一个值@guanjia
def play_lol(uname,pwd,area):print("德玛西亚")print(f"用户名是{uname},密码是{pwd},地区是{area}")a = play_wz("zs","123456")   #用a来接收返回值
print(a)                     #打印返回值(即游戏的返回值)
play_lol(uname = "lisi",pwd ="123456",area ="nanjing")结果:
开挂
来和妲己玩耍啊~
用户名是zs,密码是123456
关闭外挂
妲己66666   #结束后返回的值
开挂
德玛西亚
用户名是lisi,密码是123456,地区是nanjing
关闭外挂

一个函数可以被多个装饰器装饰

如果一个函数可以被多个装饰器装饰,是如何运行的呢?

def wrapper1(fn):def inner(*args,**kwargs):print("第一个装饰器")fn()print("第一个装饰器结束")return innerdef wrapper2(fn):def inner(*args,**kwargs):print("第二个装饰器")fn()print("第二个装饰器结束")return inner@wrapper1  #test = wrapper1(test)=wrapper1(wrapper2.inner)=====>wrapper1.inner
@wrapper2  #test = wrapper2(test)========>wrapper2.inner
def test():print("我是函数")test()结果:
第一个装饰器
第二个装饰器
我是函数
第二个装饰器结束
第一个装饰器结束

先装饰函数的上面的一层(即wrapper2),再依次往上装饰(即wrapper1)

最后运行test( )即运行wrapper1.inner

所以可以看结果来理解运行顺序

相关文章:

Day 09 python学习笔记

函数 装饰器 回顾内容: 函数可以作为参数进行传递函数可以作为返回值函数名称可以像变量一样进行赋值操作 装饰器:要求记住结论 引入: def play_dnf():print("你好啊,我是赛利亚,今天又是美好的一天")def p…...

力扣labuladong——一刷day02

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣876. 链表的中间结点二、力扣142. 环形链表 II三、力扣160. 相交链表四、力扣141. 环形链表 前言 一、力扣876. 链表的中间结点 /*** Definition for …...

【小白专用23.10.22 已验证】windows 11 安装PHP8.2 +Apache2.4

环境说明 windows:windows 11 x64apache: Apache/2.4.43php :php-8.2.11 一.php 1、PHP下载 PHP For Windows: Binaries and sources Releases 注意: 1.要下载Thread Safe,否则没有php8apache2_4.dll这个文件;如果使用Apache作为服务器…...

Nmap端口服务 之 CentOS7 关于启动Apache(httpd)服务、telnet服务、smtp服务、ftp服务、sftp服务

Nmap端口服务 之 CentOS7 关于启动Apache(httpd)服务、telnet服务、smtp服务、ftp服务、sftp服务 一. CentOS7 安装配置SFTP服务器详解一、SFTP简介二、关闭防火墙三、安装SSH服务在CentOS7中,sftp只是ssh的一部分,所以采用yum来安装ssh服务即可1. 查看是否已经安装了ssh2.…...

为什么 glBegin 未被定义 未定义的标识符,使用新的 API(LearnOpenGL P2)

文章目录 弃用的 glBegin & glEnd使用新 API 的示例 弃用的 glBegin & glEnd 环境:glfw 3.3.8 glad core OpenGL 初学者在尝试使用 glBegin 和 glEnd 函数来绘制三角形时,有可能找到使用这些函数的文章、代码文献 但许多这些函数已经在OpenG…...

C++多态、虚函数、纯虚函数、抽象类

多态的概念 通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 举个简单的例子:抢红包,我们每个人都只需要点击一下红包,就会抢到金额。有些人能…...

20231019_vue学习

引入vue.js: <script src"https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script> vue.js <script src"https://cdn.staticfile.org/vue-router/2.7.0/vue-router.min.js"></script> 路由vue模板语法 v-html:添加html模板…...

熟练使用 Redis 的五大数据结构:Java 实战教程

入门 入门阶段主要记住 Redis 的命令&#xff0c;熟练使用 Redis 的 5 大数据结构就可以了。 如果没有 Redis 环境&#xff0c;可以直接通过这个网址https://try.redis.io/&#xff0c;很赞&#xff0c;它会给你模拟一个在线的环境可供你尽情使用&#xff01; 熟练使用Redis的…...

【Linux】kill 命令使用

经常用kill -9 XXX 。一直在kill&#xff0c;除了kill -9 -15 &#xff0c;还能做什么&#xff1f;今天咱们一起学习一下。 kill 命令用于删除执行中的程序或工作。 kill命令 -Linux手册页 命令选项及作用 执行令 man kill 执行命令结果 参数 -l 信号&#xff0c;若果…...

面试-Redis-缓存雪崩

问&#xff1a;什么是缓存雪崩 ? 答&#xff1a;缓存过期是指设置缓存时都采用了同一过期时间&#xff0c;导致缓存在莫一时刻同时失效&#xff0c;从而请求全部全部打到数据库中&#xff0c;导致数据库压力过大而挂机。 它与缓存击穿的区别是&#xff1a;缓存击穿是一个key…...

AI全栈大模型工程师(九)Function Calling 的机制

文章目录 Function Calling 的机制Function Calling 示例 1:加法计算器Function Calling 实例 2:四则混合运算计算器后记Function Calling 的机制 Function Calling 示例 1:加法计算器 需求:用户输入任意可以用加法解决的问题,都能得到计算结果。 # 加载环境变量import o…...

音乐制作软件 Ableton Live 11 Suite mac中文版功能介绍

Ableton Live 11 Suite mac是一款专业级别的音乐制作软件&#xff0c;它提供了多种音乐制作和编辑功能&#xff0c;可以帮助用户创建各种音乐作品。界面简单直观&#xff0c;可以方便地进行各种音乐制作操作。它提供了丰富的音乐制作工具和功能&#xff0c;如录音、采样、编曲、…...

v-model和.sync区别

在vue2中提供了.sync修饰符&#xff0c;但是在vue3中不再支持.sync&#xff0c;取而代之的是v-model。 1.在vue2中v-model和.sync区别&#xff1a; 1.相同点&#xff1a;都是语法糖&#xff0c;都可以实现父子组件中的数据的双向通信。 ​ 区别在于往回传值的时候. sync 的 $…...

django cloudflare csrf 403

网站套了cloudflare flare发现登录接口403了&#xff0c;csrf验证失败&#xff0c; debug设置为False 详细报错如下&#xff1a; Reason given for failure: Referer checking failed - https://xxx/login does not match any trusted origins.In general, this can occur w…...

Hive 中级练习题(40题 待更新)

前言 最近快一周没更了&#xff0c;主要原因是最近在忙另一件事情&#xff08;关于JavaFX桌面软件开发&#xff09;&#xff0c;眼看大三上一半时间就要过去了&#xff0c;抓紧先学Hive&#xff0c;完了把 Spark 剩下的补了&#xff0c;还有 Kafka、Flume&#xff0c;任务还是…...

核酸检测人员安排

题目描述: 在系统、网络均正常的情况下组织核酸采样员和志愿者对人群进行核酸检测筛查。每名采样员的效率不同,采样效率为N人/小时。由于外界变化,采样员的效率会以M人/小时为粒度发生变化,M为采样效率浮动粒度,M=N10%,输入保证N10%的结果为整数。采样员效率浮动规则:采…...

Vue组件间传值

一、父传子 子组件中定义一个props&#xff0c;用来取出父组件传来的值 <script>export default {props:[msg] //子组件定义props} </script> 在父组件中对子组件的自定义属性绑定父组件的变量 <template><div class"parent">//子组件&a…...

《低代码指南》——维格云和Airtable的比较

Airtable​ 什么是Airtable​ Airtable 是一个任务管理应用程序,它合并了电子表格、数据存储和模板,以帮助组织构建他们的工作流程。 适用于哪些企业/组织/人群​ 根据 Airtable 网站,该工具被超过 200,000 个组织的团队使用。 维格表与Airtable相比如何​ Airtable作为…...

牛客:NC59 矩阵的最小路径和

牛客&#xff1a;NC59 矩阵的最小路径和 文章目录 牛客&#xff1a;NC59 矩阵的最小路径和题目描述题解思路题解代码 题目描述 题解思路 动态规划&#xff0c;递推公式&#xff1a;matrix[i][j] min(matrix[i-1][j], matrix[i][j-1]) 题解代码 func minPathSum( matrix [][…...

20231017定时任务

1. 构建定时任务 表达式生成 在线Cron表达式生成器 1.1 启动类 1.2 测试范例 描述: 1,将该类用Component描述,交给spring管理. 2,定时任务方法用Scheduled&#xff0b;cron表达式描述 2. 定时任务的弊端和优化方案 1.假如有一个定时任务,每小时检查关闭超时未支付订单,当10…...

告别拍脑袋:用攻击树和STRIDE模型为你的车联网服务做一次安全体检(含R155自查清单)

车联网安全实战&#xff1a;基于攻击树与STRIDE的威胁建模与合规自查指南 当你的车钥匙变成手机App&#xff0c;当远程启动成为标配功能&#xff0c;车联网服务在带来便利的同时&#xff0c;也打开了潘多拉魔盒。去年某豪华品牌被曝出通过蓝牙协议漏洞可无钥匙开走车辆&#x…...

终极免费PCB查看器:5分钟掌握OpenBoardView,轻松破解电路板设计难题

终极免费PCB查看器&#xff1a;5分钟掌握OpenBoardView&#xff0c;轻松破解电路板设计难题 【免费下载链接】OpenBoardView View .brd files 项目地址: https://gitcode.com/gh_mirrors/op/OpenBoardView 你是否曾面对复杂的.brd电路板文件感到无从下手&#xff1f;或者…...

终极指南:如何用RDKit化学信息学工具包从分子处理到机器学习实战

终极指南&#xff1a;如何用RDKit化学信息学工具包从分子处理到机器学习实战 【免费下载链接】rdkit The official sources for the RDKit library 项目地址: https://gitcode.com/gh_mirrors/rd/rdkit RDKit化学信息学工具包是处理分子结构数据和构建化学机器学习模型的…...

PCIe系列专题之二:2.4 TLP头部(Header)深度拆解与事务流控实战

1. TLP头部&#xff1a;PCIe通信的身份证 每次拆解PCIe协议时&#xff0c;我都会把TLP头部比作快递包裹的运单。想象你寄送一个贵重物品&#xff0c;运单上必须写明包裹类型&#xff08;文件/物品&#xff09;、加急等级、是否需要保价、收件人地址等信息。TLP头部同样承载着这…...

别再死记硬背BRDF公式了!用微表面模型和菲涅尔项,手把手教你写一个真实的PBR材质

从微表面到真实感&#xff1a;手把手实现PBR材质着色器 在图形学领域&#xff0c;物理真实感渲染(PBR)已经成为现代游戏和影视制作的标配技术。但很多开发者在学习PBR时&#xff0c;常常陷入复杂的数学公式推导而难以落地实践。本文将彻底改变这一现状——我们将直接从GAMES-10…...

3步掌握猫抓浏览器扩展:高效捕获网页媒体资源的实战指南

3步掌握猫抓浏览器扩展&#xff1a;高效捕获网页媒体资源的实战指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否经常遇到想要保存网页中…...

用PS2手柄和Arduino UNO做个遥控小车,手把手教你从接线到代码调试(附完整代码)

用PS2手柄和Arduino UNO打造智能遥控小车&#xff1a;从硬件搭建到代码实战 还记得小时候玩遥控车的兴奋感吗&#xff1f;现在&#xff0c;你可以亲手制作一台属于自己的智能遥控小车&#xff01;这个项目不仅能让你重温童年乐趣&#xff0c;还能学习到Arduino编程、电机控制和…...

百度网盘SVIP破解:Mac用户终极加速指南

百度网盘SVIP破解&#xff1a;Mac用户终极加速指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘缓慢的下载速度而烦恼吗&#xff1f;…...

【绝密级】AGI战场决策黑箱溯源技术首度解禁:如何用可解释性XAI逆向还原AI开火逻辑?——来自DARPA TRUST-AI项目的3项未公开专利方法

第一章&#xff1a;AGI与军事应用的伦理边界 2026奇点智能技术大会(https://ml-summit.org) 通用人工智能&#xff08;AGI&#xff09;在军事系统中的深度集成正以前所未有的速度推进&#xff0c;从自主侦察分析到动态战术推演&#xff0c;其能力已超越传统自动化范畴。然而&…...

ESP32音频播放终极方案:多格式解码与I2S输出的完整指南

ESP32音频播放终极方案&#xff1a;多格式解码与I2S输出的完整指南 【免费下载链接】ESP32-audioI2S Play mp3 files from SD via I2S 项目地址: https://gitcode.com/gh_mirrors/es/ESP32-audioI2S ESP32-audioI2S是一个专为ESP32多核芯片设计的专业级音频播放库&#…...