当前位置: 首页 > news >正文

【0016】Python数据类型-不可变集合详解

如果你觉得我的文章写的不错,请关注我哟,请点赞、评论,收藏此文章,谢谢!

本文内容体系结构如下:
在这里插入图片描述

在Python中,除了我们常见的可变集合(Set)外,还有一种不可变集合(Frozenset)。不可变集合是一种哈希不可变的集合类型,这意味着一旦创建,其元素就不能被添加、删除或修改。本文将详细介绍Python中的不可变集合,适合零基础小白学习。

一、什么是不可变集合(Frozenset)

1.1 不可变集合概述

在Python中,不可变集合(immutable set)实际上并不存在作为一个单独的集合类型。Python中的集合(set)类型是可变的,这意味着你可以在创建集合之后添加、删除或修改集合中的元素。

然而,如果你需要一个不可变的集合,你可以使用Python中的frozenset类型。frozenset是一个不可变的集合,一旦创建,其内容就不能被修改。

1.2 不可变集合特性

  • **不可变性:**不可变集合一旦创建,其元素就不能被修改。这意味着你不能向不可变集合中添加新元素,也不能删除或更改现有元素。如果尝试这样做,Python会抛出一个TypeError异常。
  • **哈希性:**由于不可变集合是哈希不可变的,因此它们可以用作字典的键或集合的元素。这在需要唯一标识符或需要快速查找的情况下非常有用。
  • **性能:**在某些情况下,frozenset可能比set更快,因为不可变性允许更多的优化。

二、创建不可变集合

2.1 使用大括号创建

创建一个空的不可变集合非常简单,只需使用带有frozenset()的大括号即可,但需要注意,大括号本身是用来创建可变集合的,因此直接写{}会得到一个可变集合。为了创建空的不可变集合,应该这样写:

empty_frozenset = frozenset()
print(empty_frozenset) # frozenset()
print(type(empty_frozenset)) # <class 'frozenset'>

代码运行结果如下图所示:
在这里插入图片描述

2.2 使用frozenset()函数创建

要将任何可迭代对象(如列表、元组、集合等)转换为不可变集合,可以使用frozenset()函数。例如:

# 使用frozenset()函数将字符串转换为不可变集合
frozenset01 = frozenset("abcdefg")
print(frozenset01) # frozenset({'g', 'f', 'b', 'd', 'c', 'a', 'e'})
print(type(frozenset01)) # <class 'frozenset'># 使用frozenset()函数将列表转换为不可变集合
frozenset02 = frozenset([10,20,30,40,30])
print(frozenset02) # frozenset({40, 10, 20, 30})
print(type(frozenset02)) # <class 'frozenset'># 使用frozenset()函数将元组转换为不可变集合
frozenset03 = frozenset((10,20,30,40))
print(frozenset03) # frozenset({40, 10, 20, 30})
print(type(frozenset03)) # <class 'frozenset'># 使用frozenset()函数将字典转换为不可变集合,将字典的键存储到不可变集合中
frozenset04 = frozenset({"a":100,"b":200})
print(frozenset04) # frozenset({'b', 'a'})
print(type(frozenset04)) # <class 'frozenset'>

代码运行结果如下图所示:
在这里插入图片描述


三、删除不可变集合

当不可变集合不再使用时,使用del命令删除整个UK恶变集合。删除不可变集合后,再次使用不可变集合会报NameError错误。

frozenset01 = frozenset([10,20,30,40,50])
print(frozenset01) # frozenset({40, 10, 50, 20, 30})
print(type(frozenset01))del frozenset01
print(frozenset01) # NameError: name 'frozenset01' is not defined

代码执行效果如下:
在这里插入图片描述


四、访问不可变集合元素

在Python中,不可变集合(frozenset)是一种无序且不包含重复元素的数据结构。因此,你不能像访问列表(list)或元组(tuple)那样通过索引来获取不可变集合中的某一个特定元素。不过,你可以使用一些方法来获取不可变集合中的元素,例如通过迭代、随机选择等。

4.1 迭代集合

使用循环来遍历不可变集合中的元素。

forzenset01  = frozenset([10,20,30,40,50])
print(forzenset01)
print(type(forzenset01))for element in forzenset01:print(element)  # 逐个打印集合中的元素

运行结果如下图所示:
在这里插入图片描述

4.2 转换为列表并使用索引

将不可变集合转换为列表,然后使用索引来访问元素。不过,这种方法并不推荐,因为它失去了不可变集合无序且唯一的特性。

frozenset = frozenset((10, 20, 30, 40, 50, 60, 70, 80, 90))
my_list = list(frozenset)
print(my_list[0])  # 访问转换为列表后的a第一个元素(注意,这个元素不一定是最初插入的那个) 我这里第一次运行输出的是70,再次运行输出的可能就是其他元素

运行结果如下图所示:
在这里插入图片描述

每种方法都有其适用的场景,选择哪种方法取决于你的具体需求。


五、遍历不可变集合元素

在Python中,不可变集合是一种无序且不重复的元素集合。要遍历一个集合,可以使用多种方法,包括使用for循环、列表推导式等。以下是一些常用的遍历不可变集合的方法

5.1 使用 for 循环遍历不可变集合

这是最直接和常用的方法。

frozenset01 = frozenset((10, 20, 30, 40, 50, 60, 70, 80, 90))for element in frozenset01:print(element,end=" ")

运行结果如下图所示:
在这里插入图片描述

5.2 使用enumerate()函数遍历不可变集合

可以使用enumerate()函数和for循环遍历不可变集合元素

frozenset01 = frozenset((10, 20, 30, 40, 50, 60, 70, 80, 90))for index,value in enumerate(frozenset01):print(f"第{index}个元素:{value}")

