首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Python-VBA函数之旅-hash函数

  • 25-03-03 04:30
  • 2605
  • 12838
blog.csdn.net

目录

一、hash函数的定义:

二、hash函数的工作方式:

​三、hash函数的优缺点:

四、hash函数的常见应用场景:

1、hash函数:

1-1、Python:

1-2、VBA:

2、推荐阅读:

个人主页:https://blog.csdn.net/ygb_1024?spm=1010.2135.3001.5421 



一、hash函数的定义:

        哈希函数(Hash Function)是一种将任意长度的数据(如字符串或数字)映射为固定长度数值(通常为较小的整数)的函数。这个固定长度的数值被称为哈希值或哈希码。哈希函数的主要特点是它能够将不同的输入映射到不同的哈希值,并且对于相同的输入,哈希函数应该总是产生相同的哈希值。

哈希函数的设计通常满足以下性质:

1、确定性:对于相同的输入,哈希函数总是产生相同的输出。

2、高效性:哈希函数的计算应该相对快速,以便在实际应用中能够高效地处理大量数据。

3、雪崩效应:哈希函数的输出对输入的微小变化应该非常敏感,即输入的小变化应该导致哈希值的大变化。这有助于减少哈希冲突的可能性。

4、散列均匀性:哈希函数的输出应该尽可能均匀地分布在输出空间中,以减少哈希冲突的概率。

        哈希函数在多个领域有广泛应用,如数据查找(如哈希表)、数据完整性校验(如MD5或SHA-1用于文件校验和)、密码学(如加密哈希函数用于数字签名和消息认证)等。

        注意,哈希函数不是加密算法,它们是单向的,即不能从哈希值反推出原始输入数据。此外,由于哈希函数的设计特点和固定长度的输出,哈希冲突(不同输入产生相同哈希值)是不可避免的,但好的哈希函数会尽量减少这种冲突的发生。

二、hash函数的工作方式:

        哈希函数的工作方式可以概括为以下几个步骤:

1、接收输入:哈希函数首先接收一个输入,这个输入可以是任意长度的数据,比如一个字符串、一个数字、或者一组数据。

2、执行哈希算法:接下来,哈希函数会对输入数据进行一系列复杂的数学运算和转换。这些运算和转换通常包括位操作、模运算、加法、乘法等,具体的运算方式取决于哈希函数的设计和实现。这些运算的目的是将输入数据转换成一个固定长度的数值,即哈希值。

3、生成哈希值:经过哈希算法的处理后,哈希函数会输出一个固定长度的哈希值。这个哈希值通常是一个较小的整数,其长度是预先确定的,不会因为输入数据的长度变化而变化。

4、保证唯一性和确定性:哈希函数的设计需要满足一些关键特性,如确定性、散列均匀性和雪崩效应。确定性意味着对于相同的输入,哈希函数总是产生相同的输出;散列均匀性要求哈希值尽可能均匀地分布在整个输出空间中,以减少哈希冲突的可能性;雪崩效应则要求输入数据的微小变化能够导致哈希值的显著变化。

        哈希函数的工作方式使得它能够在多个领域发挥重要作用。例如,在数据结构中,哈希函数可以将数据映射到哈希表的特定位置,从而实现快速的插入、查找和删除操作。在密码学中,哈希函数可以用于生成数据的唯一标识符,用于验证数据的完整性和未被篡改。此外,哈希函数还可以用于创建数字签名、实现消息认证等安全功能。

        注意,哈希函数是单向的,即不能从哈希值反推出原始输入数据。这种单向性保证了哈希函数的安全性,使得它成为许多安全应用中的关键组件。

三、hash函数的优缺点:

        哈希函数的优点和缺点主要体现在以下几个方面:

1、优点:

1-1、快速查找:哈希函数的主要优点是它们能够快速地定位到数据。通过将数据映射到唯一的哈希值,哈希函数允许我们以接近常量的时间复杂度(O(1))进行查找,这比线性搜索或二分搜索等算法要快得多。

1-2、空间效率高:哈希表通常能够以较小的空间存储大量的数据,因为哈希表不需要像数组那样预留连续的空间,也不需要像链表那样存储额外的指针。

1-3、灵活性:哈希函数可以用于各种类型的数据,不仅仅是数字或字符串。通过适当的哈希函数设计,我们可以为自定义的对象类型定义哈希值,从而将它们用作哈希表中的键。

2、缺点:

2-1、哈希冲突:虽然哈希函数设计得尽可能减少冲突,但冲突仍然可能发生。当两个不同的输入产生相同的哈希值时,就需要额外的机制(如链地址法或开放地址法)来处理这种冲突。这可能会增加查找和插入操作的复杂性。

2-2、敏感于输入变化:哈希函数对于输入的变化非常敏感。即使输入只有微小的变化,也可能导致哈希值发生很大的变化。这种敏感性在某些情况下是优点(如密码学哈希),但在其他情况下可能导致问题,因为相似的输入可能产生完全不同的哈希值。

2-3、不可逆性:哈希函数通常是单向的,即给定一个哈希值,很难(或不可能)找到原始输入。虽然这在某些场景下是优点(如密码存储),但在需要从哈希值恢复原始数据的场景下则成为缺点。

2-4、不适合排序:哈希表本身不保证元素的顺序,如果你需要按照某种顺序访问元素,那么哈希表可能不是最佳选择。

2-5、动态调整开销:当哈希表的大小需要动态调整(例如,当哈希表填满一定比例时)时,可能需要重新计算所有元素的哈希值并将它们移动到新的位置。这个过程可能会导致额外的开销。

        注意,哈希函数的优点和缺点会因具体应用场景和需求而异。在选择使用哈希函数或哈希表时,需要根据实际情况进行权衡和选择。

四、hash函数的常见应用场景:

        hash函数在Python中具有广泛的应用场景,主要是因为哈希表(如Python中的字典)的广泛使用以及哈希在算法和数据结构中的基础作用。常见的应用场景有:

1、字典的实现:字典是Python中非常重要的数据结构,它允许我们存储键值对。字典的底层实现通常依赖于哈希表。当向字典中添加一个键值对时,Python会使用hash()函数计算键的哈希值,并基于这个哈希值在哈希表中查找或存储该键值对,这种基于哈希值的查找方式使得字典的查找、插入和删除操作都非常快。

2、集合的实现:集合也是Python中的一种数据结构,用于存储唯一元素的集合。集合也使用哈希表来实现其底层存储,因此元素的哈希值对于集合的操作(如添加、删除、查找)至关重要。

3、数据去重与指纹生成:哈希函数可以用于生成数据的唯一指纹,这在数据去重、文件比较和版本控制等场景中非常有用。通过对数据进行哈希处理,可以生成一个固定长度的哈希值,用于标识数据的唯一性。当需要比较两个数据时,只需比较它们的哈希值即可,无需逐字节比较原始数据,从而提高了比较效率。

4、快速查找:在需要快速查找的场景中,可以使用哈希表。例如,如果你有一个大型的数据集,并且需要频繁地查找其中的元素,那么将数据集转换为一个哈希表(如字典或集合)可以大大提高查找速度。

5、缓存机制:在缓存系统中,哈希函数常用于将缓存键映射到缓存存储位置。这样,当需要查找缓存项时,可以直接使用哈希值来快速定位。

6、数据完整性校验:虽然Python的hash()函数主要用于内部的数据结构操作,但类似的哈希函数(如MD5、SHA系列)常用于数据完整性校验。通过计算数据的哈希值,并在数据传输或存储后重新计算哈希值进行比较,可以检测数据是否在传输或存储过程中被篡改。

7、分布式系统:在分布式系统中,哈希函数可以用于数据分区和负载均衡。通过将数据的键进行哈希,并根据哈希值将数据分配到不同的节点或服务器上,可以实现数据的分布式存储和处理。

8、密码学应用:在密码学中,哈希函数具有广泛的应用,如密码存储、数字签名和消息认证等。通过将密码或消息通过哈希函数转换为一个固定长度的哈希值,可以隐藏原始数据的具体内容,同时保留数据的唯一性。这使得哈希函数在保护用户密码安全、验证数据完整性和身份认证等方面发挥重要作用。

9、哈希表优化:在构建自定义哈希表或优化现有哈希表时,可以深入研究哈希函数的选择和冲突解决策略。通过设计更好的哈希函数(如减少冲突、均匀分布哈希值等),可以提高哈希表的性能。此外,还可以探索不同的冲突解决策略,如链地址法、开放地址法等。

10、布隆过滤器:布隆过滤器是一种空间效率极高的概率型数据结构,它利用位数组和哈希函数来快速判断一个元素是否存在于集合中。通过多个哈希函数将元素映射到位数组的不同位置,并将这些位置设置为1,从而实现了高效的插入和查询操作。虽然布隆过滤器可能会产生误报(即错误地认为元素存在于集合中),但其空间占用和查询效率的优势使得它在许多场景下非常有用。

