Python中的函数(二)

1 闭包与装饰器

1.1 闭包

闭包(Closure)是指在一个函数内部定义的函数,并且该内部函数可以访问外部函数作用域中的变量。闭包可以在外部函数执行完毕后,仍然保持对外部函数作用域的引用,从而可以继续访问和操作外部函数作用域中的变量。

闭包需要满足以下三个条件:

  1. 外部函数嵌套内部函数

  2. 外部函数将内部函数返回

  3. 内部函数可以访问外部函数的局部变量

def f1():print("f1")i = 0def f2():# nonlocal 相当于global 但是nonlocal使用的是外部函数的局部变量nonlocal ii += 1print("f2", i)return f2r = f1()
r()

这段代码定义了一个外部函数 f1,它返回内部函数 f2 的引用。在 f1 内部,我们定义了一个变量 i 并将其初始化为 0

内部函数 f2 使用 nonlocal 关键字声明了变量 i,以便它可以访问和修改 f1 函数作用域中的变量 i

当我们调用 f1() 时,它返回了内部函数 f2 的引用,并将外部函数作用域中的变量 i 设置为 0。我们将这个返回的函数引用赋值给变量 r

接下来,我们调用 r(),实际上是调用了内部函数 f2。每次调用 r(),它都会将变量 i 的值加 1,然后打印出 f2 和当前的 i 值。由于 i 是外部函数作用域中的变量,并且闭包可以保留对外部函数作用域的引用,因此每次调用 r() 都会使用同一个 i 变量。

1.2 装饰器

装饰器(Decorator)是Python中一种用于修改函数或类的行为的特殊语法。装饰器可以在不修改原始函数或类代码的情况下,添加额外的功能或行为。

装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数(也可以是类)。这个新函数通常会包装原始函数,对其进行一些额外的操作,然后返回结果。

装饰器在Python中被广泛应用,可以用于实现日志记录、性能统计、权限验证、缓存等各种功能。它为我们提供了一种优雅而灵活的方式来修改和扩展函数或类的行为。

步骤:

  1. 定义三个基本函数
  2. 编写闭包
  3. 使用闭包加工原始3个函数
  4. 给闭包添加权限校验
  5. 函数调用
def login_required(f):def check():username = input("请输入用户名")if username == "admin":f()else:print("用户校验失败")return check@login_required
def index():print("欢迎来到")index()@login_required
def cart():print("欢迎来到购物车")cart()@login_required
def mine():print("欢迎来到我的")mine()

这段代码定义了一个装饰器函数 login_required,它接受一个函数 f 作为参数。装饰器函数内部定义了一个新的函数 check,用于校验用户登录状态。

在每个被装饰的函数之前,我们会调用 login_required 函数,并将被装饰的函数作为参数传递给它,这样就将被装饰的函数替换成了 check 函数。

当我们调用被装饰的函数时,实际上是调用了 check 函数。在 check 函数内部,我们首先要求用户输入用户名,并进行校验。如果用户名为 "admin",则说明用户校验通过,我们会调用原始的被装饰函数 f;否则,打印出 "用户校验失败"。

通过这样的装饰器机制,我们可以在每次调用被装饰的函数之前进行用户登录的校验。

练习:
随机0-1000以内的500个数字放入列表,使用冒泡排序与选择排序对列表进行升序
编写装饰器 统计 两个方法的时间开销

# 导入模块
import time
import random# 随机生成500个数
def get_value(n):l0 = []for i in range(n):value = random.randint(0, 1000)l0.append(value)return l0l1 = get_value(500)# 编写装饰器 统计 两个方法的时间开销
def count(f):def count_f():time1 = time.time()f()print(time.time() - time1)return count_f@count
def bubble():for i in range(len(l1)):for j in range(i + 1, len(l1)):if l1[i] > l1[j]:l1[i], l1[j] = l1[j], l1[i]return l1@count
def select():for i in range(len(l1)):min_value = ifor j in range(i + 1, len(l1)):if l1[j] < l1[min_value]:min_value = jl1[i], l1[min_value] = l1[min_value], l1[i]return l1bubble()
select()

2 内置函数

2.1 len()求长度

print(len("hello"))

2.2 数学方面

2.2.1 abs 取绝对值

print(abs(-50))

2.2.2 divmod 求整除和余

以元组形式返回,第一个为整除结果,第二个为求余结果

print(divmod(100, 3))

2.2.3 pow 次方

print(pow(2, 3))

2.2.4 round 四舍五入

print(round(3.14))

2.2.5 sum 求和

print(sum(i for i in range(10)))

2.3 all 和any

all  所有元素都是真,结果就是真;如果内容为空,返回真

any  所有元素都是假,结果就是假;如果内容为空,返回假