运行结果如下图所示:
在这里插入图片描述

5.3 使用列表推导式遍历不可变集合

虽然列表推导式主要用于生成列表,但你也可以用它来遍历不可变集合,并在遍历过程中将元素收集到一个列表中。

frozenset01 = frozenset((10, 20, 30, 40, 50, 60, 70, 80, 90))# 将不可变集合中的每个元素收集到一个列表中
squared_elements = [element for element in frozenset01]
print(squared_elements)

运行结果如下图所示:
在这里插入图片描述


六、查找不可变集合元素

6.1 in运算符查询元素在不可变集合中是否存在

使用in运算符查询某个元素在集合中是否存在,如果存在返回True,如果不在返回False。

语法格式如下:

result = 元素值 in 不可变集合名

演示代码如下:

frozenset01 = frozenset((10, 20, 30, 40, 50, 60, 70, 80, 90))result01 = 10 in frozenset01
print("元素10在不可变集合frozenset01中存在:",result01) # 元素10在不可变集合frozenset01中存在: Trueresult02 = 100 in frozenset01
print("元素100在不可变集合frozenset01中存在:",result02) # 元素100在不可变集合frozenset01中存在: False

运行结果如下图所示:
在这里插入图片描述

6.2 not in运算符查询元素在不可变集合中是否不存在

使用not in运算符查询某个元素在不可变集合中是否不存在,如果不存在返回True,如果存在返回False。

语法格式如下:

result = 元素值 not in 不可变集合名

演示代码如下:

frozenset01 = frozenset((10, 20, 30, 40, 50, 60, 70, 80, 90))result01 = 10 not in frozenset01
print("元素10不在不可变集合frozenset01中存在:",result01) # 元素10不在不可变集合frozenset01中存在: Falseresult02 = 100 not in frozenset01
print("元素100不在不可变集合frozenset01中存在:",result02) # 元素100不在不可变集合frozenset01中存在: True

运行结果如下图所示:
在这里插入图片描述


七、集合推导式

7.1 什么是推导式

Python推导式(comprehension)是一种简洁而高效的构建容器(如列表、集合、字典)的方法。它允许你用一行代码来创建容器,并且可以通过循环和条件语句来生成容器中的元素。

推导式分为列表推导式(list comprehension)、集合推导式(set comprehension)、字典推导式(dictionary comprehension)以及生成器表达式(generator expression)。

推导式是Python中非常强大和常用的特性,可以使代码更加简洁和高效。

7.2 不可变集合推导式

不可变集合推导式提供了一种创建列表的简洁方法,通常是操作某个序列的每个元素,并将其结果作为新不可变集合的元素,或者根据判定条件创建子序列。不可变集合推导式一般由表达式及for语句构成,其后还可以有零个到多个for自居或if子句,返回结果是表达式在for语句和if语句的操作下生成的不可变集合。

语法格式:

frozensetname = frozenset(expression for variable in 对象(if condition))
  • frozensetname:新生成的不可变集合名字。
  • expression:表达式。
  • variable:变量名。
  • (if condition):用于从对象中选择符合要求的不可变集合。

演示示例:

# 1:生成[0-10)之间的10个整数,存储在不可变集合中
# 普通方式生成
list01 = []
for i in range(10):list01.append(i)
frozenset01 = frozenset(list01)
print(type(frozenset01)) # print(type(frozenset01))
print("普通方式生成的不可变集合:",frozenset01) # 普通方式生成的不可变集合: frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})# 不可变集合推导式生成
frozenset02 = frozenset(i for i in range(10))
print(type(frozenset02)) # <class 'frozenset'>
print("不可变集合推导式生成的不可变集合:",frozenset02) # 不可变集合推导式生成的不可变集合: frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})# 2:生成一个[1-10]之间所有整数的平方组成的不可变集合
# 普通方式生成
list02 = []
for i in range(1,11):list02.append(i ** 2)
frozenset03 = frozenset(list02)
print(type(frozenset03)) # <class 'frozenset'>
print("普通方式生成的不可变集合:",frozenset03) # 普通方式生成的不可变集合: frozenset({64, 1, 4, 36, 100, 9, 16, 49, 81, 25})# 不可变集合推导式生成
frozenset04 = frozenset(i**2 for i in range(1,11))
print(type(frozenset04)) # 普通方式生成的不可变集合: frozenset({64, 1, 4, 36, 100, 9, 16, 49, 81, 25})
print("不可变集合推导式生成的不可变集合:",frozenset04) # 不可变集合推导式生成的不可变集合: frozenset({64, 1, 4, 36, 100, 9, 16, 49, 81, 25})# 3:取出已有不可变集合中的奇数值生成新不可变集合
# 已有不可变集合
frozenset05 = frozenset([1,2,3,4,5,6,7,8,9,10])
# 普通方式生成
list03 = []
for i in frozenset05:if i%2!=0:list03.append(i)
frozenset06 = frozenset(list03)
print(type(frozenset06)) # <class 'frozenset'>
print("普通方式生成的不可变集合:",frozenset06) # 普通方式生成的不可变集合: frozenset({1, 3, 5, 7, 9})# 不可变集合推导式生成
frozenset07 = frozenset(i for i in frozenset05 if i%2!=0)
print(type(frozenset07)) # <class 'frozenset'>
print("不可变集合推导式生成的不可变集合:",frozenset07) # 不可变集合推导式生成的不可变集合: frozenset({1, 3, 5, 7, 9})

运行结果如下图所示:
在这里插入图片描述


八、集合运算

集合运算是指对集合进行的一系列操作,如并集、交集、差集等。这些运算在数据处理、逻辑运算等领域有着广泛的应用。

