Python基础学习(8)函数进阶-闭包/装饰器

文章目录

  • 一,闭包函数
    • 二,装饰器(重要)
  • 三,递归

Python基础学习(1)基本知识
Python基础学习(2)序列类型方法与数据类型转换
Python基础学习(3)进阶字符串(格式化输出)
Python基础学习(4)散列类型(无序序列)
Python基础学习(5)流程控制
Python基础学习(6)函数基础与函数参数
Python基础学习(7)函数作用域与名称空间.
Python基础学习(8)函数进阶-闭包/装饰器
Python基础学习(9)迭代器/生成器

一,闭包函数

闭: 封闭 嵌套函数

包: 对数据进行的操作函数(就是内层函数)
条件:

1.必须是一个嵌套函数
2.外层函数必须返回内层函数
3.内层函数必须操作外层函数数据
# 大胃王比赛
food = 0# 挑战碗数
def f1():global foodfood += 1  # 需要修改每次吃完的次数# print(food)
f1()
print(food)
f1()
print(food)
# 没有封闭 很容易被修改
food = 0
print(food)
语法格式:def 外层函数名():def 内层函数名():代码块return 内层函数名 # 这里的返回值是外层函数
# 闭包
def food1():bowl=0def f():nonlocal bowlbowl+=5 #  bowl=bowl+5return bowlreturn fa=food1() # 获取函数里的数据内存地址
print(a()) # 内层函数第一遍运行
print(a()) # 内层函数第二遍运行
bowl=0
print(a()) # 不会变了 在给函数被多次调用的过程中 让这些私有变量能够保持起持久性
# 判断 是否是闭包函数
print(a.__closure__) # cell 是闭包
print(food1.__closure__)#不是闭包
print(f.__closure__) # 报错 内层函数是闭包 但是因为被外层函数封闭起来了 无法直接查询

二,装饰器(重要)

掌握了闭包 相当于装饰器就掌握好了

因为装饰器最基本的样子就是闭包函数

装饰器: 在不修改源代码和调用方式的情况下 给函数添加功能

器: 工具

装饰: 添加功能

开放: 扩展功能(增加功能)

封闭:对修改源代码封闭

开发一款程序 这个程序应该是可拓展 但是不能修改
要是想修改源代码 肯定这个程序就会终止运行

import time
def play(food, s):print('饿了就点饿了么')print(f'这个夜宵{food}非常好吃')print(f'外卖还有多少{s}秒送达')time.sleep(s)  # 程序休眠 执行时间def get_time(f):#装饰器装饰play(在不改变play的情况下)def calc(*args, **kwargs):start = time.time()f(*args, **kwargs)end = time.time()print(end - start)return calcfun = get_time(play)
fun('螺蛳粉', 3)
def 煎饼果子():print('我是煎饼果子')def 火锅():print('我是火锅')def 加工(f): # 准备加工的东西 f形参   哪个函数需要添加功能def 加料():f() # 加工的食材拿出来print('加包卫龙') # 添加的功能return 加料 # 原本的东西加工后的结果

装饰器是 Python 中一种强大且灵活的功能,它的作用主要包括以下几个方面:

  1. 代码复用:装饰器可以将一些通用的功能封装起来,然后应用到多个函数中,实现代码的复用,避免重复编写相同的代码。

  2. 增强函数功能:通过装饰器,可以在不修改原函数代码的情况下,为函数添加额外的功能,比如日志记录、性能统计、权限校验等。

  3. 解耦合:装饰器可以将函数的核心逻辑与其他功能进行解耦合,使得代码更加清晰、易于维护。

  4. 动态扩展:装饰器可以在运行时动态地为函数添加或修改功能,使得程序在不停止运行的情况下进行功能的扩展。

  5. 提高代码可读性:通过装饰器,可以将一些与核心逻辑无关的代码抽离出来,使得函数的功能更加清晰明了,提高代码的可读性。

  6. 面向切面编程(AOP):装饰器是实现面向切面编程的一种重要方式,可以在不修改原函数代码的情况下,为函数添加横切关注点,比如日志、事务管理等。

