Python中的函数(二)

news2024/9/30 1:30:14

1 闭包与装饰器

1.1 闭包

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

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

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

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

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

def f1():
    print("f1")
    i = 0

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

    return f2


r = 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 l0


l1 = 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 = i
        for j in range(i + 1, len(l1)):
            if l1[j] < l1[min_value]:
                min_value = j
        l1[i], l1[min_value] = l1[min_value], l1[i]

    return l1


bubble()
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 = 99

    result2 = 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.coloradmin.cn/o/1403119.html

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

相关文章

银河麒麟桌面桌面操作系统v10保姆级安装

目录 一、下载ISO映像文件 1.产品试用申请 2.试用版下载 二、虚拟机搭建 1.新建虚拟机 2. 选择虚拟机硬件兼容性 3.选择安装客户机操作系统 4.选择客户机操作系统 5.命名虚拟机 6.处理器配置 7.虚拟机内存 8.网络类型 9.硬件 10.指定磁盘容量 三、修改虚拟…

「优选算法刷题」:在排序数组中查找元素的第一个和最后个位置

一、题目 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1&a…

【Linux】解决普通用户无法进行sudo提权

当某个普通用户进行sudo指令提权的时候&#xff0c;可能存在无法操作的问题&#xff0c;如下图&#xff1a; 这个图中有一个细节&#xff0c;我们使用sudo进行提权的时候&#xff0c;用的可是zhangsan的密码&#xff0c;因此有人可能会有疑问&#xff0c;这不是有问题吗&#x…

在CentOS 7中配置 RAID服务

实验过程 Xnode1克隆虚拟机raid ps&#xff1a; 阿里云盘Xnode1获取 xnode1 https://www.alipan.com/s/HgLXfoeBWG2 提取码: eb70 编辑虚拟机 添加2硬盘 CRT连接&#xff08;root密码&#xff1a;000000&#xff09; 创建raid 0 [rootdemo ~]# lsblk 安装mdadm [rootdemo…

数据结构之栈的基本操作

该顺序栈涉及到了存储整型数据的顺序栈还有存储字符型数据的顺序栈 实现的功能有&#xff1a;入栈、出栈、判断是否为空栈、求栈的长度、清空栈、销毁栈、得到栈顶元素 此外根据上述功能&#xff0c;编写了数值转换&#xff08;十进制转化八进制&#xff09;方法、括号匹配方法…

无人机航迹规划(四):七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划(提供MATLAB代码)

一、七种算法&#xff08;DBO、LO、SWO、COA、LSO、KOA、GRO&#xff09;简介 1、蜣螂优化算法DBO 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖…

【ARM 嵌入式 编译系列 7.3 -- GCC 链接脚本中 DISCARD 与 .ARM.exidx】

请阅读【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 文章目录 背景.ARM.exidx方法一:使用链接器脚本方法二:使用链接器选项注意事项背景 在移植 RT-Thread 到 cortex-m33(RA4M2)上的时候,在编译的时候遇到下面问题: Building target: ra4m2.elf arm

Gitee Reward让开源作者不再为爱发电

一、什么是Gitee Reward&#xff1f; Gitee Reward是Gitee为改善开源开发生命周期提出的新策略。开源项目的支持者们可以更轻松地为其喜爱的项目提供资金&#xff0c;贡献者们也可以因为其不懈的开源贡献得到奖励。 二、Gitee Reward上允许哪些类型的项目&#xff1f; 允许任…

DL专栏—笔记目录

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; 本专栏主要是记录工作中、学习中关于AI(Deep Learning)相关知识并分享。 &#x1f60a;&#x1f60a;&#x1f…

广告灯(利用取表方式)

1&#xff0e;  实验任务 利用取表的方法&#xff0c;使端口P1做单一灯的变化&#xff1a;左移2次&#xff0c;右移2次&#xff0c;闪烁2次&#xff08;延时的时间0.2秒&#xff09;。 2&#xff0e;  电路原理图 3&#xff0e;  系统板上硬件连线 把“单片机系统”区域中…

机器学习:holdout法(Python)

import pandas as pd import numpy as np from sklearn.preprocessing import LabelEncoder, StandardScaler # 类别标签编码&#xff0c;标准化处理 from sklearn.decomposition import PCA # 主成分分析 import matplotlib.pyplot as plt from sklearn.model_selection impor…

Unity3D学习之数据持久化——XML

文章目录 1. 前言2. XML 基本语法2.1 固定语法&#xff08;重要&#xff09;2.2 注释2.3 基本语法2.4 基本规则2.5 xml 属性2.6 验证语法错误2.7 C#对象和XML的手动转换 3. C#读取存储XML3.1 创建xml3.2 C# 读取xml文件3.2.1 通过Resources文件进行读取3.2.2 通过xml文件进行加…

linux docker-compose安装失败解决

1.去github下载到本地 https://github.com/docker/compose/releases/ 2.上传到linux 服务器 mv dokcer-compose-linux-x86_64 /usr/loacal/bin/docker-compose 3.给权限 chmod x /usr/local/bin/docker-compose 4.查看是否安装成功 docker-compose -version 5.卸载 …

基于JAVA和微信小程序的智慧家政系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询家政服务4.2 新增单条服务订单4.3 新增留言反馈4.4 小程序登录4.5 小程序数据展示 五、免责说明 一、摘要 1.1 项目介绍 基于微信小程序JAVAVueSpringBootMySQL的智慧家政系统&#xff0…

Vue.js在养老院管理系统前端开发中的应用与优化

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

如何编写有效的WBS?

1. 项目WBS的定义和概念 项目WBS指的是工作分解结构(Work Breakdown Structure),是项目管理中一种重要的组织和规划工具。WBS通过将整个项目分解为可管理的、便于控制和监督的工作包或阶段,帮助项目团队清晰地理解项目的目标和任务,从而更好地进行项目计划和执行。WBS可以…

19万9的小米SU7已经彻底被否了

文 | AUTO芯球 作者 | 李诞 雷总 您是真不听劝啊 还要准备和米粉“干一架”啊 我和大家一样啊 这下好了 19万9的小米SU7已经彻底被否了 说实话 我心理真不是滋味 毕竟大家都说了&#xff0c; 9.9是雷爹&#xff0c;9万9是雷帝&#xff0c;15w是雷神 19万是雷总&#x…

单链表(C/C++)

本篇将给出单链表的实现&#xff0c;头部插入/删除&#xff0c;尾部插入/删除&#xff0c;元素查找&#xff0c;指定位置前插入数据&#xff0c;指定位置之后插入元素&#xff0c;删除当前元素&#xff0c;删除当前元素之后的元素。 在给出这些操作&#xff0c;先给出单链表的定…

Jupyter Notebook安装以及简单使用教程

Jupyter Notebook安装以及简单使用教程 本文章将&#xff0c;简要的讲解在已经拥有Python环境下如何进行Jupyter Notebook的安装。并且简短的介绍Jupyter Notebook的使用方法。 Jupyter Notebook是什么 Jupyter Notebook是一个基于Web的交互式计算环境&#xff0c;它支持多种…