以下是Python集合的运算操作符或方法的展示

运算类型操作符方法说明
并集`AB`A.union(B)
交集A&BA.intersection(B)交集,返回一个新集合,包括同时在集合A和集合B中的元素
差集A-BA.difference(B)差集,返回一个新集合,包括在集合A中但不在集合B中的元素
对称差集A^BA.symmetric_difference(B)对称差集,返回一个新集合,包括集合A和集合B中的元素,但是不包括同时在两集合中的元素
子集A<=BA.issubset(B)如果集合A与集合B相同或者A是B的子集,返回True,否则返回False
真子集A<B如果集合A是集合B的真子集,返回True,否则返回False
超集A>=BA.issuperset(B)如果集合A与集合B相同或者A是B的超集,返回True,否则返回False
真超集A>B如果集合A是集合B的真超集,返回True,否则返回False
集合相等A==B如果集合A与集合B相同,返回True,否则返回False
集合不相等A!=B如果集合A与集合B不 相同,返回True,否则返回False
空交集判断A.isdisjoint(B)如果集合A与集合B没有公共元素,返回 True,否则返回 False。
更新`A=B`A.update(B)
更新intersection_update()用自己和另一个的交集来更新这个集合
更新difference_update()从这个集合中删除另一个集合的所有元素
更新symmetric_difference_update()用自己和另一个的对称差来更新这个集合

集合的并集、交集、差集、对称差集运算代码:

# 在对集合做运算时,不会影响原来的集合,而是返回一个运算结果
# 创建2个集合
A = frozenset({10,20,30,40,50})
B = frozenset({30,40,50,60,70})
print(type(A)) # <class 'frozenset'>
print(type(B)) # <class 'frozenset'>
print("运算前集合A:",A) # 运算前集合A: frozenset({50, 20, 40, 10, 30})
print("运算前集合B:",B) # 运算前集合B: frozenset({50, 70, 40, 60, 30})# 并集:使用 A | B 或 A.union(B)实现,返回一个新集合,包括集合A和集合B中所有的元素。
result01 = A | B
print("并集 A | B:",result01) # 并集 A | B: frozenset({70, 40, 10, 50, 20, 60, 30})
result02 = A.union(B)
print("并集 A.union(B):",result02) # 并集 A.union(B): frozenset({70, 40, 10, 50, 20, 60, 30})# 交集:使用 A & B 或 A.intersection(B)实现返回一个新集合,包括同时在集合A和集合B中的元素。
result03 = A & B
print("交集 A & B:",result03) # 交集 A & B: frozenset({40, 50, 30})
result04 = A.intersection(B)
print("交集 A.intersection(B):",result04) # 交集 A.intersection(B): frozenset({40, 50, 30})# 差集:使用 A - B 或 A.difference(B)实现返回一个新集合,包括在集合A中但不在集合B中的元素。
result05 = A - B
print("差集 A - B:",result05) # 交集 A.intersection(B): frozenset({40, 50, 30})
result06 = A.difference(B)
print("差集 A.difference(B):",result06) # 交集 A.intersection(B): frozenset({40, 50, 30})# 对称差集:使用 A ^ B 或 A.symmetric_difference(B)实现返回一个新集合,包括集合A和集合B中的元素,但是不包括同时在两集合中的元素。
result07 = A ^ B
print("对称差集 A ^ B:",result07) # 对称差集 A ^ B: frozenset({20, 70, 10, 60})
result08 = A.symmetric_difference(B)
print("对称差集 A.symmetric_difference(B):",result08) # 对称差集 A.symmetric_difference(B): frozenset({20, 70, 10, 60})# 做完并集、差集、交集、对称差集运算之后的集合A和集合B
print("运算后集合A:",A) # 运算后集合A: frozenset({50, 20, 40, 10, 30})
print("运算后集合B:",B) # 运算后集合B: frozenset({50, 70, 40, 60, 30})

在这里插入图片描述

集合的子集、真子集、超集、真超集运算代码:

# 在对不可变集合做运算时,不会影响原来的不可变集合,而是返回一个运算结果
# 创建3个不可变集合A1 = frozenset({10,20,30})
B1 = frozenset({10,20,30})
B2 = frozenset({10,20,30,40,50})
print(type(A1)) # <class 'frozenset'>
print(type(B1)) # <class 'frozenset'>
print(type(B2)) # <class 'frozenset'>
print("运算前不可变集合A1:",A1) # 运算前不可变集合A1: {10, 20, 30}
print("运算前不可变集合B1:",B1) # 运算前不可变集合B1: {10, 20, 30}
print("运算前不可变集合B2:",B2) # 运算前不可变集合B2: {50, 20, 40, 10, 30}# 子集:使用 A <= B 或 A.issubset(B)实现,如果不可变集合A中的元素全部都在不可变集合B中出现,那么不可变集合A就是不可变集合B的子集,返回True,否则返回False
# 超集:使用 A >= B 或 A.issuperset(B)实现,如果不可变集合B中的元素全部都在不可变集合A中,那么不可变集合A就是不可变集合B的超集,返回True,否则返回False
# 真子集:特殊的子集,使用 A < B 或 实现,如果超集B中含有子集A中所有元素,并且不可变集合B中还有不可变集合A中没有的元素,那么不可变集合A是不可变集合B的真子集,返回True,否则返回False
# 真超集:特殊的超集,使用A > B 或 实现,如果超集A中包含有自己B中所有㢝,并且不可变集合A中还有不可变集合B中没有的元组,那么不可变集合A是不可变集合B的真超集,返回True,否则返回False
print("不可变集合A1是不可变集合B1的子集:",A1 <= B1) # 不可变集合A1是不可变集合B1的子集: True
print("不可变集合A1是不可变集合B1的真子集:",A1 < B1) # 不可变集合A1是不可变集合B1的真子集: False
print("不可变集合A1是不可变集合B2的子集:",A1 <= B2) # 不可变集合A1是不可变集合B2的子集: True
print("不可变集合A1是不可变集合B2的真子集:",A1 < B2) # 不可变集合A1是不可变集合B2的真子集: Trueprint("不可变集合B1是不可变集合A1的超集:",B1 >= A1) # 不可变集合B1是不可变集合A1的超集: True
print("不可变集合B1是不可变集合A1的真超集:",B1 > A1) # 不可变集合B1是不可变集合A1的真超集: False
print("不可变集合B2是不可变集合A1的超集:",B2 >= A1) # 不可变集合B2是不可变集合A1的超集: True
print("不可变集合B2是不可变集合A1的真超集:",B2 > A1) # 不可变集合B2是不可变集合A1的真超集: True

