python笔记之高级特性

目录

一、is 与 ==

二、深浅拷贝

三、生成器(generator)

1、列表推导式

2、列表生成器

3、函数生成器

四、迭代器

可迭代对象

五、闭包(closure)

六、装饰器


一、is 与 ==

==比较运算符。是用来比较两个值的大小的。(比较两个对象的值是否相同)

is是一个关键字。是用来比较两个变量的内存地址。(比较两个对象的引用是否相同)相当于使用id获取内存地址后再比较。

id() ,是Python的一个内置函数,返回对象的唯一标识,用于获取对象的内存地址。

注意:在python中,存在一个小整型缓冲区。在这个区域内的整数,只会存在一份,所以is==是一致的。小整型缓冲区默认范围是[-5, 256]区间所有整数。

注意:字符串也存在一个字符串常量池,用来保存第一个出现的单词,如果再次要使用这个单词,则会直接从常量池中获取这个单词对应的内存地址,所以,字符串往往只有一份,被成为字符常量。

is 和 == 哪个效率高?

相比之下, is 比较的效率更高,因为它只需要判断两个对象的id是否相同即可。

而 == 则需要重载__eq__ 这个函数,遍历变量中的所有元素内容,逐次比较是否相同。因此效率较低

二、深浅拷贝

  • 引用传递

    引用传递:将对象的地址复制给其他变量,因此会有多个引用指向同一个对象。

  • 浅拷贝

    将对象的第一层属性进行拷贝,得到一个新的对象,注意:如果存在子对象,不会拷贝

        浅拷贝的是对象的引用,如果原对象改变,相应的拷贝对象也会发生改变

  • 深拷贝

    将对象采用递归方式,逐层拷贝,最后得到完成不同的对象。

        深拷贝对象中的每个元素,拷贝对象和原有对象不在有关系,两个是独立的对象

拷贝:指的是对象拷贝(复制)。

所谓深拷贝呢,就是重新分配一个内存空间(新对象),将原对象中的所有元素通过递归的方式进行拷贝到新对象中。在Python中 通过 copy.deepcopy() 来实现深拷贝。

三、生成器(generator)

1、列表推导式

python提供了一种快速生成列表的方式。

[i for i in range(10)]
[i for i in range(10) if i % 2 == 0]
[i * j for i in range(10) for j in range(9)]

2、列表生成器

列表生成器实在列表推导式的基础上,优化内存得到的。

将列表推导式,就行优化,使得所有不在全部加载内存,而是通过一段算法,一次只得到一个元素。

将列表推导式中的[]变成()即可。

优点:节约内存。

3、函数生成器

常规的方式,如果要生成一个复杂的列表,通过要使用函数。

而如果这个列表比较大,使用函数也存在一个浪费内存问题,如何解决这个——函数生成器。

函数生成器:和列表生成器很像,就是该函数不会再一次生成所有的值,而是逐个生成。

yield关键字使生成器函数执行暂停,yield 关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的 return 关键字。

一旦遇到 yield 表达式,生成器的代码将被暂停运行,直到生成器的 next() 方法被调用。每次调用生成器的 next() 方法时,生成器都会恢复执行,直到达到以下某个值

def fibonacii(n):
    first, second = 1, 2
    for _ in range(n):
        yield first
        first, second = second, first + second


nums = fibonacii(5)
print(nums)
# print(next(nums))
# print(nums.__next__())

for num in nums:
    print(num, end=',')

注意:

  1. 如果函数中出现了yield关键字,该函数会自动转换为一个函数生成器。

  2. 返回值就是这个生成器,调用函数,函数不会执行,而是转换为这个生成器

  3. next方法获取每一次生成器值的时候,函数才会执行

  4. yield也存在类似return的功能,函数遇到yield,立刻返回yield的值

  5. 等下一次next时,会自动从yield后面一行代码继续执行

四、迭代器

        ——迭代器是一个包含数个值的对象,迭代器是可迭代的对象,这意味着可遍历所有值

        ——在python中,能够被全局函数next(),不断地返回下一个元素的对象,被称为迭代器。

        ==>生成器是一种迭代器

from collections.abc import Iterable, Iterator

b = (i for i in range(9))
isinstance(b, Iterator)

ls = [1,2,34,10,5,566]
isinstance(ls, Iterator)

可迭代对象

在python,能被for循环,迭代获取每一个子元素的这种对象,被称为可迭代对象。

列表,元组,字典和集合都是可迭代的对象。 它们是可迭代的容器,可以从中获得迭代器,所有这些对象都有一个iter()方法,该方法用于获取迭代器。