总的来说,装饰器是一种强大的工具,可以帮助我们实现代码复用、功能增强、解耦合、动态扩展等目的,提高代码的可维护性和可读性,是 Python 编程中常用的技术手段之一。

三,递归

递归函数: 定义一个函数 函数内部自己调用自己

并且这个操作可以停止

写递归的时候要有明确递归出口

def factorial(n):if n==0:return 1return n*factorial(n-1)
print(factorial(4))

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

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

相关文章

深入探索:倒序排列技术的多样化实现

深入探索:倒序排列技术的多样化实现 在编程实践中,倒序排列是一项常见且关键的操作,尤其当我们需要按照从大到小的顺序处理数据集合时。本文旨在深入探讨各种编程语言中实现数组或列表倒序排列的技术,并提供具体的示例代码。 一…

蓝牙系列五:开源蓝牙协议BTStack框架代码阅读(1)

蓝牙学习系列,借鉴卫东上老师的蓝牙视频教程。 BTStack协议栈学习。首先来看一下,对于硬件操作,它是如何来进行处理的。在上篇文章中曾说过,在main函数里面它会调用硬件相关的代码,调用操作系统相关的代码。在BTStack中,可以搜索一下main.c,将会发现有很多main.c,都是…

学会与自己和解

最近半年来,在学习智能驾驶方面的技术,但有些文档和资料不方便分享,有一段时间没有写 写文档啦!那就写一些技术之外的东西吧,最近也一直在学心理建设,学会与自己和解 行动 唯有自己先行动起来,…

使用Migration升级数据库

使用Migration升级数据库 package com.tiger.room2;import android.content.Context;import androidx.annotation.NonNull; import androidx.room.Database; import androidx.room.Room; import androidx.room.RoomDatabase; import androidx.room.migration.Migration; impo…

openssl3.2 - exp - PEM <==> DER

文章目录 openssl3.2 - exp - PEM <> DER概述笔记加密用的私钥(带口令保护) - PEM > DER加密用的私钥(不带口令保护) - DER > PEM将不带口令的PEM转成带口令的PEM支持口令的算法备注END openssl3.2 - exp - PEM <> DER 概述 想将客户端私钥 服务端公钥 数…

Jmeter---非GUI命令行的执行生成报告、使用ant插件执行接口测试脚本生成报告

非GUI命令行的执行 1. 在jmx后缀的文件目录下打开命令行 2. 运行&#xff1a; jmeter -n -t filename.jmx&#xff08;-n : 非GUI的方式 -t: 指定需要执行的脚本&#xff09; 生成jtl报告 运行&#xff1a; jmeter -n -t filename.jmx -l result_filename.jtl 生成html报…

【Java探索之旅】数据类型与变量,字面常量,整型变量

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java入门到精通 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、字面常量二、数据类型三、变量3.1 变量概念3.2 语法格式 四、整型变量4.1 整型变…

覆盖element-ui的el-menu样式记录:背景图片、菜单图标、菜单高亮与鼠标悬浮高亮、调整子菜单等样式

页面中修改el-menu 设置background-color"transparent"&#xff0c;menu菜单下的背景图片则能正常显示了 <el-menuclass"el-menu-demo"mode"horizontal"background-color"transparent"><el-menu-item index"1">…

npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.

npm install时报错code CERT_HAS_EXPIRED 一、报错情况 二、解决方案 一、报错情况 npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/vue-loader failed, reason: certificate has expirednpm ERR!…

【Python+Selenium学习系列5】Selenium特殊元素定位之-鼠标悬停操作

前言 Selenium模拟用户在浏览器中的操作&#xff0c;比如点击按钮。在某些场景下&#xff0c;我们需要模拟鼠标悬停的操作&#xff0c;来触发一些隐藏的元素。本文将介绍Python Selenium实现鼠标悬停操作。 鼠标悬停&#xff0c;即当光标与其名称表示的元素重叠时触发的事件&…

