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, 2for _ in range(n):yield firstfirst, second = second, first + secondnums = 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, Iteratorls = [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 bres = 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.mzph.cn/news/826408.shtml

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

相关文章

C语言---单链表(二)

文章目录 前言1.准备工作2,打印链表、创建新的节点、销毁链表2.1.打印链表2.2.创建节点2.3.销毁链表 3.尾插、头插、尾删、头删3.1.尾插3.2.头插3.3.尾删3.4.头删 4.在特殊位置之前、之后插入、删除以及查找节点4.1.查找节点4.2.在指定位置之前插入4.3.在指定位置之后插入数组4…

赋值运算符

介绍 赋值运算符就是将某个运算后的值, 赋给指定的变量。 赋值运算符的分类 基本赋值运算符 例如: int a 10; 复合赋值运算符 , - , * , / , % 等 a b; [等价 a a b; ] a - b; [等价 a a - b; ] …

亚信安全入选中国数据安全市场图谱

近日,全球领先的IT市场研究和咨询公司IDC发布了《IDC Market Glance:中国数据安全市场图谱,2024》报告(以下简称“报告”),报告展示了中国数据安全市场的构成和格局,遴选出不同细分市场领域的主…

C语言中的结构体:从定义到传递

前言 结构体是C语言中一种重要的数据类型,它允许我们将不同类型的数据组合成一个整体,并以自定义的方式进行操作。通过结构体,我们可以更加灵活地管理和处理复杂的数据结构,从而提高程序的可读性和可维护性。本篇博客将从结构体的…

jetcache fastjson 泛型复杂对象JSON序列 ,反序列化

Jetcache fastjson 泛型复杂对象JSON序列 ,反序列化 默认的FastJson2 序列化存在问题增强FastJson 支持Encode 编码器Decode 解码器 默认的FastJson2 序列化存在问题 默认的序列化不能转换List 中的泛型数据类型, 从缓存拿取的list集合对象数据全部都转换成了JSONObject 增强F…

nginx--Nginx转发真实的IP

Nginx转发真实的IP 前言给nginx.conf 设置proxy_set_headerjava 程序里获取 前言 在使用nginx的时候可能会遇到判断是不是本机在做操作,这样的话web端我们是可以通过ip和端口进行远程连接的这样的话我们就需要从后端获取到真实ip来判断是不是指定的机器了&#xff…

Linux 序列化、反序列化、实现网络版计算器

目录 一、序列化与反序列化 1、序列化(Serialization) 2、反序列化(Deserialization) 3、Linux环境中的应用实例 二、实现网络版计算器 Sock.hpp TcpServer.hpp Jsoncpp库 Protocol.hpp 类 Request 类 Response 辅助函…

稳压二极管仿真实验

稳压二极管仿真实验 1、稳压管稳压实验 用Multisim搭建如下的仿真电路图,选用5.1V的稳压管,12V的直流电源,开启仿真后,12V电压将稳压管击穿,稳压管将两端的电压稳压到5.07V,该电压与限流电阻R1的阻值有关…

js操作dom元素

当使用JavaScript操作DOM时,可以通过各种方法来实现对元素的获取、修改、创建、删除等操作。以下是一些详细的代码示例: 1. 获取元素 javascript复制代码 // 通过ID获取元素 var elementById document.getElementById(myElementId); // 通过类名获取元…

跟着Carl大佬学leetcode之977 有序数组的平方

来点强调,刷题是按照代码随想录的顺序进行的,链接如下https://www.programmercarl.com/本系列是记录一些刷题心得和学习过程,就看到题目自己先上手试试,然后看程序员Carl大佬的解释,自己再敲一遍修修补补,练…

如何安装cuda和cudnn

https://www.bilibili.com/video/BV1sY411c7JS/?spm_id_from333.999.0.0 https://www.bilibili.com/video/BV1q5411d7GD/?spm_id_from333.999.0.0 以上两个链接参考:水果数据集(Fruit-Dataset )水果分类识别训练代码(支持googlenet, resnet, inception_v3, mobil…

msyql中SQL 错误 [1118] [42000]: Row size too large (> 8126)

场景: CREATE TABLE test-qd.eqtree (INSERT INTO test.eqtree (idocid VARCHAR(50) NULL,sfcode VARCHAR(50) NULL,sfname VARCHAR(50) NULL,sfengname VARCHAR(50) NULL,…… ) ENGINEInnoDB DEFAULT CHARSETutf8 COLLATEutf8_general_ci;或 alter table eqtre…

162. 寻找峰值

Problem: 162. 寻找峰值 文章目录 思路解题方法复杂度Code 思路 一看时间复杂度就知道要二分查找,跟最近做的题目一样。 但是我没想清楚二分的点在哪。二分需要满足二段性,果断看题解。 解题方法 令l、r两个指针分别指向数组nums的起始位置和结束位置 mi…

Token 在 LLM

大语言模型不能理解原始文本,所以需要把原始文本转换成大语言模型可以理解的数字表示形式,经过大模型处理以后,需要将该数字表示形式转换为人可以理解的文本。 原始文本到 token 原始文本转换为token序列的过程通常是在LLM的预处理阶段完成的。 在大型语言模型(LLM)中,tok…

力扣:LCR 022. 环形链表 II

力扣:LCR 022. 环形链表 II 给定一个链表,返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点。如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链…

docker配置项目镜像

1、Dockerfile构建redis镜像 redis_install.sh #!/bin/bash yum install -y gcc gcc-c make openssl openssl-devel cd /home/redis-6.2.6 make && make PREFIX/usr/local/redis install mkdir -p /usr/local/redis/conf/ cp /home/redis-6.2.6/redis.conf /usr/local/…

学习java时候的笔记(十九)

正则表达式 作用: 校验字符串是否满足规则在一段文本中查找满足要求的内容 字符类(只匹配一个字符) 说明[abc]只能是a,b或c[^abc]除了a,b,c之外的任何字符[a-zA-Z]a 到 z, A 到 Z(范围)[a-d[m-p]]a 到 d, 或 m 到 p[a - z && [def]]a 到 z和def的交集。为: d, e, f…

【树莓派学习】系统烧录及VNC连接、文件传输

【树莓派学习】系统烧录及VNC连接、文件传输 Raspberry Pi is a series of small single-board computers (SBCs) developed in the United Kingdom by the Raspberry Pi Foundation in association with Broadcom. Since 2013, Raspberry Pi devices have been developed and…

Ubuntu20.4版本安装ROS教程

一、配置源 安装成功的Ubuntu系统自带的工具下载速度慢,不太好用,所以我们可以使用国内稳定高速且免费的镜像网站。 清华源:https://pypi.tuna.tsinghua.edu.cn/simple/ 阿里云:https://mirrors.aliyun.com/pypi/simple 中科大&…

Comparable 和 Comparator

文章目录 一.Comparable二. Comparator三.对比1. Comparable 接口2. Comparator 接口总结 一.Comparable 源码&#xff1a; public interface Comparable<T> {int compareTo(T o); }返回值&#xff1a; 如果当前对象小于参数对象&#xff0c;则返回负整数。如果当前对象等…