# 所有元素都为真,结果就是真   如果内容为空结果为真
print(all([10, 1, True]), all([]))
# 有一个为真就为真  如果内容为空就为假
print(any([10, 0, False]), any([]))

2.4 进制转换

(1)bin 十进制转二进制

(2) hex 十进制转十六进制

(3) oct 十进制转八进制

print(bin(10))
print(oct(10))
print(hex(10))

2.5 callable 可调用函数

print(callable(10), callable(lambda x: x))

2.6  ASCII码

  1.  chr 将ASCII码值转字符
  2.  ord 将字符转为ASCII码值
  3.  sorted 按照ASCII码值排序
print(chr(97), ord("A"))
print(sorted("hello world"))

2.7 局部与全局

2.7.1 locals 局部

返回所有局部变量,在函数内部使用

num = 100
s0 = "hello"
def f():i = 99result2 = locals()print(result2)
f()result = globals()
print(result)

2.7.2 globals 全局

返回全局变量

2.8 输入与输出

(1)input

(2)print

a = input("请输入")
print(a)

2.9 最大与最小

2.9.1 max 最大

2.9.2 min最小

print(max([10,20,30]))
print(max([{"age": 15}, {"age": 5}, {"age": 25}], key=lambda x: x["age"]))
print(min([{"age": 15}, {"age": 5}, {"age": 25}], key=lambda x: x["age"]))

2.10 id 返回对象唯一标识


l0 = [1, 2, 3, 4, 5]
print(id(l0))

2.11 将来要学习的

(1)delattr    删除属性
(2)getattr    获取属性
(3)hasattr    是否有属性
(4)setattr    设置属性

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

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

相关文章

【Java】--网络编程:基于TCP协议的网络通信

【Java】–网络编程&#xff1a;基于TCP协议的网络通信 文章目录 【Java】--网络编程&#xff1a;基于TCP协议的网络通信一、TCP协议1.1 概念1.2 三次握手1.2.1 文字描述1.2.2 画图演示 1.3 四次挥手1.3.1 文字描述1.3.2 画图演示 二、基于TCP的Socket网络编程2.1 概念2.2 服务…

Kafka-服务端-网络层

Reactor模式 Kafka网络层采用的是Reactor模式&#xff0c;是一种基于事件驱动的模式。熟悉Java编程应该了解JavaNIO提供了实现Reactor模式的API。常见的单线程Java NIO的编程模式如图所示。 为了满足高并发的需求&#xff0c;也为了充分利用服务器的资源&#xff0c;服务端需要…

中间件存储设计 - 数组与链表

文章目录 数组ArrayListLinkedListHashMap小结 中间件主要包括如下三方面的基础&#xff1a;数据结构、JUC 和 Netty&#xff0c;接下来&#xff0c;我们先讲数据结构。 数据结构主要解决的是数据的存储方式问题&#xff0c;是程序设计的基座。 按照重要性和复杂程度&#xf…

Python fork方法:创建新进程

除可以进行多线程编程之外&#xff0c;Python 还支持使用多进程来实现并发编程。 Python 的 os 模块提供了一个 fork() 方法&#xff0c;该方法可以 fork 出来一个子进程。简单来说&#xff0c;fork() 方法的作用在于&#xff0c;程序会启动两个进程&#xff08;一个是父进程&…

《WebKit 技术内幕》学习之十(1): 插件与JavaScript扩展

虽然目前的浏览器的功能很强 &#xff0c;但仍然有其局限性。早期的浏览器能力十分有限&#xff0c;Web前端开发者希望能够通过一定的机制来扩展浏览器的能力。早期的方法就是插件机制&#xff0c;现在流行次啊用混合编程&#xff08;Hybird Programming&#xff09;模式。插件…

大模型实战营 Day5作业

基础作业&#xff1a; 使用 LMDeploy 以本地对话、网页Gradio、API服务中的一种方式部署 InternLM-Chat-7B 模型&#xff0c;生成 300 字的小故事&#xff08;需截图&#xff09; TurboMind 推理命令行本地对话 lmdeploy chat turbomind /share/temp/model_repos/internlm-cha…

RK3568平台 TinyAlsa集成第三方音频算法

一.tinyalsa介绍 ALSA&#xff08;Advanced Linux Sound Architecture&#xff09;是一个开源项目&#xff0c;涵盖了用户空间和内核空间对音频设备的操作接口&#xff0c;通过应用层使用alsalib可以实现对音频设备的控制 TinyAlsa是android推出的一个精简的ALSA库&#xff0c…

【教程】npm的时候ssh报错ssh://git@github.com/frozeman/bignumber.js-nolookahead.git