运算结果如下图所示:
在这里插入图片描述

集合相等和不相等判断、集合空交集判断代码:

# 在对不可变集合做运算时,不会影响原来的不可变集合,而是返回一个运算结果
# 创建两个不可变集合A = frozenset({10,20,30})
B1 = frozenset({10,20,30})
B2 = frozenset({40,50,60})# 不可变集合相等判断、不可变集合不相等判断:使用==和!=实现
print("不可变集合A=不可变集合B1:",A == B1) # 不可变集合A=不可变集合B1: True
print("不可变集合A=不可变集合B2:",A == B2) # 不可变集合A=不可变集合B2: False
print("不可变集合A!=不可变集合B1:",A != B1) #不可变集合A!=不可变集合B1: False
print("不可变集合A!=不可变集合B2:",A != B2) # 不可变集合A!=不可变集合B2 True# 不可变集合空交集判断:
print("不可变集合A和不可变集合B1没有交集:",A.isdisjoint(B1)) # 不可变集合A和不可变集合B1没有交集: False
print("不可变集合A和不可变集合B2没有交集:",A.isdisjoint(B2)) # 不可变集合A和不可变集合B2没有交集: True

集合相等和不相等判断、集合空交集判断运行结果如下:
在这里插入图片描述

需要注意的是,不可变集合中的元素是无序且唯一的,因此在进行不可变集合运算时,结果不可变集合中的元素顺序可能与示例中的顺序不同,但元素本身是相同的。此外,不可变集合运算的结果也是不可变集合类型,可以使用不可变集合的相关方法和操作符进行进一步的操作。


九、不可变集合其他操作

函数描述
all()如果集合中的所有元素都是 True(或者集合为空),则返回 True。
any()如果集合中的所有元素都是 True,则返回 True;如果集合为空,则返回 False。
max()返回集合中的最大项
min()返回集合中的最小项
sorted()从集合中的元素返回新的排序列表(不排序集合本身)
sum()返回集合的所有元素之和

代码如下所示:

frozenset01 = frozenset([10,20])
frozenset02 = frozenset([0])
frozenset03 = frozenset()
frozenset04 = frozenset([False])
print(frozenset01,type(frozenset01)) # frozenset({10, 20}) <class 'frozenset'>
print(frozenset02,type(frozenset02)) # frozenset({0}) <class 'frozenset'>
print(frozenset03,type(frozenset03)) # frozenset({0}) <class 'frozenset'>
print(frozenset04,type(frozenset04)) # frozenset({False}) <class 'frozenset'># all():如果不可变集合中的所有元素都是 True(或者不可变集合为空),则返回 True。
print("all():",all(frozenset01)) # all(): True
print("all():",all(frozenset02)) # all(): False
print("all():",all(frozenset03)) # all(): True
print("all():",all(frozenset04)) # all(): False# any():如果不可变集合中的所有元素都是 True,则返回 True;如果不可变集合为空,则返回 False。
print("any():",any(frozenset01)) # any(): True
print("any():",any(frozenset02)) # any(): False
print("any():",any(frozenset03)) # any(): False
print("any():",any(frozenset04)) # any(): False# max():返回不可变集合中的最大项
print("max():",max(frozenset01)) # max(): 20# min():返回不可变集合中的最小项
print("min():",min(frozenset01)) # min(): 10# sum():返回不可变集合的所有元素之和
print("sum():",sum(frozenset01)) # sum(): 30# sorted() 从不可变集合中的元素返回新的排序列表(不排序不可变集合本身)
frozenset05 = frozenset({10,40,90,20,30,50,80,60,70})
print(frozenset05) # frozenset({70, 40, 10, 80, 50, 20, 90, 60, 30})
print(type(frozenset05)) # <class 'frozenset'>
# sorted()默认进行升序排序,返回一个升序排序的列表
result01 = sorted(frozenset05)
print(result01) # [10, 20, 30, 40, 50, 60, 70, 80, 90]
print(type(result01)) # <class 'list'>result02 = sorted(frozenset05,reverse=True)
print(result02) # [90, 80, 70, 60, 50, 40, 30, 20, 10]
print(type(result02)) # <class 'list'>

运行结果如下图所示:
在这里插入图片描述

十、可变集合和不可变集合对比

Python中的可变集合和不可变集合存在显著的异同点。以下是详细的对比分析:

10.1 相同点

  1. 集合特性

    • 无论是可变集合还是不可变集合,都具有集合的基本特性,即元素是无序的、唯一的,且不支持通过索引访问元素。
    • 两者都支持集合操作,如并集、交集、差集等。
  2. 元素类型

    • 可变集合和不可变集合都可以包含各种数据类型,如数字、字符串、元组等,但需要注意的是,不可变集合(frozenset)本身作为元素时,其内部元素也必须是不可变的。