11、自定义哈希函数:在某些特殊应用场景下,可能需要自定义哈希函数来满足特定需求。例如,在处理具有特定模式或结构的数据时,可以根据数据的特性设计哈希函数以提高哈希的均匀性和效率。通过继承Python的hash类并实现`__hash__()`方法,可以创建自定义的哈希函数。

        注意,虽然哈希函数在某些场景下非常有用,但它们并不是安全的加密机制。哈希函数的设计目标是快速计算且冲突率低,而不是保证输出不可预测或防止逆向工程。因此,对于需要高度安全性的场景(如密码存储),应该使用专门的加密哈希函数(如bcrypt、Argon2等)。

1、hash函数:
1-1、Python:
  1. # 1.函数:hash
  2. # 2.功能:用于获取对象的哈希值
  3. # 3.语法:hash(object)
  4. # 4.参数:object,必须,一个不可变对象
  5. # 5.返回值:返回对象的哈希值(若有的话)
  6. # 6.说明:只有不可变对象,才有哈希值
  7. # 7.示例:
  8. # 应用1:字典的实现
  9. class Person:
  10. def __init__(self, name, age):
  11. self.name = name
  12. self.age = age
  13. def __hash__(self):
  14. # 使用内置的hash函数对name和age进行哈希,并将结果组合起来
  15. # 注意:为了避免哈希冲突,通常建议使用更复杂的方法,这里仅为示例
  16. return hash((self.name, self.age))
  17. def __eq__(self, other):
  18. # 当两个Person对象具有相同的name和age时,它们被认为是相等的
  19. if isinstance(other, Person):
  20. return self.name == other.name and self.age == other.age
  21. return False
  22. # 创建Person对象并使用它们作为字典的键
  23. people = {
  24. Person("Myelsa", 18): "Myelsa's info",
  25. Person("Jimmy", 15): "Jimmy's info"
  26. }
  27. # 根据Person对象获取字典中的值
  28. alice = Person("Myelsa", 18)
  29. print(people[alice])
  30. # Myelsa's info
  31. # 应用2:集合的实现
  32. class Person:
  33. def __init__(self, name, age):
  34. self.name = name
  35. self.age = age
  36. def __hash__(self):
  37. # 使用内置的hash函数对name和age进行哈希,并将结果组合起来
  38. # 注意:这里仅使用简单的元组哈希,实际中可能需要更复杂的哈希策略
  39. return hash((self.name, self.age))
  40. def __eq__(self, other):
  41. # 当两个Person对象具有相同的name和age时,它们被认为是相等的
  42. if isinstance(other, Person):
  43. return self.name == other.name and self.age == other.age
  44. return False
  45. # 创建Person对象并使用它们作为集合的元素
  46. people = {Person("Myelsa", 18), Person("Jimmy", 15)}
  47. # 尝试添加一个已经存在的Person对象到集合中,它不会被添加(因为是重复的)
  48. existing_person = Person("Myelsa", 18)
  49. people.add(existing_person) # 这个操作实际上不会改变集合,因为Myelsa已经在里面了
  50. # 打印集合中的元素数量,它应该仍然是2,因为Myelsa只被计算了一次
  51. print(len(people))
  52. # 检查一个Person对象是否在集合中
  53. alice = Person("Myelsa", 18)
  54. print(alice in people)
  55. # 2
  56. # True
  57. # 应用3:数据去重与指纹生成
  58. # 接受字符串信息,返回哈希值
  59. import hashlib
  60. def simple_hash(data: str) -> str:
  61. """
  62. 计算字符串的哈希值
  63. """
  64. # 创建一个哈希对象
  65. hasher = hashlib.sha256()
  66. # 提供数据给哈希对象
  67. hasher.update(data.encode('utf-8'))
  68. # 获取十六进制哈希值
  69. return hasher.hexdigest()
  70. # 使用示例
  71. data = "Hello, Python!"
  72. hash_value = simple_hash(data)
  73. print(f"Hash of '{data}': {hash_value}")
  74. # Hash of 'Hello, Python!': 1c68755fc075a6bb08a82e80a5f1d3c8a8d40086a73cd8195ec7c43a7554f188
  75. # 列表去重复项
  76. def remove_duplicates_with_hash(data_list: list) -> list:
  77. """
  78. 使用哈希值去除列表中的重复项
  79. """
  80. # 创建一个集合来存储唯一的哈希值
  81. unique_hashes = set()
  82. # 创建一个列表来存储去重后的数据
  83. unique_data = []
  84. for item in data_list:
  85. hash_value = simple_hash(item)
  86. # 如果哈希值不在集合中,说明这是唯一的项
  87. if hash_value not in unique_hashes:
  88. unique_hashes.add(hash_value)
  89. unique_data.append(item)
  90. return unique_data
  91. # 使用示例
  92. data_list = ["apple", "banana", "apple", "cherry", "banana"]
  93. unique_data_list = remove_duplicates_with_hash(data_list)
  94. print(f"Unique data list: {unique_data_list}")
  95. # Unique data list: ['apple', 'banana', 'cherry']
  96. # 应用4:快速查找
  97. # 创建一个字典用于存储学生信息,学生ID作为键,学生姓名作为值
  98. students = {
  99. '1001': 'Myelsa',
  100. '1002': 'Bruce',
  101. '1003': 'Jimmy',
  102. # ... 可以添加更多学生信息
  103. }
  104. # 定义一个函数用于通过学生ID查找学生姓名
  105. def find_student_by_id(student_id, students_dict):
  106. return students_dict.get(student_id)
  107. # 示例:查找ID为1002的学生姓名
  108. student_id = '1002'
  109. student_name = find_student_by_id(student_id, students)
  110. if student_name:
  111. print(f"Student with ID {student_id} is {student_name}")
  112. else:
  113. print(f"No student found with ID {student_id}")
  114. # 如果需要添加新的学生信息,可以直接对字典进行操作
  115. new_student_id = '1004'
  116. new_student_name = 'Mark'
  117. students[new_student_id] = new_student_name
  118. # 再次查找新添加的学生
  119. student_name = find_student_by_id(new_student_id, students)
  120. if student_name:
  121. print(f"Newly added student with ID {new_student_id} is {student_name}")
  122. # Student with ID 1002 is Bruce
  123. # Newly added student with ID 1004 is Mark
  124. # 应用5:缓存机制
  125. import hashlib
  126. # 缓存类,使用字典存储缓存数据
  127. class Cache:
  128. def __init__(self):
  129. self.cache = {}
  130. # 生成缓存键的哈希函数
  131. def generate_cache_key(self, *args):
  132. # 将参数转换为字符串,并使用哈希算法生成哈希值
  133. key_str = '_'.join(str(arg) for arg in args)
  134. hasher = hashlib.sha256()
  135. hasher.update(key_str.encode('utf-8'))
  136. return hasher.hexdigest()
  137. # 缓存数据
  138. def cache_data(self, key, value):
  139. self.cache[key] = value
  140. # 获取缓存数据
  141. def get_cached_data(self, *args):
  142. key = self.generate_cache_key(*args)
  143. return self.cache.get(key)
  144. # 使用示例
  145. cache = Cache()
  146. # 缓存一些数据
  147. cache.cache_data(cache.generate_cache_key('key1'), 'value1')
  148. cache.cache_data(cache.generate_cache_key('key2', 123), 'value2')
  149. # 获取缓存数据
  150. print(cache.get_cached_data('key1'))
  151. print(cache.get_cached_data('key2', 123))
  152. # 尝试获取不存在的缓存数据
  153. print(cache.get_cached_data('nonexistent_key'))
  154. # value1
  155. # value2
  156. # None
  157. # 应用6:数据完整性校验
  158. import hashlib
  159. import os
  160. # 定义一个函数来计算文件的哈希值
  161. def calculate_file_hash(file_path, hash_algorithm='sha256'):
  162. """
  163. 计算文件的哈希值用于数据完整性校验
  164. :param file_path: 文件的路径
  165. :param hash_algorithm: 哈希算法的名称,默认为'sha256'
  166. :return: 文件的哈希值
  167. """
  168. # 创建一个哈希对象
  169. hasher = hashlib.new(hash_algorithm)
  170. # 打开文件并逐块读取数据,更新哈希对象
  171. with open(file_path, 'rb') as file:
  172. while True:
  173. chunk = file.read(4096) # 读取4096字节的数据块
  174. if not chunk:
  175. break
  176. hasher.update(chunk)
  177. # 获取十六进制哈希值
  178. return hasher.hexdigest()
  179. # 使用示例
  180. file_path = 'file.txt' # 替换为你的文件路径
  181. file_hash = calculate_file_hash(file_path)
  182. print(f"The hash of '{file_path}' is: {file_hash}")
  183. # 你可以将这个哈希值保存下来,然后在需要校验的时候重新计算文件的哈希值,并进行比较
  184. # 如果两个哈希值相同,那么数据就是完整的;如果不同,那么数据可能在传输或存储过程中被篡改
  185. # The hash of 'file.txt' is: 0ffe1abd1a08215353c233d6e009613e95eec4253832a761af28ff37ac5a150c
  186. # 应用7:分布式系统
  187. import hashlib
  188. # 假设我们有四个节点
  189. NUM_NODES = 4
  190. # 哈希函数,将键转换为0到NUM_NODES-1之间的数字
  191. def hash_key_to_node(key):
  192. # 使用md5哈希算法,将键转换为哈希值
  193. m = hashlib.md5()
  194. m.update(key.encode('utf-8'))
  195. # 取哈希值的最后几位,并转换为整数
  196. node_id = int(m.hexdigest(), 16) % NUM_NODES
  197. return node_id
  198. # 模拟一些数据键
  199. keys = ['3', '5', '6', '8', '10', '11', '24']
  200. # 分配数据到节点
  201. node_assignments = {}
  202. for key in keys:
  203. node_id = hash_key_to_node(key)
  204. if node_id not in node_assignments:
  205. node_assignments[node_id] = []
  206. node_assignments[node_id].append(key)
  207. # 打印每个节点的数据分配情况
  208. for node_id, keys_assigned in node_assignments.items():
  209. print(f"Node {node_id}: {keys_assigned}")
  210. # Node 3: ['3', '24']
  211. # Node 1: ['5', '8']
  212. # Node 0: ['6', '10']
  213. # Node 2: ['11']
  214. # 应用8:密码学应用
  215. import hashlib
  216. import os
  217. # 哈希密码的函数
  218. def hash_password(password, salt=None):
  219. if salt is None:
  220. salt = os.urandom(16) # 生成一个随机的盐值
  221. # 将密码和盐值拼接起来
  222. password_salt = password + salt.hex()
  223. # 创建SHA-256哈希对象
  224. hasher = hashlib.sha256()
  225. # 更新哈希对象
  226. hasher.update(password_salt.encode('utf-8'))
  227. # 获取哈希摘要的十六进制表示
  228. hashed_password = hasher.hexdigest()
  229. # 返回哈希值和盐值,通常将它们一起存储
  230. return hashed_password, salt
  231. # 使用示例
  232. password = 'my_secret_password'
  233. hashed_pwd, salt = hash_password(password)
  234. print(f"Hashed Password: {hashed_pwd}")
  235. print(f"Salt: {salt.hex()}")
  236. # 验证密码
  237. def verify_password(provided_password, stored_hashed_password, stored_salt):
  238. hashed_pwd, _ = hash_password(provided_password, stored_salt)
  239. return hashed_pwd == stored_hashed_password
  240. # 假设这是从数据库或其他存储中检索的存储哈希值和盐值
  241. stored_hashed_password = hashed_pwd
  242. stored_salt = salt
  243. # 用户提供的密码进行验证
  244. provided_password = input("Enter your password: ")
  245. if verify_password(provided_password, stored_hashed_password, stored_salt):
  246. print("Password is correct!")
  247. else:
  248. print("Password is incorrect!")
  249. # Hashed Password: 0fa70b9fe5516f543e28ab8d97e1e38e04594b7fd74331a0a25723552e437f20
  250. # Salt: 7301e12e361696eb7ae3272c05cb0569
  251. # Enter your password: 123
  252. # Password is incorrect!
  253. # 应用9:哈希表优化
  254. class HashTable:
  255. def __init__(self, size):
  256. self.size = size
  257. self.table = [[] for _ in range(size)]
  258. # 简单的哈希函数,使用取模运算
  259. def hash_function(self, key):
  260. return key % self.size
  261. # 处理哈希冲突的方法:链地址法
  262. def insert(self, key, value):
  263. hash_key = self.hash_function(key)
  264. bucket = self.table[hash_key]
  265. for pair in bucket:
  266. if pair[0] == key:
  267. pair[1] = value # 更新值
  268. return
  269. bucket.append([key, value]) # 添加新键值对
  270. def get(self, key):
  271. hash_key = self.hash_function(key)
  272. bucket = self.table[hash_key]
  273. for pair in bucket:
  274. if pair[0] == key:
  275. return pair[1]
  276. return None
  277. # 使用示例
  278. hash_table = HashTable(10)
  279. hash_table.insert(1, 'apple')
  280. hash_table.insert(11, 'banana')
  281. hash_table.insert(21, 'cherry')
  282. hash_table.insert(31, 'date')
  283. hash_table.insert(41, 'elderberry')
  284. print(hash_table.get(11))
  285. print(hash_table.get(21))
  286. # banana
  287. # cherry
  288. # 应用10:布隆过滤器
  289. import mmh3
  290. import bitarray
  291. class BloomFilter:
  292. def __init__(self, size, hash_count):
  293. """
  294. 初始化布隆过滤器
  295. :param size: 位数组的大小
  296. :param hash_count: 要使用的哈希函数数量
  297. """
  298. self.size = size
  299. self.hash_count = hash_count
  300. self.bit_array = bitarray.bitarray(size)
  301. self.bit_array.setall(0) # 初始化所有位为0
  302. self.hashes = [self._get_hash_function(i) for i in range(hash_count)]
  303. def _get_hash_function(self, seed):
  304. """
  305. 生成哈希函数,这里使用mmh3库的不同种子来模拟多个哈希函数
  306. :param seed: 哈希函数的种子
  307. :return: 哈希函数
  308. """
  309. def hash_function(data):
  310. return mmh3.hash(data, seed) % self.size
  311. return hash_function
  312. def add(self, item):
  313. """
  314. 向布隆过滤器中添加元素
  315. :param item: 要添加的元素
  316. """
  317. for hash_func in self.hashes:
  318. index = hash_func(item)
  319. self.bit_array[index] = 1
  320. def might_contain(self, item):
  321. """
  322. 检查布隆过滤器是否可能包含某个元素
  323. 注意:这里只能返回“可能包含”,因为布隆过滤器存在误报的可能性
  324. :param item: 要检查的元素
  325. :return: 如果可能包含则返回True,否则返回False
  326. """
  327. for hash_func in self.hashes:
  328. index = hash_func(item)
  329. if self.bit_array[index] == 0:
  330. return False
  331. return True
  332. # 使用示例
  333. if __name__ == "__main__":
  334. # 创建一个大小为1000000,使用3个哈希函数的布隆过滤器
  335. bf = BloomFilter(size=1000000, hash_count=3)
  336. # 添加一些元素到布隆过滤器中
  337. bf.add("apple")
  338. bf.add("banana")
  339. bf.add("cherry")
  340. # 检查元素是否可能存在于布隆过滤器中
  341. print(bf.might_contain("apple")) # 应该返回True
  342. print(bf.might_contain("date")) # 可能返回True(误报),也可能返回False,取决于哈希碰撞情况
  343. # True
  344. # False
  345. # 应用11:自定义哈希函数
  346. class Person:
  347. def __init__(self, name, age):
  348. self.name = name
  349. self.age = age
  350. # 自定义哈希函数
  351. def __hash__(self):
  352. # 使用元组的哈希值作为基础,因为元组是不可变的,并且有自己的哈希实现
  353. return hash((self.name, self.age))
  354. # 为了使对象可哈希,还需要定义 __eq__ 方法
  355. def __eq__(self, other):
  356. if not isinstance(other, Person):
  357. return False
  358. return self.name == other.name and self.age == other.age
  359. # 创建Person对象
  360. person1 = Person("Alice", 30)
  361. person2 = Person("Bob", 25)
  362. person3 = Person("Alice", 30) # 与person1相同
  363. # 将对象添加到集合中,集合要求元素是可哈希的
  364. people_set = {person1, person2}
  365. # 检查person3是否“可能”在集合中
  366. # 注意:由于哈希冲突的可能性,这只是一个快速的检查,不一定准确
  367. # 要准确检查,还需要使用 __eq__ 方法进行比较
  368. print(person3 in people_set) # 输出: True,因为person3和person1在内容上相等
  369. # 使用字典,字典的键也必须是可哈希的
  370. people_dict = {person1: "Office A", person2: "Office B"}
  371. print(people_dict[person1]) # 输出: Office A
  372. # True
  373. # Office A
1-2、VBA:
略,待后补。
2、推荐阅读:

1、Python-VBA函数之旅-float()函数

Python算法之旅:Algorithm

Python函数之旅:Functions 

个人主页:神奇夜光杯-CSDN博客 
文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览61139 人正在系统学习中
遨游码海,我心飞扬
微信名片
注:本文转载自blog.csdn.net的神奇夜光杯的文章"https://myelsa1024.blog.csdn.net/article/details/138021102"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top