解锁 Python 嵌套字典的奥秘:高效操作与实战应用指南
文章目录
- 前言
- 🍀一、 什么是 Python 字典?
- 1.1 字典的语法
- 🍀二、 字典的基本操作
- 2.1 字典的创建
- 2.2 访问字典中的值
- 2.3 添加或修改键值对
- 2.4 删除字典中的键值对
- 🍀三、 字典的遍历操作
- 3.1 遍历字典的键
- 3.2 遍历字典的值
- 3.3 同时遍历键和值
- 🍀四、 字典的内置方法
- 4.1 `keys()`, `values()`, `items()`
- 4.2 `get()` 方法
- 4.3 `pop()` 和 `popitem()` 方法
- 4.4 `update()` 和 `clear()` 方法
- 🍀五、 嵌套字典及其操作
- 5.1 访问嵌套字典的值
- 5.2 修改嵌套字典中的值
- 5.3 添加新的键值对到嵌套字典
- 5.4 删除嵌套字典中的键值对
- 🍀六、字典的应用场景
- 6.1 配置文件和设置管理
- 示例:应用程序配置管理
- 6.2 计数器和频率统计
- 示例:统计字符串中每个字符的出现次数
- 6.3 `API` 返回值的解析
- 示例:解析 `REST API` 返回的 `JSON` 数据
- 6.4 数据库记录映射
- 示例:数据库查询结果映射
- 🍀七、字典的性能及其内部实现
- 7.1 哈希表的基本原理
- 7.2 哈希冲突与解决方案
- 7.3 字典的扩展和重新哈希
- 7.3.1 何时进行扩展
- 示例:字典扩展前后的行为
- 7.3.2 扩展的性能影响
- 7.4 Python 字典的负载因子
- 🍀八、字典的高级技巧
- 8.1 字典推导式
- 示例:使用字典推导式创建字典
- 8.2 `defaultdict` 的使用
- 示例:使用 `defaultdict` 进行字符计数
- 8.3 `OrderedDict` 和其他字典子类
- 示例:使用 `OrderedDict`
- 🍀九、常见的字典相关问题和优化技巧
- 9.1 如何处理字典的键不存在的情况?
- 9.2 如何合并两个字典?
- 结语
前言
在Python编程中,字典(dict)是一种非常重要的数据结构,它允许我们通过键(key)来快速查找、添加、更新和删除值(value)。字典的键必须是唯一的,而值则可以是任何数据类型,包括数字、字符串、列表、元组甚至是另一个字典。这种灵活性使得字典成为处理复杂数据结构的强大工具。本文将详细介绍Python中字典的定义、基本操作、嵌套字典、遍历方法、高级操作技巧等,并通过代码实例进行演示和分析。
🍀一、 什么是 Python 字典?
Python 字典是一种无序的、可变的、通过键值对(key-value pair)存储数据的容器。字典类似于我们生活中的词典或地址簿,在这些场景中,每个词(键)都有一个定义(值),而字典提供了这种映射关系。
与 Python 中的其他数据结构(如列表和元组)不同,字典的主要特点是:
- 键是唯一的:字典中的键不能重复,每个键都唯一地映射到一个值。
- 键必须是不可变类型:字典中的键必须是不可变对象,比如字符串、数字或元组,而不能是列表、集合等可变对象。
- 查找速度快:字典内部使用哈希表实现,因此在查找、插入、删除键值对时非常高效,时间复杂度接近 O(1)。
1.1 字典的语法
字典使用 {}
来创建,每个键值对通过 :
分隔,多个键值对通过逗号 ,
分隔。如下是一个简单的字典示例:
person = {"name": "Alice","age": 30,"city": "New York"
}
在这个字典中,"name"
、"age"
和 "city"
是键,而 "Alice"
、30
和 "New York"
是对应的值。
🍀二、 字典的基本操作
2.1 字典的创建
字典可以通过多种方式创建,最常见的方式是直接使用花括号 {}
包裹键值对:
person = {"name": "Bob", "age": 25, "city": "San Francisco"}
也可以使用 dict()
函数来创建字典,特别是当键值对由两个独立的列表或元组提供时:
# 使用 dict() 函数创建字典
person = dict(name="Bob", age=25, city="San Francisco")
你还可以从一系列元组列表中创建字典:
# 使用元组创建字典
items = [("name", "Alice"), ("age", 30), ("city", "New York")]
person = dict(items)
2.2 访问字典中的值
你可以通过键来访问字典中的值,如果该键不存在则会引发 KeyError
错误:
# 通过键访问字典中的值
print(person["name"]) # 输出: Alice
为了避免访问不存在的键时抛出异常,建议使用字典的 get()
方法:
# 使用 get() 方法
age = person.get("age", "Key not found")
print(age) # 输出: 30
2.3 添加或修改键值对
字典是可变的数据结构,因此你可以向字典中添加新的键值对,或者修改已有键的值:
# 添加新键值对
person["job"] = "Engineer"# 修改已有键的值
person["age"] = 31
2.4 删除字典中的键值对
可以使用 del
语句删除指定的键值对:
# 删除键值对
del person["city"]
也可以使用 pop()
方法删除键,并返回该键的值:
# 使用 pop() 方法
job = person.pop("job", "Key not found")
print(job) # 输出: Engineer
popitem()
是另一个删除方法,它会删除并返回字典中的最后一个键值对,通常用于需要在不指定键的情况下删除元素时使用。
🍀三、 字典的遍历操作
3.1 遍历字典的键
可以使用 for
循环遍历字典中的所有键:
for key in person:print(key)
或使用 keys()
方法显式遍历键:
for key in person.keys():print(key)
3.2 遍历字典的值
可以使用 values()
方法遍历字典中的所有值:
for value in person.values():print(value)
3.3 同时遍历键和值
要同时遍历字典中的键和值,可以使用 items()
方法:
for key, value in person.items():print(f"{key}: {value}")
🍀四、 字典的内置方法
Python 字典有许多强大的内置方法,它们可以帮助你轻松管理和操作字典中的数据。
4.1 keys()
, values()
, items()
这三个方法分别返回字典中的所有键、所有值以及键值对的视图。
python复制代码keys = person.keys() # 返回所有键
values = person.values() # 返回所有值
items = person.items() # 返回所有键值对
4.2 get()
方法
get()
方法可以用于安全地访问字典中的值,即使键不存在也不会抛出错误。
age = person.get("age", 25) # 如果 age 键不存在,则返回默认值 25
4.3 pop()
和 popitem()
方法
pop()
可以用来删除字典中指定的键值对并返回其值,而 popitem()
则删除并返回字典中的最后一个键值对。
# 删除指定键
age = person.pop("age", "Key not found")# 删除最后一个键值对
last_item = person.popitem()
4.4 update()
和 clear()
方法
update()
方法可以用来将一个字典的内容更新到另一个字典中,而 clear()
则用于清空字典。
# 使用 update() 更新字典
additional_info = {"country": "USA", "email": "bob@example.com"}
person.update(additional_info)# 使用 clear() 清空字典
person.clear()
🍀五、 嵌套字典及其操作
嵌套字典是指字典中的某些值本身也是字典。它可以用于表示更复杂的数据结构,例如表示某个用户的详细信息或多个层次的数据关系。让我们首先定义一个嵌套字典作为示例:
# 定义一个嵌套字典
company = {"department_1": {"manager": "Alice","employees": 10,"budget": 50000},"department_2": {"manager": "Bob","employees": 8,"budget": 40000},"department_3": {"manager": "Charlie","employees": 5,"budget": 30000}
}
这个字典 company
包含了 3 个部门,每个部门都有经理、员工人数和预算等信息。
5.1 访问嵌套字典的值
要访问嵌套字典中的值,可以逐级指定键:
# 访问 department_1 的经理
manager_dept1 = company["department_1"]["manager"]
print(manager_dept1) # 输出: Alice# 访问 department_2 的预算
budget_dept2 = company["department_2"]["budget"]
print(budget_dept2) # 输出: 40000
5.2 修改嵌套字典中的值
我们可以通过直接指定键来修改嵌套字典中的值:
# 修改 department_3 的员工人数
company["department_3"]["employees"] = 7
print(company["department_3"]["employees"]) # 输出: 7
5.3 添加新的键值对到嵌套字典
我们可以向嵌套字典的某一层添加新的键值对:
# 为 department_1 添加一个新的键值对 "location"
company["department_1"]["location"] = "Building A"
print(company["department_1"]["location"]) # 输出: Building A
5.4 删除嵌套字典中的键值对
可以使用 del
删除嵌套字典中的键值对:
# 删除 department_2 的预算信息
del company["department_2"]["budget"]
print(company["department_2"]) # 输出: {'manager': 'Bob', 'employees': 8}
🍀六、字典的应用场景
Python 字典在许多开发场景中都是不可或缺的数据结构,尤其适用于存储键值对并高效地进行查找、插入和删除操作。以下是几个常见的字典应用场景及其具体使用方法:
6.1 配置文件和设置管理
字典非常适合用于存储应用程序的配置和全局设置。由于字典是动态且可变的数据结构,可以方便地从文件(如 JSON 或 YAML)中加载设置,且在应用程序运行时灵活地进行修改。
示例:应用程序配置管理
# 定义一个应用的配置字典
config = {"database": {"host": "localhost","port": 5432,"username": "admin","password": "secret"},"app": {"debug": True,"secret_key": "s3cr3t_key","allowed_hosts": ["localhost", "127.0.0.1"]}
}# 访问数据库配置
db_host = config["database"]["host"]# 修改调试模式
config["app"]["debug"] = False
通过字典,可以轻松管理多个模块的配置信息,如数据库、缓存和日志等。这样,配置可以集中存放且易于修改。
6.2 计数器和频率统计
字典是非常高效的工具,用于统计某个集合中各元素出现的次数。通过将元素作为字典的键,频率作为值,能够快速统计频次信息。
示例:统计字符串中每个字符的出现次数
def char_count(string):count_dict = {}for char in string:if char in count_dict:count_dict[char] += 1else:count_dict[char] = 1return count_dict# 示例用法
text = "hello world"
count_result = char_count(text)
print(count_result)
在这个例子中,每个字符都作为键存储在字典中,其值为字符出现的次数。可以使用 collections
模块中的 defaultdict
来进一步优化计数逻辑,避免显式地检查键是否存在。
6.3 API
返回值的解析
字典常用于解析和存储 API
的返回结果,尤其是 JSON
格式的响应。API
通常以嵌套结构的形式返回数据,字典可以轻松表示这种嵌套关系并进行操作。
示例:解析 REST API
返回的 JSON
数据
python复制代码import json# 假设我们从一个 API 得到以下 JSON 响应
api_response = '''{"user": {"id": 123,"name": "Alice","email": "alice@example.com"},"status": "active","roles": ["admin", "editor"]
}'''# 将 JSON 字符串解析为 Python 字典
data = json.loads(api_response)# 访问解析后的数据
user_id = data["user"]["id"]
user_name = data["user"]["name"]
roles = data["roles"]print(f"User {user_name} (ID: {user_id}) has roles: {roles}")
字典结构与 JSON
的键值结构非常匹配,使得处理 API
数据变得直观且高效。
6.4 数据库记录映射
在数据库操作中,字典也被广泛用于将查询结果映射为 Python 对象。通常,每行记录可以表示为一个字典,其中列名作为键,列值作为字典的值。
示例:数据库查询结果映射
# 假设查询结果如下
query_result = [{"id": 1, "name": "Alice", "age": 30},{"id": 2, "name": "Bob", "age": 25}
]# 访问查询结果
for row in query_result:print(f"User {row['name']} is {row['age']} years old.")
这种方法可以让开发者通过字典键名来访问数据库记录,提高代码的可读性。
🍀七、字典的性能及其内部实现
Python 字典作为一种映射类型的数据结构,其高效性得益于它的底层实现:哈希表。哈希表的特性使得字典在处理查找、插入和删除操作时,能够在平均时间复杂度为 O(1) 的情况下完成。这一性能极大地提升了字典在处理大量数据时的表现。接下来我们将深入探讨 Python 字典的内部实现,理解其高效性的根源。
7.1 哈希表的基本原理
哈希表是一种通过哈希函数将键映射到固定大小的存储空间(槽位,bucket)的数据结构。哈希表的关键概念是通过哈希函数计算出键的哈希值(哈希码),并将其对应的值存储在计算出的哈希码所对应的槽位中。
例如,假设我们有一个简单的字典:
person = {"name": "Alice","age": 30,"city": "New York"
}
当我们访问 person["name"]
时,Python 会对 "name"
进行哈希计算,找到它映射的槽位,然后直接从这个槽位中读取存储的值 "Alice"
。
这种直接查找的方式与列表等顺序数据结构不同,列表中的查找操作需要逐个遍历每个元素,而字典的哈希表实现允许我们通过哈希函数直接定位目标位置,因此速度非常快,平均复杂度为 O(1)。
7.2 哈希冲突与解决方案
由于哈希表的存储空间是有限的,不同的键在通过哈希函数计算后,可能会得到相同的哈希值,这种现象称为哈希冲突。Python 字典使用了开放寻址法来解决哈希冲突。当哈希冲突发生时,字典会通过线性探测或者二次探测等方式寻找下一个空闲的槽位进行存储。
具体步骤如下:
- 计算出键的哈希值,映射到哈希表的某个槽位。
- 如果槽位已被占用,则通过线性或二次探测查找下一个可用槽位。
- 将键值对存储到找到的空槽中。
尽管哈希冲突会影响性能,但在多数情况下,Python 字典的哈希函数设计非常有效,冲突发生的概率较低。
7.3 字典的扩展和重新哈希
字典的大小是动态调整的,哈希表的初始容量有限,当插入的键值对数量达到一定的阈值(通常是容量的三分之二)时,Python 会自动扩展字典的容量,并将已有的键值对重新分配到更大的哈希表中,这个过程称为重新哈希(rehashing)。
重新哈希的步骤如下:
- 创建一个新的、更大的哈希表。
- 遍历旧哈希表中的所有键值对,重新计算它们的哈希值,并将它们插入到新的哈希表中。
- 丢弃旧的哈希表。
这种扩展操作会有一次性的性能开销,但在大多数情况下,字典的动态扩展是非常高效的,它保持了插入、查找和删除操作的高效性,确保平均时间复杂度为 O(1)。
7.3.1 何时进行扩展
当字典的负载因子达到阈值时,Python 会自动扩展字典的容量。扩展过程中的内存分配使得字典能够处理更多的键值对,而不必频繁重新调整大小。字典的扩展是通过倍数增长来进行的,通常扩展为当前容量的 2 倍或更多。
扩展操作有如下步骤:
- 创建一个新的哈希表,大小是原表的两倍。
- 将原有的键值对重新哈希并插入新表中。这意味着每个键的哈希值会被重新计算并存储在新的槽位中。
- 旧的哈希表被释放,新的哈希表成为当前字典使用的存储区域。
示例:字典扩展前后的行为
# 创建一个字典并不断增加键值对,观察扩展
my_dict = {}
for i in range(100):my_dict[i] = i * 2print(f"Inserted {i}: Dictionary size = {len(my_dict)}")
在这个例子中,随着我们不断向字典中插入新的键值对,字典的大小会逐步增加,当达到一定的数量时(负载因子阈值),字典会进行扩展,分配更多内存以存储新的键值对。
7.3.2 扩展的性能影响
扩展和重新哈希会引起一次性性能开销,但这种操作是为了保持字典整体操作的高效性。在扩展过程中,所有键值对都会被重新分配到新的哈希表中,因此这一过程可能会导致性能下降。但这种性能影响通常是短暂的,且扩展操作发生的频率较低。
7.4 Python 字典的负载因子
字典的扩展阈值是根据其负载因子(load factor)决定的。负载因子定义为:已填充槽位的数量与总槽位数量的比值。Python 字典的负载因子通常设定在 2/3 左右,当填充的槽位达到总槽位的 2/3 时,字典会进行扩展和重新哈希。
高负载因子意味着字典的存储空间得到了充分利用,但这也会增加哈希冲突的可能性,影响字典的查找效率;而低负载因子会减少冲突的发生,但会导致空间浪费。Python 在性能和空间利用之间取得了良好的平衡,确保了大部分场景下的高效操作。
🍀八、字典的高级技巧
8.1 字典推导式
字典推导式是 Python 中一种简洁的方式,用来创建新的字典。它的语法类似于列表推导式,但用于生成键值对。
示例:使用字典推导式创建字典
# 创建一个字典,键是数字,值是它们的平方
squares = {x: x**2 for x in range(6)}
print(squares) # 输出: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
字典推导式简化了字典的创建过程,特别适合需要从其他可迭代对象生成字典的场景。
8.2 defaultdict
的使用
defaultdict
是 collections
模块中的一个子类,它提供了给字典设置默认值的功能。使用 defaultdict
可以避免在访问字典不存在的键时抛出 KeyError
。
示例:使用 defaultdict
进行字符计数
from collections import defaultdictdef char_count(string):count_dict = defaultdict(int)for char in string:count_dict[char] += 1return count_dicttext = "hello world"
count_result = char_count(text)
print(count_result)
在这里,defaultdict(int)
会在遇到新键时自动初始化其值为 0,无需显式检查键的存在。
8.3 OrderedDict
和其他字典子类
在 Python 3.7 之前,字典是无序的,而 OrderedDict
可以保持键值对的插入顺序。在 Python 3.7 及更高版本中,字典本身已经保证了插入顺序,因此 OrderedDict
的使用场景有所减少,但它仍然在某些特殊情况下有用。
示例:使用 OrderedDict
from collections import OrderedDict# 创建一个 OrderedDict
ordered_dict = OrderedDict()
ordered_dict["a"] = 1
ordered_dict["b"] = 2
ordered_dict["c"] = 3# 访问有序字典
for key, value in ordered_dict.items():print(f"{key}: {value}")
OrderedDict
在需要对字典进行有序处理时非常有用,例如需要保存历史记录或按插入顺序遍历键值对的场景。
🍀九、常见的字典相关问题和优化技巧
9.1 如何处理字典的键不存在的情况?
通常我们使用 get()
方法来安全访问字典中的值,它允许在键不存在时返回默认值,从而避免抛出 KeyError
。
value = person.get("job", "Unknown") # 如果 "job" 键不存在,则返回 "Unknown"
9.2 如何合并两个字典?
在 Python 3.9 之后,可以使用 |
运算符合并两个字典:
dict1 = {"a": 1, "b": 2}
dict2 = {"b": 3, "c": 4}merged_dict = dict1 | dict2
print(merged_dict) # 输出: {'a': 1, 'b': 3, 'c': 4}
对于早期版本,可以使用 update()
方法或字典推导式。
结语
本文详细介绍了 Python 字典的基础操作和高级应用。我们从字典的定义、创建、修改等基本操作入手,逐步深入到了嵌套字典、字典的性能分析以及高级字典技巧,如字典推导式、defaultdict
、OrderedDict
等。通过这些内容的学习,开发者不仅能够高效地管理和组织数据,还可以在实际开发中灵活地应用字典解决复杂问题。
今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,17的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是17前进的动力!
相关文章:

解锁 Python 嵌套字典的奥秘:高效操作与实战应用指南
文章目录 前言🍀一、 什么是 Python 字典?1.1 字典的语法 🍀二、 字典的基本操作2.1 字典的创建2.2 访问字典中的值2.3 添加或修改键值对2.4 删除字典中的键值对 🍀三、 字典的遍历操作3.1 遍历字典的键3.2 遍历字典的值3.3 同时遍…...

联想服务器配置阵列、安装操作系统
文章目录 [toc]1.配置阵列2.制作启动盘3.安装系统 1.配置阵列 1.根据提示进入BIOS设置(F1) 2.系统设置 3.存储 4.第四步可以看到raid卡信息 5.Main Menu 6.Configuration Management 7.Create Virtual Drive 8.Select RAID Level raid5 9.Select Drives…...

【深度强化学习】DDPG实现的4个细节(OUNoise等)
文章目录 前言一、论文内容简述创新点(特点,与DQN的区别):可借鉴参数:细节补充: 二、细节1:weight_decay原理代码 三、细节2:OUNoise原理代码 四、细节3:ObsNorm原理代码…...

算法工程师重生之第二十二天(递增子序列 全排列 全排列 II 重新安排行程 N皇后 解数独 总结 )
参考文献 代码随想录 一、非递减子序列 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素,如出现两个整数相等,也可以视作…...
css的选择器及优先级
一、css选择器 CSS选择器是用来选择HTML文档中的元素,并为它们应用样式规则的工具。CSS选择器有很多种,可以根据元素的类名、ID、属性、伪类、伪元素、标签等来选择元素。以下是一些常见的CSS选择器及其用法: 1. ID选择器: 根据…...
JavaScript中的数组不改变原数组的方法
数组 var a [1, 2, 3, 5, 8, 13, 21] 不改变原数组的方法 length 数组元素的长度 继承自原型 concat(arrayX,arrayY) 合并两个或多个数组,返回新数组 合并,a.concat(b) var a[1,2,3],b[4,5,6],c[7,8,9]; a.concat(b,c); //[1, 2, 3, 4, 5, 6, 7…...
Go语言实现长连接并发框架 - 路由分组
文章目录 前言接口结构体接口实现项目地址最后 前言 你好,我是醉墨居士,我们上篇博客实现了任务执行流的路由模块,接下来我们实现一下对任务执行流进行任务 接口 trait/router_group.go type RouterGroup interface {RouterGroup(flow ..…...
跨 VLAN 通信
跨 VLAN 通信指的是不同 VLAN 之间的网络设备进行数据交换的能力。由于 VLAN 将网络分割成多个逻辑隔离的广播域,默认情况下,不同 VLAN 之间的设备无法直接通信。为了实现跨 VLAN 通信,需要借助一些网络设备和技术。以下详细讲解跨 VLAN 通信…...
11.4 Linux_线程_条件变量
概述 条件变量的作用: 条件变量和互斥量配合使用,主要应用于生产者和消费者问题。 这种问题也是一种临界资源的问题,但与互斥量一文中 "写文件" 这种资源不同。文件是一直存在的临界资源,而生产者的资源不是一直存在…...

通信工程学习:什么是IP网际协议
IP:网际协议 IP网际协议(Internet Protocol,简称IP)是整个TCP/IP协议栈中的核心协议之一,它负责在网络中传送数据包,并提供寻址和路由功能。以下是对IP网际协议的详细解释: 一、对IP网际协议的…...

github 国内文件加速下载
参看;https://www.cnblogs.com/ting1/p/18356265 在源网址前加上 https://hub.gitmirror.com/ 或https://mirror.ghproxy.com/,例如: https://hub.gitmirror.com/https://github.com/t1m0thyj/WinDynamicDesktop/releases/download/v5.4.1/WinDynamicD…...

算法6:模拟运算
文章目录 z字形变幻外观数列数青蛙 题目均来自于力扣 z字形变幻 class Solution { public:string convert(string s, int numRows) {int n s.size();if(n < numRows || numRows 1) return s;int d 2 * numRows - 2;string res;for(int j 0; j < n; j d){res s[j]; …...

【网络协议大花园】应用层 http协议的使用小技巧,用好了都不用加班,效率翻两倍(上篇)
本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…...

今日指数day8实战补充(上)
1.用户管理 1.多条件综合查询 1.1 多条件综合查询接口说明 1)原型效果 2)接口说明 功能描述:多条件综合查询用户分页信息,条件包含:分页信息 用户创建日期范围 服务路径:/api/users 服务方法࿱…...
Python 之进阶语法:with...as...
1. Python with…as…是什么 Python 的 with…as… 语句,就像一个贴心的管家,负责照顾你的资源,让你不再担心忘记关闭文件、网络连接或数据库事务等。这个管家在你进入“房间”时自动打开门,离开时帮你把门关上,真的是…...

嵌入式硬件设计知识详解
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
计算机网络:物理层 —— 信道及其极限容量
文章目录 信道信道的极限容量信号失真失真类型产生信号失真的主要因素 奈式准则码元传输速率香农公式 信道 信道是指信息传输的通道或介质。在通信中,信道扮演着传输信息的媒介的角色,将发送方发送的信号传递给接收方。 信道可以是无线信道,…...

面向对象特性中 继承详解
目录 概念: 定义: 定义格式 继承关系和访问限定符 基类和派生类对象赋值转换: 继承中的作用域: 派生类的默认成员函数 继承与友元: 继承与静态成员: 复杂的菱形继承及菱形虚拟继承: 虚…...

C++ | Leetcode C++题解之第455题分发饼干
题目: 题解: class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.begin(), s.end());int m g.size(), n s.size();int count 0;for (int i 0, j 0; i < …...

java版基于Spring Boot + Mybatis在线招投标|评标|竞标|单一采购|询价|邀标|在线开标|招标公告发布|评审专家|招投标采购系统源码
一、项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...