10.2 不同点

  1. 可变性

    • 可变集合:允许在创建后修改其内容,即可以添加或删除元素。这种修改是在原地进行的,不会创建新的对象。
    • 不可变集合:一旦创建,其内容就不能被添加或删除。如果尝试修改,Python会创建一个新的对象来存储新的值,而不是改变原有的对象。
  2. 哈希性与字典键

    • 可变集合:由于其内容可以改变,因此不能用作字典的键。这是因为字典是基于哈希表实现的,而哈希表要求键的值在插入后不能改变。
    • 不可变集合:由于其内容不可变,因此可以用作字典的键。
  3. 操作与异常

    • 对于可变集合,可以使用如add()remove()discard()pop()等方法来添加或删除元素。如果尝试删除不存在的元素,remove()方法会抛出KeyError异常,而discard()方法则不会抛出异常。
    • 对于不可变集合,由于其内容不可变,因此不能使用上述方法来修改集合。任何尝试修改不可变集合的操作都会导致新的frozenset对象的创建。
  4. 内存与性能

    • 不可变集合由于其内容不可变,因此可以提供数据的安全性,并有助于避免在程序运行时出现难以调试的错误。此外,不可变类型通常可以更有效地被优化,因为它们的值不会改变,这可以带来性能上的好处。
    • 可变集合则更加灵活,允许在程序运行时动态地修改集合的内容。然而,这种灵活性也可能导致意外的副作用,特别是在函数参数传递等场景中。

综上所述,Python中的可变集合和不可变集合在可变性、哈希性与字典键、操作与异常以及内存与性能等方面存在显著的异同点。在选择使用哪种集合时,应根据具体的应用场景和需求进行权衡。


十一、总结

不可变集合是Python中的一种有用数据结构,它提供了集合的许多优点(如快速查找和唯一性),同时由于其不可变性,还可以用作字典的键或集合的元素。本文介绍了如何创建不可变集合、其特性和操作,希望能够帮助你更好地理解和使用不可变集合。

相关文章:

【0016】Python数据类型-不可变集合详解

如果你觉得我的文章写的不错&#xff0c;请关注我哟&#xff0c;请点赞、评论&#xff0c;收藏此文章&#xff0c;谢谢&#xff01; 本文内容体系结构如下&#xff1a; 在Python中&#xff0c;除了我们常见的可变集合&#xff08;Set&#xff09;外&#xff0c;还有一种不可…...

学习资料电子版 免费下载的网盘网站(非常全!)

我分享一个私人收藏的电子书免费下载的网盘网站&#xff08;学习资料为主&#xff09;&#xff1a; link3.cc/sbook123 所有资料都保存在网盘了&#xff0c;直接转存即可&#xff0c;非常的便利&#xff01; 包括了少儿&#xff0c;小学&#xff0c;初中&#xff0c;中职&am…...

ROS2学习笔记2

前言 本篇文章属于ROS2humble的学习笔记&#xff0c;来源于B站鱼香ROSup主。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 《ROS 2机器人开发从入门到实践》课程介绍_哔哩哔哩_bilibili …...

为什么大模型网站使用 SSE 而不是 WebSocket?

在大模型网站&#xff08;如 ChatGPT、Claude、Gemini 等&#xff09;中&#xff0c;前端通常使用 EventSource&#xff08;Server-Sent Events, SSE&#xff09; 来与后端对接&#xff0c;而不是 WebSocket。这是因为 SSE 更适合类似流式文本生成的场景。下面我们详细对比 SSE…...

利用阿里云Atlas地区选择器与Plotly.js实现数据可视化与交互

在数据科学与可视化领域&#xff0c;交互式图表和地图应用越来越成为数据分析和展示的重要手段。本文将介绍如何结合阿里云Atlas地区选择器与Plotly.js&#xff0c;创建动态交互式的数据可视化应用。 一、阿里云Atlas地区选择器简介 阿里云Atlas是阿里云的一款数据可视化产品…...

尚硅谷TS快速入门笔记(个人笔记用)

TypeScript 快速上手 &#x1faa9; 禹神&#xff1a;三小时快速上手TypeScript&#xff0c;TS速通教程_哔哩哔哩_bilibili ⼀、TypeScript 简介 TypeScript 由微软开发,是基于 JavaScript 的⼀个扩展语⾔。 TypeScript 包含了 JavaScript 的所有内容,即: TypeScript 是 Jav…...

python: DDD+ORM using oracle 21c