可使用collections.abc包中Iterator类型进行判断,结合isinstance全局函数,完成判断。

from collections.abc import Iterable, Iterator

ls = [1,2,34,10,5,566]
isinstance(ls, Iterable)

# 可以使用其他类型完成测试,只有返回True的,才是可迭代对象,能够被for循环,获取子元素

总结:

  1. 生成器就是迭代器

  2. 迭代器不一定是生成器

  3. 迭代器一定能够被for循环迭代

  4. 可迭代对象也能够被for循环迭代

  5. 可迭代对象不一定是迭代器

  6. 迭代器一定是可迭代对象

  7. 使用全局函数iter将可迭代对象转换为迭代器

五、闭包(closure)

        ——能够访问其他函数内部变量(局部变量)的函数被称为闭包

                闭包是弱数据类型编程语言所特有的现象

闭包一句话概括就是在函数中再嵌套一个函数,并且引用外部函数的变量

def a():
    name = "ljh"
    
    
def b():
    print(name)
    
    
    
def a():
    name = "ljh"
    def b():
        print(name)
    return b

res = a()
res()

闭包让外部函数常驻内存,导致垃圾不能够及时释放,但是它让局部变量变成了全局变量,所以尽量不要使用闭包,闭包在js里用的比较广泛,在Python里比较少,会在装饰器里面用

闭包优点:将局部变量全局化,使得局部变量存在了全局的生命周期。

闭包缺点:常驻内存,可能会引起内存溢出

六、装饰器

装饰器就是一个闭包,装饰器是闭包的一种应用

——作用:在不用更改原函数(基于OCP原则)的代码前提下给函数增加新的功能。

                使用时,再需要的函数前加上 @新功能函数名 即可

@符号是装饰器的语法糖

def check(fn):
    # 装饰器函数的内部函数,会被返回称为被装饰的函数
    def inner(username, password, *args, **kwargs):
        print("xxxx 登录了")
        fn(username, password, args, kwargs)
        print("xxxx 退出了")
    return inner


@check
def login(username, password, *args, **kwargs):
    if password == '123456' and username == 'admin':
        print("登录成功了")
        print("恭喜你")
    else:
        raise Exception("对不起,登录失败")


login("admin", "123456")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何查找一篇英文文献的源代码?(论文中没有源代码链接时)如何查找一篇论文的实现代码从而复现论文?

有两个网址,从这两个网址里面能找到论文相关代码,但不确定是不是人家论文里的源代码,但是根据论文实在找不到的情况下,只能试试这两个网址了 1. https://paperswithcode.com/ 2. https://www.catalyzex.com/

团队协作:如何利用 Gitee 实现多人合作项目的版本控制

文章目录 前言一、名词解释1、Git是什么?2、Gitee、GitHub和GitLab 二、操作步骤1.安装Git2.创建Gitee仓库3.用vscode连接仓库4. 克隆远程仓库 总结 前言 在软件开发中,有效地管理代码是至关重要的。Gitee 是一个功能强大的代码托管平台,提供…

Sentinel 流控注解使用

大概原理:通过反射解析注解 SentinelResource信息完成调用,处理方法,类似AOP编程 处理方法的返回类型要保持一致,参数和顺序保持一致, 可以在参数列表最后加 com.alibaba.csp.sentinel.slots.block.BlockException; …

探索C语言数据结构:利用顺序表完成通讯录的实现

在好久之前我就已经学习过顺序表,但是在前几天再次温习顺序表的时候,我惊奇的发现顺序编表可以完成我们日常使用的通讯录的功能,那么今天就来好好通过博客总结一下通讯录如何完成吧。 常常会回顾努力的自己,所以要给自己的努力留…

【JavaSE】浅谈Java异常

前言 本篇文章是对Java异常体系相关内容及部分注意事项的的讲解。 一. 认识异常 在每个人的生命历程中,或多或少都会遇到生病或受伤的情况,比如:皮肤擦伤、感冒、发烧、患上某些传染病等等。不管“病情”严重与否,这些都可以算…

数据链路层协议——以太网协议

目录 要解决的问题 以太网协议 以太网帧格式 MAC地址 MAC地址和IP地址 MTU MTU对IP协议的影响 MTU对UDP协议的影响 MTU对TCP协议的影响 ARP协议 ARP协议格式 ARP协议的工作流程 ARP缓存表 要解决的问题 上一篇我们也说了,数据从应用层一步步封装到了网…

leetcode:滑动窗口----3. 无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为…

工业现场ModbusTCP转EtherNETIP网关引领生物现场领新浪潮