【学一点RISC-V】ACLINT(高级核心本地中断控制器)文档

RISCV架构 ACLINT文档 ACLINT原文档&#xff1a;https://github.com/riscv/riscv-aclint/blob/main/riscv-aclint.adoc 在这里进行了翻译以及校对&#xff0c;仅供参考&#xff0c;不正确的地方欢迎指出 1、介绍 【此 RISC-V ACLINT 规范定义了一组内存映射设备&#xff0c;这…

14.Webpack 简介以及使用

1. 概念&#xff1a; Webpack 是一个静态模块打包工具&#xff0c;从入口构建依赖图&#xff0c;打包有关的模块&#xff0c;最后用于展示你的内容 2. 静态模块&#xff1a; 编写代码过程中的&#xff0c;html&#xff0c;css&#xff0c; js&#xff0c;图片等固定内容的文件…

ExecutorService

常用ExecutorServicecurrentThreadSize < coreThreadSize --> create a new threadcurrentThreadSize coreThreadSize --> queue submitted task queue submitted task is full & currentThreadSize <maxPoolSize --> create a new thread queue is full…

C++知识点总结(24):数据结构与栈

数据结构与栈 一、概念1. 数据2. 数据结构3. 数据结构分类 二、栈1. 栈2. 相关概念2.1 入栈2.2 出栈2.3 栈的特点2.4 栈顶2.5 栈底2.6 栈顶元素2.7 栈底元素 三、数组模拟栈1. 初始化空栈2. 入栈3. 出栈4. 获取栈顶元素5. 判断栈是否为空6. 获取栈内元素个数 四、栈的运用1. 括…

[java入门到精通] 11 泛型,数据结构,List,Set

今日目标 泛型使用 数据结构 List Set 1 泛型 1.1 泛型的介绍 泛型是一种类型参数&#xff0c;专门用来保存类型用的 最早接触泛型是在ArrayList&#xff0c;这个E就是所谓的泛型了。使用ArrayList时&#xff0c;只要给E指定某一个类型&#xff0c;里面所有用到泛型的地…

「连载」边缘计算(二十八)03-08:边缘部分源码(源码分析篇)

&#xff08;接上篇&#xff09; eventbus的具体逻辑剖析 从eventbus的启动函数切入分析具体逻辑&#xff0c;具体如下所示。 KubeEdge/edge/pkg/eventbus/event_bus.go func (eb *eventbus) Start(c *context.Context) { // no need to call TopicInit now, we have fixed …

公众号IP白名单已添加服务器IP 122.88... 依然给出 40164 错误

公众号的IP白名单已添加 122.88... 依然给出 40164 错误。 {"errcode":40164,"errmsg":"invalid ip 122.88... ipv6 ::ffff:122.88..., not in whitelist rid: 65e85a07-458dfc0d-16003e03"} 解决方案&#xff1a; 一、检查 AppID 是否正确&…

STM32基本定时功能

1、定时器就是计数器。 2、怎么计数&#xff1f; 3、我们需要有一恒定频率的方波信号&#xff0c;再加上一个寄存器。 4、比如每来一个上升沿信号&#xff0c;寄存器值加1&#xff0c;就可以完成计数。 5、假设方波频率是100Hz&#xff0c;也就是1秒100个脉冲。…

ElasticSearch 模糊查询

前缀搜索 # 前缀搜索 注意&#xff1a; 前缀搜索匹配的是trem,而不是filed&#xff0c;倒排索引的分词 性能比较差&#xff0c;没有缓存 搜索时尽量把前缀词设置长一点 GET /product/_search {"query": {"prefix": {"name": {"value"…

【学习】DLA (Deep Layer Aggregation)

本研究是有由UC Berkeley的Trevor Darrell组发表于2018年CVPR。因为&#xff0c;工作中应用到CenterNet&#xff0c;文章中使用了DLA作为backbone&#xff0c;能够以较高的速度完成推理并维持较高的AP。 DLA文章&#xff1a;论文 DLA 在实际操作中&#xff0c;常常将高级特征…