sql script: create table GEOVINDU.School --創建表 ( SchoolId char(5) NOT NULL, -- SchoolName nvarchar2(500) NOT NULL, SchoolTelNo varchar(8) NULL, PRIMARY KEY (SchoolId) --#主鍵 );create table GEOVINDU.Teacher ( TeacherId char(5) NOT NULL , TeacherFirstNa…...

KidneyTalk-open系统,RAG在医疗场景的真实落地:用于解决肾脏疾病的医疗问答问题

如何在保护隐私的前提下,本地部署大型语言模型(LLMs),以支持肾脏疾病的医学决策支持。难点包括:云端LLMs的数据泄露风险、本地部署的复杂性、通用LLMs在医学知识整合方面的不足、检索增强系统在医学文档处理和临床可用性方面的挣扎。Med-PaLM 2和MedFound在医学问答和临床…...

flask-定时任务

文章目录 前言一、APScheduler是什么二、APScheduler 主要功能&#xff1a;三、主要组成部分&#xff1a;四、典型使用场景&#xff1a;五、具体使用1.安装 APScheduler2.假设我们有一个需要五分钟请求一次http接口的任务1.定义一个scheduler.py去专门处理定时2.启动文件处理3.…...

6-langchang多模态输入和自定义输出

6-langchang多模态输入和自定义输出 多模态数据输入urlbase64url list工具调用自定义输出: JSON, XML, YAML如何解析 JSON 输出json如何解析xmlYAML解析器多模态数据输入 这里我们演示如何将多模态输入直接传递给模型。我们目前期望所有输入都以与OpenAI 期望的格式相同的格式…...

接口自动化入门 —— Http的请求头,请求体,响应码解析!

在接口自动化测试中&#xff0c;HTTP请求头、请求体和响应码是核心组成部分。理解它们的作用、格式和解析方法对于进行有效的接口测试至关重要。以下是详细解析&#xff1a; 1. HTTP 请求头&#xff08;Request Header&#xff09; 1.1 作用 请求头是客户端向服务器发送的附加…...

AI-NAS:当存储遇上智能,开启数据管理新纪元

在数据爆炸的时代&#xff0c;NAS&#xff08;网络附加存储&#xff09;已成为个人和企业存储海量数据的利器。然而&#xff0c;面对日益庞大的数据量&#xff0c;传统的NAS系统在文件管理和搜索效率上逐渐力不从心。AI-NAS应运而生&#xff0c;它将NAS与人工智能&#xff08;A…...

MWC 2025 | 移远通信推出AI智能无人零售解决方案,以“动态视觉+边缘计算”引领智能零售新潮流

在无人零售市场蓬勃发展的浪潮中&#xff0c;自动售货机正经历着从传统机械式操作向AI视觉技术的重大跨越。 移远通信作为全球领先的物联网整体解决方案供应商&#xff0c;精准把握行业趋势&#xff0c;在2025世界移动通信大会&#xff08;MWC&#xff09;上宣布推出全新AI智能…...

个人记录的一个插件,Unity-RuntimeMonitor

没有什么干货,仅仅是个人的记录 基于GUI做的一个工具:好处就是Monitor必须,Unity天然支持实时的Monitor;唯一不好处,就是默认字体太小了,layout居中,居右也是要自行设计的。 (下面文字是有一点点写错,但意思和功能就很牛逼了;并不是都按2 x shift,而是一个 shift 添…...

【C语言】考研复试上机代码题(基础篇)

文章目录 一、输入与输出1、温度转换2、排齐数据3、进制转换 二、选择分支结构1、分段函数求值2、成绩评定3、平闰年判定4、二次方程的根5、字符大小写 三、循环结构程序1、倒数求和4、判断数根5、打印菱形6、最大公约数7、最小公倍数8、复读机 四 、数组1、数组的批量增2、数组…...

video可以播放视屏但无法使用进度条点击快进/video的进度条失效无法点击

1、问题描述? 1、在SpringBoot+jQuery的$.get+HTML的video,进行动态加载视屏的时候,页面可以正常的播放视频,但是video自带的点击进度条快进视频功能失效。即如下进度条无法点击,只能顺序播放。 2、视频格式是mp4格式。 3、在主流的浏览器中都可以实现点击播放,但是进度…...

DeepSeekR1之四_在RAGFlow中配置DeepSeekR1模型

DeepSeekR1之四_在RAGFlow中配置DeepSeekR1模型 文章目录 DeepSeekR1之四_在RAGFlow中配置DeepSeekR1模型1. 通过Ollama下载模型1. 下载DeepSeekR1模型2. 下载嵌入模型 2. 查看本地的Ollama模型3. 模型提供商中添加模型1. 打开模型提供商2. 选择Ollama待添加模型3. 添加DeepSee…...

electron + vue3 + vite 渲染进程与渲染进程之间的消息端口通信

渲染进程与渲染进程之间的通信有两种&#xff1a; 通过主进程进行消息转发&#xff08;通过组合主进程与渲染进程之间的单向、双向通信可以实现&#xff0c;可以自己动手尝试&#xff0c;该篇不讲解&#xff09;通过消息端口进行直接通信 该篇主要用示例讲解下单项目内多个窗口…...

MySQL性能调优实战手册:从慢查询到执行计划全解析

一、调优流程四步走 &#x1f680; 当我们遇到数据库调优问题的时候&#xff0c;该如何思考呢? 这里把思考的流程整理成下面这张图。 整个流程划分成了观察&#xff08;Show status&#xff09;和 行动(Action&#xff09;两个部分。字母S的部分代表观察&#xff08;会使用相…...

作为高数小白,我尝试理解概念:高数 - 导数

作为C#开发者&#xff0c;其实我是一个高数小白&#xff0c;可是我对它极其好奇&#xff0c;非常想了解它里面到底讲了什么内容&#xff0c;貌似这对于我是一个非常艰难的过程&#xff0c;因为完全没有接触过高等数学&#xff0c;可是又太想去了解。所以我计划开始慢慢学习它。…...

在 IntelliJ IDEA(2024) 中创建 JAR 包步骤

下是在 IntelliJ IDEA 中创建 JAR 包的详细的步骤&#xff1a; ​1. 选择File -> Project Structure->Artifacts&#xff0c; (1)点击➕新建&#xff0c;如下图所示&#xff1a; (2)选择JAR->Empty (3)输入jar包名称&#xff0c;确定输出路径 &#xff08;4&#…...

『PostgreSQL』PGSQL备份与还原实操指南

&#x1f4e3;读完这篇文章里你能收获到 了解逻辑备份与物理备份的区别及适用场景&#x1f50d;。掌握全库、指定库、指定表备份还原的命令及参数&#x1f4dd;。学会如何根据业务需求选择合适的备份策略&#x1f4ca;。熟悉常见备份还原问题的排查与解决方法&#x1f527;。 …...

Mentalab Explore 在低密度 EEG 系统中的创新应用

在当今科技飞速发展的时代&#xff0c;脑电图&#xff08;EEG&#xff09;技术已成为神经科学研究、医疗诊断和教育领域广泛使用的工具。Mentalab Explore 作为一款专为灵活性和高效性设计的便携式低密度 EEG 系统&#xff0c;凭借其性能和多样的应用场景&#xff0c;正引领着便…...

Ubuntu 24.04.2 允许 root 登录桌面、 ssh 远程、允许 Ubuntu 客户机与主机拖拽传递文件

允许 root 登录桌面 修改 /etc/pam.d/gdm-autologin , /etc/pam.d/gdm-password 加 # 以注释掉 auth required pam_succeed_if.so user ! root quiet_success 允许 root 通过 ssh 登录 修改 /etc/ssh/sshd_config ... #PermitRootLogin prohibit-password PermitRootLogin …...

ngx_openssl_create_conf

ngx_openssl_create_conf 声明在 src\event\ngx_event_openssl.c static void *ngx_openssl_create_conf(ngx_cycle_t *cycle); 定义在 src\event\ngx_event_openssl.c static void * ngx_openssl_create_conf(ngx_cycle_t *cycle) {ngx_openssl_conf_t *oscf;oscf ngx_…...

数学 二次函数

二次函数 就是计算一个抛物线。 抛物线的基本公式&#xff1a; 重点中的重点就是解决&#xff1a; &#xff08;开口方向&#xff1a; 对称轴&#xff0c;顶点&#xff0c;交点&#xff09; 这里的 y 和 x 就是 这个抛物线的个个点的坐标连成的线。 a 的正负 决定和大小决定…...

系统架构的评估的系统的质量属性

体系结构苹果可以针对一个体系结构&#xff0c;也可以针对一组体系结构。 体系结构评估过程中&#xff0c;评估人员所关注的是系统的质量属性&#xff0c;所有评估方法所普遍关注的质量属性有以下几个&#xff1a;性能、可靠性&#xff08;容错&#xff0c;健壮性&#xff09;…...

Facebook 的历史与发展:从校园网站到全球社交平台

引言 Facebook&#xff0c;这个全球最大的社交网络平台之一&#xff0c;其发展历程充满了创新和变革。从最初的校园网站到如今的全球社交平台&#xff0c;Facebook 不仅改变了人们的沟通方式&#xff0c;也重塑了信息传播和社交互动的模式。 起源&#xff1a;校园内的点子 Fa…...

开源、创新与人才发展:机器人产业的战略布局与稚晖君成功案例解析

目录 引言 一、开源&#xff1a;机器人产业的战略布局 促进技术进步和生态建设 吸引人才和合作伙伴 建立标准和网络效应 降低研发风险与成本 二、稚晖君&#xff1a;华为"天才少年计划"的成功典范 深厚的技术积累与动手能力 强烈的探索和创新意识 持续公开…...

Visual Studio 2022新建c语言项目的详细步骤

步骤1&#xff1a;点击创建新项目 步骤2&#xff1a;到了项目模板 --> 选择“控制台应用” (在window终端运行代码。默认打印"Hello World") --> 点击 “下一步” 步骤3&#xff1a;到了配置新项目模块 --> 输入“项目名称” --> 更改“位置”路径&…...

利用FatJar彻底解决Jar包冲突(三)

利用FatJar彻底解决Jar包冲突 Spring 容器的加载与隔离⽀持注解配置⽂件定位与容器初始化嵌套Spring容器的加载 隔离优化EagleEye traceId不⼀致问题原因解决 Spring 容器的加载与隔离 ⽀持注解 这个⽐较容易&#xff0c;主要是我们之前的应⽤不⽀持⼆⽅包内部的注解&#xf…...

【TMS570LC4357】之工程创建

备注&#xff1a;具体资料请在官网海淘.TMS570LC4357资料 1. 下载软件 官网下载对应的编译编辑工具如下图&#xff0c;主要是这两个&#xff0c;其它Flash工具等酌情考虑 安装软件&#xff0c;一直next就可以。安装后新建工程 2. 新建工程 如果不知道怎么建工程&#xff0…...

工作记录 2016-12-22

工作记录 2016-12-22 更新的问题 1、修改了Job Summary的Bill Amount的Bug。 2、修改了Account #的宽度。 3、修改了Clearinghouse Status的默认查询的条件。 4、修改了Upload Files的Add File的bug。 5、Pending Pool、Missing Infos加了Write Off&#xff0c;修改了Histor…...

若依-导出后端解析

针对若依框架微服务版本学习 若依导入导出功能的具体使用详见&#xff1a;后台手册 | RuoYi 1.导出逻辑&#xff1a; 导出文件的逻辑是先创建一个临时文件&#xff0c;等待前端请求下载结束后马上删除这个临时文件。但是有些下载插件&#xff0c;例如迅雷&#xff08;他们是二…...

【QT5 Widgets示例】记事本:(二)界面设计

文章目录 记事本&#xff1a;&#xff08;二&#xff09;界面设计设置窗口标题和图标创建菜单工具栏创建文本框 记事本&#xff1a;&#xff08;二&#xff09;界面设计 设置窗口标题和图标 标题 点击窗口&#xff0c;修改windowTitle项 图标 点击windowIcon 倒三角&#xf…...

MPPT与PWM充电原理及区别详解

MPPT&#xff08;最大功率点跟踪&#xff09;和PWM&#xff08;脉宽调制&#xff09;是太阳能充电控制器中常用的两种技术&#xff0c;它们在原理、效率和适用场景上有显著区别。以下是两者的详细对比&#xff1a; 1. 工作原理 PWM&#xff08;脉宽调制&#xff09; 核心机制…...

K8S 集群搭建——cri-dockerd版

目录 一、工作准备 1.配置主机名 2.配置hosts解析 3.配置免密登录&#xff08;只需要在master上操作&#xff09; 4.时间同步&#xff08;每台节点都要做&#xff0c;必做&#xff0c;否则可能会因为时间不同步导致集群初始化失败&#xff09; 5.关闭系统防火墙 6.配置…...

使用express创建服务器保存数据到mysql

创建数据库和表结构 CREATE DATABASE collect;USE collect;CREATE TABLE info (id int(11) NOT NULL AUTO_INCREMENT,create_date bigint(20) DEFAULT NULL COMMENT 时间,type varchar(20) DEFAULT NULL COMMENT 数据分类,text_value text COMMENT 内容,PRIMARY KEY (id) ) EN…...

ubuntu-学习笔记-nginx+php

nginxphp nginx下载nginx配置nginx.conf php其他 记录一下在ubuntu中nginxphp部署tp项目 nginx nginx就是正常下载 下载nginx sudo apt-get install nginx tp项目版本是3.2&#xff0c;通过设置路由&#xff0c;以域名/api.php/控制器/xxx的格式进行api的调用&#xff0c;文…...

打造智能聊天体验:前端集成 DeepSeek AI 助你快速上手

DeepSeek AI 聊天助手集成指南 先看完整效果&#xff1a; PixPin_2025-02-19_09-15-59 效果图&#xff1a; 目录 项目概述功能特点环境准备项目结构组件详解 ChatContainerChatInputMessageBubbleTypeWriter 核心代码示例使用指南常见问题 项目概述 基于 Vue 3 TypeScrip…...

github生成badges的方法

在Github页面上生成类似下面这样的badge的方法 你可以通过以下步骤在GitHub个人主页的README中创建类似的技术栈徽章&#xff1a; 一、使用 Shields.io 生成徽章 Shields.io 是一个开源徽章生成工具&#xff0c;支持自定义文本、颜色、图标等参数。 1. 基础模板 https://…...

vulnhub靶场渗透之SickOs1.2渗透教程,计划任务提权、chkrootkit提权

vulnhub靶场渗透之SickOs1.2渗透教程&#xff0c;计划任务提权、chkrootkit提权 一、信息收集 1、首先拿到靶场先扫一下ip 2025.3.7 AM 8&#xff1a;36 arp-scan -l 扫描同网段 nmap -sP 192.168.66.24/02、指纹扫描 nmap -sS -sV 192.168.66.130 指纹扫描PORT STATE S…...

Ubuntu系统部署.NET 8网站项目

一、使用XShell连接 Ubuntu系统初次连接时默认的用户名为&#xff1a;ubuntu&#xff0c;使用此用户名与系统登录密码进行连接。 登录成功效果如下图&#xff1a; 二、root用户登录 linux下有超级用户&#xff08;root&#xff09;和普通用户&#xff0c;普通用户不能直接操…...

CI/CD—Jenkins配置一次完整的jar自动化发布流程

背景&#xff1a; 实现设想&#xff1a; 要创建自动化发布&#xff0c;需要准备一台测试服务器提前安装好java运行所需的环境&#xff0c;JDK版本最好和Windows开发机器上的版本一致&#xff0c;在Jenkins上配置将构建好的jar上传到测试服务器上&#xff0c;测试服务器自动启动…...

【Academy】Web 缓存欺骗 ------ Web cache deception

Web 缓存欺骗 ------ Web cache deception 1. 概述2. Web 缓存2.1 缓存键2.2 缓存规则 3. 构建 Web 缓存欺骗攻击3.1 使用缓存破坏器3.2 检测缓存的响应 4. 利用静态扩展缓存规则4.1 路径映射差异4.2 利用路径映射差异4.3 分隔符差异4.4 利用分隔符差异4.5 分隔符解码差异4.6 利…...

MATLAB表格Table与时间序列Timetable的高效操作方法

MATLAB中的表格&#xff08;Table&#xff09; 和 时间序列&#xff08;Timetable&#xff09; 是处理结构化数据和时间相关数据的核心工具。以下从基础操作到高级技巧&#xff0c;分步骤详解其使用方法。 一、创建与基础操作 1. 表格&#xff08;Table&#xff09;的创建与访…...

【leetcode hot 100 21】合并两个有序链表

解法一&#xff1a;新建一个链表存放有序的合并链表。当list1和list2至少有一个非空时&#xff0c;返回非空的&#xff1b;否则找出两个链表的最小值作为新链表的头&#xff0c;然后依次比较两链表&#xff0c;每次都先插入小的值。 /*** Definition for singly-linked list.*…...

本地部署 OpenManus 保姆级教程(Windows 版)

一、环境搭建 我的电脑是Windows 10版本&#xff0c;其他的没尝试&#xff0c;如果大家系统和我的不一致&#xff0c;请自行判断&#xff0c;基本上没什么大的出入啊。 openManus的Git地址&#xff1a;https://github.com/mannaandpoem/OpenManus 根据官网的两种安装推荐方式如…...

20250310:OpenCV mat对象与base64互转

代码: https://github.com/ReneNyffenegger/cpp-base64 指南:https://renenyffenegger.ch/notes/development/Base64/Encoding-and-decoding-base-64-with-cpp/ 实操:...

WPS的付费功能,这款软件可完美平替

因为作者有工作上的需求加上WPS使用批量提取图片需要会员&#xff0c;所以自己使用cursor制作了一个从excel中提取图片的工具。 支持提取Excel中的浮动图片和根据图片链接来下载图片。 Excel Image Extractor Excel图片提取工具 软件的功能非常强大&#xff0c;支持提取Excel中…...