问题&#xff1a; fiscoubuntu:~/fisco/benchmarks$ npm install install web30.20.7 npm ERR! code 128 npm ERR! An unknown git error occurred npm ERR! command git --no-replace-objects ls-remote ssh://gitgithub.com/frozeman/bignumber.js-nolookahead.git npm ERR! …

Spring Cloud 系列:Seata 中TCC模式具体实现

概述 https://seata.io/zh-cn/docs/dev/mode/tcc-mode https://seata.io/zh-cn/docs/user/mode/tcc TCC模式与AT模式非常相似&#xff0c;每阶段都是独立事务&#xff0c;不同的是TCC通过人工编码来实现数据恢复。需要实现三个方法&#xff1a; Try&#xff1a;资源的检测和…

第4章-IP基本原理

目录 1. IP协议概述 1.1. 定义 1.2. 功能 1.3. IP网络的结构 1.4. IP头格式 2. IP地址和地址映射 3. IP包转发 4. 其他相关协议介绍 1. IP协议概述 1.1. 定义 IP协议&#xff1a;IP协议是网际互连协议&#xff1b; 工作层次&#xff1a;网络层&#xff1b; 封装&#…

dubbo:服务暴露

节点角色说明&#xff1a; Provider:暴露服务的服务提供方。 Consumer::调用远程服务的服务消费方。 Registry:服务注册与发现的注册中心。 Monitor:统计服务的调用次调和调用时间的监控中心。 Container:服务运行容器。 调用关系说明&#xff1a; 0.服务容器负责启动&#xff…

HTML+JavaScript-03

JavaScript函数 定义函数的格式 JavaScript 函数是通过 function 关键词定义的。 function sum(a, b){//函数体return a b;//返回值为a、b的和 }函数的调用 调用函数时直接书写函数名即可 function show(){alert("函数show被调用"); } show();函数的相互调用 …

使用Docker部署Apache Superset结合内网穿透实现远程访问本地服务

文章目录 前言1. 使用Docker部署Apache Superset1.1 第一步安装docker 、docker compose1.2 克隆superset代码到本地并使用docker compose启动 2. 安装cpolar内网穿透&#xff0c;实现公网访问3. 设置固定连接公网地址 前言 Superset是一款由中国知名科技公司开源的“现代化的…

PSEUDO-LIDAR++:自动驾驶中 3D 目标检测的精确深度

论文地址&#xff1a;PSEUDO-LIDAR: ACCURATE DEPTH FOR 3D OBJECT DETECTION IN AUTONOMOUS DRIVING 论文代码&#xff1a;https://github.com/mileyan/Pseudo_Lidar_V2 摘要 3D 检测汽车和行人等物体在自动驾驶中发挥着不可或缺的作用。现有方法很大程度上依赖昂贵的激光雷…

华为数通方向HCIP-DataCom H12-831题库(判断题:81-100)

第81题 基本QinQ能根据业务种类选择外层Tag封装的方式 正确 错误 答案: 错误 解析: 基本QinQ是基于端口方式实现的,不能根据业务种类选择外层TAG封装的方式。 第82题 display interface GE0/0/0-次,发现Total Error计数(该接口物理层的错误报文总数目)不是此时可以断定当前…

登录页面(附源码)

特色&#xff1a; 点击登录之后卡片翻转效果 话不多说&#xff0c;看展示。 还在等什么&#xff0c;赶快白嫖起来吧 HTML文件 <div id"window" style"display: none"><div class"page page-front"><div class"page-content&…

SCCB接口

文章目录 概述引脚传输时序起始/结束信号三线模式两线模式 传输周期3阶段写传输周期2阶段写传输周期2阶段读传输周期阶段一 ID Address阶段二 子地址/读数据阶段三 写数据 SCCB与IIC区别未完待续(还有代码&#xff09;... 概述 SCCB&#xff08;Serial Camera Control Bus&…

aspose-cells-20.7.jar 去除水印及次数限制

1.使用 jd-gui.exe 反编译查看&#xff0c;直接搜索 License 1.修改 public static boolean isLicenseSet() {return (a ! null);}改成 public static boolean isLicenseSet() {return true;}2.修改 public void setLicense(InputStream stream) {Document document null;if (…

【EI会议征稿通知】2024年第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024)

2024年第四届人工智能、自动化与高性能计算国际会议&#xff08;AIAHPC 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Automation and High Performance Computing 2024第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024)将于20…

SpringMVC:拦截器

一般我们会做一些统一的操作这个时候我们需要使用springmvc提供的拦截器&#xff0c;例如token的验证&#xff0c;字段必填的操作&#xff0c;接口超时判断&#xff0c;签名验证&#xff0c;字段加密等操作&#xff0c;所以我们需要了解执行先后顺序。 我们来简单介绍下实现过程…