9-什么是迭代器,生成器,装饰器、django的信号用过吗?如何用,干过什么、什么是深拷贝,什么是浅拷贝,如何使用、slice操作符和list构造函数

本文主要是介绍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:[{id1,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中的一些内置类型,如intstrtuple等是不可变类型,它们没有提供
修改自身内容的方法。因此,对这些类型进行浅拷贝和深拷贝是没有任何区别的。例如: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构造函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/430596

相关文章

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意