9-什么是迭代器,生成器,装饰器、django的信号用过吗?如何用,干过什么、什么是深拷贝,什么是浅拷贝,如何使用、slice操作符和list构造函数
1 什么是迭代器,生成器,装饰器
2 django的信号用过吗?如何用,干过什么
3 什么是深拷贝,什么是浅拷贝,如何使用
3.1 浅拷贝
3.2 深拷贝
3.3 扩展(slice操作符和list构造函数)
1 什么是迭代器,生成器,装饰器
迭代:一种不依赖于索引取值的方式,我们不需要关注它的位置,只要能够一个个取值,它就称之为迭代-基于索引,下标的取值-不依赖于索引,没有位置的表示-for循环, next()可迭代对象:可以迭代的(for,next取值的)python中的对象称之为可迭代对象在python中可以被for循环或可以 变量.next() 取值的对象称之为可迭代对象有 :字典,列表,字符串,元组,集合,文件对象迭代器:可迭代对象调用__iter__,就得到了迭代器,迭代器有__iter__和__next__方法自定义迭代器:写个类,类中重写__iter__和__next__方法,这个类的对象就是迭代器生成器:生成器本质就是迭代器,迭代器不一定是生成器函数中只要有 yield 关键字,这个函数被调用 函数(),它就变成了生成器生成器表达式,也可以做出生成器 (i+1 for i in [1,2,3])比如有一堆数据,要放到列表中,但 你没放,而放到了生成器中for 循环生成器---》可以惰性取值,可以节省内存在哪里用过生成器?-读取文件,for循环文件 内部其实就是在用生成器-我猜测:django中orm 查询一个表所有内容 Book.objects.all()--->内部应该也是一个生成器-redis hascan 和 hsacn_iter-类似于这种场景我是可以用到它的:比如我要取数据,但是数据量比较大,不要一次性把把数据取到内存中,而是一点点取值,这样就可以把它做成一个生成器,可以节约内存 装饰器:本身是一个闭包函数,作用是在不改变 被装饰对象源代码和调用方式的基础上,为它加入新功能flask的路由就是基于装饰器django的信号也可以用装饰器方式注册django中局部去除csrf认证为接口记录访问日志认证,权限装饰器。。闭包函数:1 定义在函数内部 2 对外部作用域有引用多了一种给函数传参的方式典型应用就是装饰器所有语言都有闭包函数---》所有语言就可以实现装饰器--》但是没有装饰器的语法糖
2 django的信号用过吗?如何用,干过什么
1 django信号是什么?django提供的一种通知机制,他是设计模式观察者模式(发布订阅),在发生某种变化的时候,通知某个函数执行-23种设计模式:https://www.cnblogs.com/liuqingzheng/p/10038958.html2 如何用---》内置信号 自定义信号1 内置信号:如果是内置信号用起来简单,只需要写个函数,跟内置信号绑定,当信号被触发,函数就会执行-绑定信号,在django中有两种方式@receiverconnect连接2 自定义信号:就比内置信号多了两步:1 定义信号 2 触发信号 信号.send3 使用场景:记录日志(book插入一条数据就记录日志)用户密码修改,发送邮件通知一旦生成订单,干xx事数据库中插入数据,把数据同步到别的位置4 补充python发邮件:参考博客:https://www.cnblogs.com/liuqingzheng/articles/10072695.html# 钉钉通知 django集成钉钉通知5 观察者模式:也叫发布-订阅模式定义:对象间一种一对多的依赖关系,使得当该对象状态改变时,所有依赖于它的对象都会得到通知,并被自动更新6 通过信号实现,只要book表插入一条记录,redis就跟着同步数据库中:id name price publish1 金瓶梅 29 北京出版社redis:[{id:1,name:金瓶梅,price:29,publish:北京出版社}]# book=Book.object.create(**request.data)# 使用信号def xx(*arg,**kwargs):if book表conn.rpush('key',json.dumps({})信号.connect(xx)
3 什么是深拷贝,什么是浅拷贝,如何使用
# 无论深拷贝还是浅拷贝都是用来 复制对象的
# 如果是浅copy,只会复制一层,如果copy的对象中有可变数据类型,修改可变数据类型还会影响拷贝的对象
# 如果是深copy,完整复制,无论可变或不可变,都是创建出新的来,以后再改原对象,都不会对copy出的对象造成影响浅拷贝和深拷贝是Python中两种常用的复制对象的方法。1 浅拷贝创建一个新对象,但是这个新对象只是原始对象的一个引用;而深拷贝创建一个新对象,并且这个新对象与原始对象没有任何关联。在实际开发中,我们需要根据具体的情况选择使用哪种方法。2 如果我们需要复制的对象只包含基本数据类型,那么使用浅拷贝就足够了。但是,如果我们需要复制的对象包含嵌套的对象,那么就需要使用深拷贝。因为浅拷贝只是复制了引用,而深拷贝则会递归地复制整个对象树。除了copy()和deepcopy()方法外,Python还提供了其他一些复制对象的方法,如slice操作符、list()构造
函数等。这些方法也可以用于复制对象,但是它们都只能进行浅拷贝,不能进行深拷贝。-在使用深拷贝时,需要注意以下几点:1 深拷贝可能会比较耗时,因为它需要递归地复制整个对象树。2 深拷贝可能会导致循环引用的问题。如果被复制的对象中存在循环引用,那么深拷贝会进入死循环,直到Python的最大递归深度被达到为止。3 深拷贝可能会导致内存占用过高的问题。如果被复制的对象非常大,那么深拷贝会占用大量的内存。
3.1 浅拷贝
"""
浅拷贝是指创建一个新对象,但是这个新对象只是原始对象的一个引用。
也就是说,在新对象中,原始对象中的所有元素都只是引用。
如果原始对象中的元素发生了变化,那么新对象中的元素也会发生变化。
"""# 1.1 使用方法
# 在Python中,可以使用copy()方法来进行浅拷贝。例如:
# 创建了一个包含一个整数和一个列表的列表,并使用copy()方法将其浅拷贝到了另一个变量中
list1 = [1, 2, [3, 4]]
list2 = list1.copy()
print(list2) # [1, 2, [3, 4]]# 浅拷贝的工作原理:
list1 = [1, 2, [3, 4]]
list2 = list1.copy()print("list1:", list1) # list1: [1, 2, [3, 4]]
print("list2:", list2) # list2: [1, 2, [3, 4]]list1[2][0] = 5 # 修改原始列表中的嵌套列表时,新列表中的相应元素也被修改了print("list1:", list1) # list1: [1, 2, [5, 4]
print("list2:", list2) # list2: [1, 2, [5, 4]]
3.2 深拷贝
"""
深拷贝是指创建一个新对象,并且这个新对象与原始对象没有任何关联。
也就是说,在新对象中,原始对象中的所有元素都被复制到了新的内存地址中。
如果原始对象中的元素发生了变化,那么新对象中的元素不会受到影响。
"""
# 使用方法
# 在Python中,可以使用deepcopy()方法来进行深拷贝。例如:
# 创建了一个包含一个整数和一个列表的列表,并使用deepcopy()方法将其深拷贝到了另一个变量中。
import copylist1 = [1, 2, [3, 4]]
list2 = copy.deepcopy(list1)print(list2) # [1, 2, [3, 4]]# 深拷贝的工作原理:
import copylist1 = [1, 2, [3, 4]]
list2 = copy.deepcopy(list1)print("list1:", list1) # list1: [1, 2, [3, 4]]
print("list2:", list2) # list2: [1, 2, [3, 4]]list1[2][0] = 5 # 修改原始列表中的嵌套列表时,新列表中的相应元素没有被修改。
print("list1:", list1) # list1: [1, 2, [5, 4]]
print("list2:", list2) # list2: [1, 2, [3, 4]]
3.3 扩展(slice操作符和list构造函数)
1 slice操作符slice操作符可以用于复制列表、元组、字符串等序列类型的对象。例如:a = [1, 2, 3, 4]b = a[:]这里,b就是a的一个浅拷贝,它包含了a中所有元素的副本。由于slice操作符只进行浅拷贝,因此如果a中包含了嵌套的对象,那么b中的这些对象仍然是a中的引用。2. list()构造函数list()构造函数可以用于将其他序列类型的对象转换为列表,并且可以实现浅拷贝。例如:a = (1, 2, 3, 4)b = list(a)这里,b就是a的一个浅拷贝,它包含了a中所有元素的副本。另外,需要注意的是,Python中的一些内置类型,如int、str、tuple等是不可变类型,它们没有提供
修改自身内容的方法。因此,对这些类型进行浅拷贝和深拷贝是没有任何区别的。例如:a = 123b = copy.copy(a)c = copy.deepcopy(a)这里,b和c都是a的副本,它们的值都是123。最后,需要注意的是,在Python中,对象的复制和对象的赋值是不同的概念。
对象的赋值只是将一个变量名与一个对象关联起来,而不是复制对象本身。例如:a = [1, 2, 3]
b = a
这里,b只是a的一个别名,它们实际上指向同一个对象。因此,对a或b进行修改,都会影响到另一个变量。
如果需要复制a的副本,可以使用a.copy()或者copy模块中的函数。
3.4 深入理解赋值、浅copy、深copy
## 赋值
a = [1, 2, 3, [5, 6, 67]]
b = a # 赋值,没有涉及到copy
print(b) # [1, 2, 3, [5, 6, 67]]b[0] = 99
# 只要改b的任何位置,a都会跟着改
print(b) # [99, 2, 3, [5, 6, 67]]
print(a) # [99, 2, 3, [5, 6, 67]]## 浅copy
from copy import copya = [1, 2, 3, [5, 6, 67]]
c = copy(a)
c[0] = 999
print(c) # [999, 2, 3, [5, 6, 67]]
# 如果是不可变类型,不会影响
print(a) # [1, 2, 3, [5, 6, 67]]# 如果是可变类型
c[3][1] = 666
print(c) # [999, 2, 3, [5, 666, 67]]
print(a) # [1, 2, 3, [5, 666, 67]]## 深copy
from copy import deepcopya = [1, 2, 3, [5, 6, 67]]
d = deepcopy(a)
d[0] = 999
print(d) # [999, 2, 3, [5, 6, 67]]
# 如果是不可变类型,不会影响
print(a) # [1, 2, 3, [5, 6, 67]]# 如果是可变类型
d[3][1] = 666
print(d) # [999, 2, 3, [5, 666, 67]]
print(a) # [1, 2, 3, [5, 6, 67]]
相关文章:

9-什么是迭代器,生成器,装饰器、django的信号用过吗?如何用,干过什么、什么是深拷贝,什么是浅拷贝,如何使用、slice操作符和list构造函数
1 什么是迭代器,生成器,装饰器 2 django的信号用过吗?如何用,干过什么 3 什么是深拷贝,什么是浅拷贝,如何使用 3.1 浅拷贝 3.2 深拷贝 3.3 扩展(slice操作符和list构造函数) 1 什么是迭代器,生成…...

RabbitMQ之发送者(生产者)可靠性
文章目录 前言一、生产者重试机制二、生产者确认机制实现生产者确认(1)定义ReturnCallback(2)定义ConfirmCallback 总结 前言 生产者重试机制、生产者确认机制。 一、生产者重试机制 问题:生产者发送消息时࿰…...

乐得瑞LDR6020 VR串流线方案:实现同时充电传输视频信号
VR(Virtual Reality),俗称虚拟现实技术,是一项具有巨大潜力的技术创新,正在以惊人的速度改变我们的生活方式和体验,利用专门设计的设备,如头戴式显示器(VR头盔)、手柄、定…...

【libGDX】Mesh纹理贴图
1 前言 纹理贴图的本质是将图片的纹理坐标与模型的顶点坐标建立一一映射关系。纹理坐标的 x、y 轴正方向分别朝右和朝下,如下。 2 纹理贴图 本节将使用 Mesh、ShaderProgram、Shader 实现纹理贴图,OpenGL ES 的实现见博客 → 纹理贴图。 DesktopLauncher…...
基线扫描tomcat安全加固-检查是否支持HTTPS等加密协议
背景:基线扫描时,docker镜像中的tomcat在检查是否支持HTTPS等加密协议这一项上未通过。 思路:先通过JDK自带的keytool工具生成证书,再从tomcat的server.xml配置文件中增加配置。 我不确定不同版本的JDK生成的证书是否可以通用&a…...