生物质发生器是一种能够产生、培养生物的设备。客户现场需要将生物发生器连接到罗克韦尔系统,但是二者协议无法直接通讯,需要通过开疆智能ModbusTCP转Ethernet/IP网关将两者进行通讯连接,生物质发生器以其独特的工作原理和优势,使…

【命名空间详解】c++入门

目录 命名空间的定义 1.命名空间的正常定义 2.命名空间还可以嵌套 3. 命名空间可以合并 命名空间的使用 1.加命名空间名称及作用域限定符 2.使用using将命名空间中某个成员引入 3.使用using namespace 命名空间名称 引入 输入,输出 输出 命名空间的定义 …

[阅读笔记21][RA-CM3]Retrieval-Augmented Multimodal Language Modeling

这篇论文是meta联合斯坦福在23年4月发表的论文,提出了一个使用外部知识检索增强的多模态模型。 这篇模型提出的RA-CM3模型是第一个能够检索并生成图像文本的多模态模型,在图像文本生成任务上优于现有的多模态模型,同时使用更少的训练量。 RA-…

在PostgreSQL中如何处理大对象(Large Objects),例如存储和检索二进制文件?

文章目录 存储二进制文件为大对象步骤 1:创建一个大对象步骤 2:写入数据到大对象 检索大对象为二进制文件步骤 1:打开大对象以进行读取步骤 2:从大对象读取数据 注意事项 PostgreSQL 提供了对大对象(Large Objects&…

【多线程学习】深入探究阻塞队列与生产者消费者模型和线程池常见面试题

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

【vue】el-tree的新增/编辑/删除节点

1、概述 关于树形结构的新增同级节点&#xff0c;新增子级节点&#xff0c;修改节点名称&#xff0c;删除节点等四种操作&#xff0c;各种参数配置完全继承el-tree&#xff0c;本篇使用vue2 element-ui 2、效果图展示 3、调用方式 <template><Tree:data"tree…

上位机图像处理和嵌入式模块部署(树莓派4b和视觉slam十四讲)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 实际使用中&#xff0c;树莓派4b是非常好的一个基础平台。本身板子价格也不是很贵&#xff0c;建议大家多多使用。之前关于vslam&#xff0c;也就是…

CSS display属性

目录 概述&#xff1a; 设置display示例&#xff1a; none&#xff1a; block&#xff1a; inline&#xff1a; inline-block &#xff1a; 概述&#xff1a; 在CSS中我们可以使用display属性来控制元素的布局&#xff0c;我们可以通过display来设置元素的类型。 在不设置…

webpack源码分析——enhanced-resolve库之getType、normalize、join和cachedJoin函数

一、PathType 路径类型 const PathType Object.freeze({Empty: 0, // 空Normal: 1, // 默认值Relative: 2, // 相对路径AbsoluteWin: 3, // win 下的绝对路径AbsolutePosix: 4, // posix 下的绝对路径Internal: 5 // enhanced-resolve 内部自定义的一种类型&#xff0c;具体是…

Redis:报错Creating Server TCP listening socket *:6379: bind: No error

错误&#xff1a; window下启动redis服务报错&#xff1a; Creating Server TCP listening socket *:6379: bind: No error 原因&#xff1a; 端口6379已被绑定&#xff0c;应该是因为上次未关闭服务 解决&#xff1a; ①依次输入命令&#xff1a; redis-cli.exe &#xff08…

IntelliJ IDEA运行发布传统Java Web Application项目

接 重温8年前项目部署 要求&#xff0c;如何改用IntelliJ IDEA运行发布传统 Java Web Application项目呢&#xff0c;简述步骤如下&#xff1a; 一、下载源码 源码&#xff1a;https://github.com/wysheng/kindergarten 下载后的本地项目路径&#xff1a;/Users/songjianyon…

前后端跨域请求代码实战(vue3.4+springboot2.7.18)

前端代码 v3.4.21&#xff08;前端不是主业&#xff0c;所以就贴一贴代码&#xff0c;有疑问评论区见&#xff09;后端代码&#xff0c;springboot 2.7.18&#xff08;后端&#xff09; 文章内容&#xff1a; 一&#xff0c;后端代码 二&#xff0c;前端代码 三&#xff0c;后…

安全开发实战(1)--Cdn

目录 安全开发专栏 CDN介绍 1.信息收集阶段 1.1判断CDN是否存在 1.1.1, One 1.1.2,Two(改进) 1.1.3,进行整合 增加输入功能 1.1.4 批量读取监测存储(进行测试) 问题1: 问题2: 解决方案: 1.1.4 基本编写完成 命令框中: cdn存在.txt 总结 这里我是根据整个渗透测…
最新文章