基于 STM32F7 和神经网络的实时人脸特征提取与匹配算法实现
本文讨论了如何使用 STM32F7 和神经网络模型来实现实时人脸特征提取与匹配算法。首先介绍了 STM32F7 的硬件和软件特点,然后讨论了人脸特征提取和匹配算法的基本原理。接下来,我们将重点讨论如何在 STM32F7 上实现基于神经网络的人脸特征提取与匹配算法&…...

Android笔记(十四):JetPack Compose中附带效应(一)
在Android应用中可以通过定义可组合函数来搭建应用界面。应用界面的更新往往是与可组合函数内部定义的状态值相关联的。当界面的状态值发生变更,会导致应用界面进行更新。在Android笔记(九):Compose组件的状态,对Compo…...

【web】Fastapi自动生成接口文档(Swagger、ReDoc )
简介 FastAPI是流行的Python web框架,适用于开发高吞吐量API和微服务(直接支持异步编程) FastAPI的优势之一:通过提供高级抽象和自动数据模型转换,简化请求数据的处理(用户不需要手动处理原始请求数据&am…...

竞赛选题 题目:基于FP-Growth的新闻挖掘算法系统的设计与实现
文章目录 0 前言1 项目背景2 算法架构3 FP-Growth算法原理3.1 FP树3.2 算法过程3.3 算法实现3.3.1 构建FP树 3.4 从FP树中挖掘频繁项集 4 系统设计展示5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于FP-Growth的新闻挖掘算法系统的设计与实现…...

188. 股票买卖问题(交易次数为任意正整数)
题目 题解 class Solution:def maxProfit(self, k: int, prices: List[int]) -> int:N len(prices)# 定义状态:dp[i][j][k]表示在第i天,有j次交易机会,持有或不持有的最大利润dp [[[0 for i in range(2)] for j in range(k1)] for m in range(N)]f…...
Typescript怎样对URL参数进行编码?
URL中的参数需要进行编码(URL encoding)是为了确保传输的参数不包含特殊字符,同时确保数据的可靠性和安全性。 特殊字符如空格、&、?等在URL中有特殊含义,如果直接包含在参数值中,可能会导致解析错误或者安全问题…...

AndroidStudio2022.3.1 Patch3使用国内下载源加速
记录一下这个版本的as在使用国内下载源加速碰到的诸多问题。 一、gradle-8.0-bin.zip下载慢 编辑项目文件夹/gradle/wrapper/gradle-wrapper.properties,文件内容改为如下: #Fri Nov 24 18:50:06 CST 2023 distributionBaseGRADLE_USER_HOME distribu…...

Go语言的学习笔记2——Go语言源文件的结构布局
用一个只有main函数的go文件来简单说一下Go语言的源文件结构布局,主要分为包名、引入的包和具体函数。下边是main.go示例代码: package mainimport "fmt"func main() { fmt.Println("hello, world") }package main就是表明这个文件…...
python给视频增加字幕
python给视频增加字幕 安装所需库 在开始之前,我们需要安装一些Python库。主要使用到的库如下: moviepy:用于处理视频和音频的库。 pydub:用于处理音频的库。 speech_recognition:用于语音识别的库。 首先࿰…...

相机设置参数:黑电平(Black Level)详解和示例
本文通过原理和示例对相机设置参数“黑电平”进行讲解,以帮助大家理解和使用。 原理 相机中黑电平原理是将电平增大,可以显示更多暗区细节,可能会损失一些亮区,但图像更多的关注暗区,获取完图像信息再减掉。只是为了…...

Mac Ubuntu双系统解决WiFi和WiFi 5G网络不可用问题
文章目录 设备信息1. Ubuntu WiFi不可用解决方式查看Mac的网卡型号根据网卡型号搜索获取到的解决方法查看WiFi名字问题参考链接 2. 解决WiFi重启后失效问题打开终端创建.sh脚本文件编辑脚本文件复制粘贴脚本修改脚本权限创建并编辑systemd service文件复制粘贴下文到systemd se…...

数据分析基础之《matplotlib(2)—折线图》
一、折线图绘制与保存图片 1、matplotlib.pyplot模块 matplotlib.pyplot包含了一系列类似于matlab的画图函数。它的函数作用于当前图形(figure)的当前坐标系(axes) import matplotlib.pyplot as plt 2、折线图绘制与显示 展示城…...
Rust语言入门教程(三) - 函数与模块系统
函数 函数的定义 根据Rust的格式规范,函数名的格式应遵从蛇形命名法,即是用小写字母以及下划线组成,如: fn do_stuff(){ }Rust并不要求函数定义的位置必须在调用它之前,所以如果你习惯于把main函数放在最前面的话&a…...

ubuntu22.04 arrch64版在线安装java环境
脚本 #安装java#!/bin/bashif type -p java; thenecho "Java has been installed."else#2.Installed Java , must install wgetwget -c https://repo.huaweicloud.com/java/jdk/8u151-b12/jdk-8u151-linux-arm64-vfp-hflt.tar.gz;tar -zxvf ./jdk-8u151-linux-arm6…...

概率论与数理统计中常见的随机变量分布律、数学期望、方差及其介绍
1 离散型随机变量 1.1 0-1分布 设随机变量X的所有可能取值为0与1两个值,其分布律为 若分布律如上所示,则称X服从以P为参数的(0-1)分布或两点分布。记作X~ B(1,p) 0-1分布的分布律利用表格法表示为: X01P1-PP 0-1分布的数学期望E(X) 0 *…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...