首页 最新 热门 推荐

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

Python-VBA函数之旅-tuple函数

  • 25-03-03 04:30
  • 3730
  • 9708
blog.csdn.net

目录

一、tuple函数的常见应用场景

二、tuple函数使用注意事项

三、如何用好tuple函数?

1、tuple函数:

1-1、Python:

1-2、VBA:

2、推荐阅读:

个人主页: https://myelsa1024.blog.csdn.net/

一、tuple函数的常见应用场景

        在Python中,tuple()函数的主要应用场景涉及需要不可变序列类型的情况,常见的应用场景有:

1、作为字典的键:由于元组是不可变的,它们可以用作字典的键;而列表由于是可变的,不能用作字典的键。

2、存储异质的元素集合:元组可以包含不同类型的元素,这使得它们成为存储异质性数据集合的理想选择。

3、返回多个值: 函数可以使用元组来返回多个值,这在许多情况下都很有用。

4、函数参数的打包和解包:元组在函数参数打包和解包方面非常有用,你可以使用`*`操作符将元组解包为函数的位置参数,或者使用`**`操作符将字典解包为函数的关键字参数,反过来,你也可以使用`*`将可迭代对象打包为元组,并作为函数参数传递。

5、元组推导式(Tuple Comprehension):虽然Python中没有直接称为“元组推导式”的语法结构,但你可以使用生成器表达式和tuple()函数来创建元组,这通常用于从其他可迭代对象生成元组。

6、表示记录或点的坐标:元组可以用来表示具有多个属性的记录或点的坐标。

7、作为命名元组:虽然这不是直接使用tuple()函数,但collections.namedtuple是一个高阶用法,它允许你创建具有名称的元组子类,这可以使元组更加易于理解和使用。

8、数据库或API交互:当与数据库或外部API交互时,经常需要以元组的形式接收或发送数据。例如,数据库查询的结果通常可以表示为元组的列表。

9、数据分析和科学计算:在数据分析、科学计算和机器学习等领域,元组经常用于表示多维数据点或向量。例如,在NumPy库中,尽管更常见的是使用NumPy数组,但元组也经常用于表示形状、索引等。

        tuple()函数虽然被称为函数,但实际上是一个不可变的序列类型,特别是在需要不可变序列或需要同时存储多个相关值的情况下,tuple()函数提供了一种从其他可迭代对象创建元组的简便方法。

二、tuple函数使用注意事项

        在Python中,tuple函数用于创建一个元组(tuple),元组是一个不可变的序列类型,可以包含任意类型的元素,并且一旦创建就不能被修改(尽管元组中的元素本身可能是可变的,比如列表或字典),使用tuple()函数时需注意以下几点:

1、元素类型:元组可以包含任何Python数据类型,包括整数、浮点数、字符串、列表、字典、元组本身等。

2、不可变性:元组一旦创建,其内容就不能被修改,这意味着你不能向元组中添加、删除或替换元素。

3、元组只有一个元素时的写法:如果你想要创建一个只包含一个元素的元组,你需要在该元素后面加上一个逗号,以区分它与括号内的普通表达式。

4、空元组:空元组可以用两个不包含任何元素的圆括号来表示。

5、性能考虑:由于元组是不可变的,它们在某些情况下可能比列表更有效率,因为它们不需要为可能的修改预留空间,然而,这也意味着在某些需要频繁修改序列的情况下,使用列表可能会更合适。

6、作为字典的键:由于元组是不可变的,它们可以作为字典的键;而列表由于是可变的,因此不能作为字典的键。

7、与list()函数的对比:tuple()和list()函数都是用于创建序列类型的,但它们的特性不同:list()创建的列表是可变的,而tuple()创建的元组是不可变的,选择使用哪个函数取决于你的具体需求。

8、解包:你可以使用多个变量来“解包”一个元组,这样每个变量都会获得元组中的一个元素。

三、如何用好tuple函数?

        要用好Python中的tuple()函数,请你遵循以下建议:

1、明确元组的用途:元组主要用于存储一组不可变的值,如果你需要存储一组值,并且这些值在程序的整个生命周期中都不会改变,那么元组是一个很好的选择。

2、使用元组作为字典的键:由于元组是不可变的,所以它们可以用作字典的键,这允许你基于多个值来索引字典。

3、利用元组的不可变性:由于元组是不可变的,它们可以作为函数的默认参数值,因为不用担心函数内部会修改它们,此外,当你想传递一组值给函数,并且不希望这些值在函数内部被修改时,元组也是一个好选择。

4、将序列转换为元组:如果你有一个列表、集合或其他可迭代对象,并且想要一个不可变的版本,你可以使用tuple()函数将其转换为元组。

5、使用元组解包:元组解包允许你将元组的元素分配给多个变量,这在处理返回多个值的函数时特别有用。

6、与列表的选择:虽然元组和列表都用于存储序列,但它们之间有一些关键差异:列表是可变的,而元组是不可变的。因此,在选择使用哪个时,请考虑是否需要修改元素?如果你不需要修改元素,并且希望提高代码的可读性和安全性(通过防止意外修改),那么元组可能是更好的选择。

7、避免不必要的元组:尽管元组在某些情况下很有用,但也要避免过度使用它们。例如,如果你只需要存储一个值,并且该值不是用作字典的键或需要不可变性的其他情况,那么使用一个简单的变量可能就足够了。

8、使用命名元组(namedtuples):在需要为元组的元素提供有意义的名称时,可以使用collections.namedtuple,命名元组允许你以更具可读性的方式访问元组的元素,而不是使用索引。

1、tuple函数:
1-1、Python:
  1. # 1.函数:tuple
  2. # 2.功能:用于将一个序列转换为元组
  3. # 3.语法:tuple([iterable])
  4. # 4.参数:iterable,表示可以转换为元组的数据
  5. # 5.返回值:返回一个元组,若不传入任何参数,则返回一个空元组
  6. # 6.说明:
  7. # 6-1、iterable类型可以是range对象、字符串、列表、字典、元组或其他可迭代类型的数据;如果参数是元组,参数则会被原样返回
  8. # 7.示例:
  9. # 用dir()函数获取该函数内置的属性和方法
  10. print(dir(tuple))
  11. # ['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__',
  12. # '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__',
  13. # '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__',
  14. # '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']
  15. # 用help()函数获取该函数的文档信息
  16. help(tuple)
  17. # 应用一:作为字典的键
  18. # 创建一个字典,其中元组作为键
  19. my_dict = {
  20. (1, 2, 3): 'value1',
  21. ('a', 'b', 'c'): 'value2',
  22. (True, False, True): 'value3',
  23. # 注意:元组内的元素也必须是可哈希的(例如,列表就不行,因为列表是可变的)
  24. # 例如,下面的元组不能用作字典的键,因为它包含了一个列表
  25. # ((1, 2), [3, 4]): 'value_invalid' # 这会抛出一个TypeError
  26. }
  27. # 访问字典中的值
  28. print(my_dict[(1, 2, 3)])
  29. print(my_dict[('a', 'b', 'c')])
  30. print(my_dict[(True, False, True)])
  31. # 尝试访问不存在的键会抛出KeyError
  32. # print(my_dict[(4, 5, 6)]) # 这会抛出一个KeyError
  33. # 添加一个新的键值对到字典中
  34. my_dict[(4, 5, 6)] = 'value4'
  35. print(my_dict[(4, 5, 6)])
  36. # 遍历字典
  37. for key, value in my_dict.items():
  38. print(f"Key: {key}, Value: {value}")
  39. # 删除一个键值对
  40. del my_dict[(1, 2, 3)]
  41. print(my_dict)
  42. # value1
  43. # value2
  44. # value3
  45. # value4
  46. # Key: (1, 2, 3), Value: value1
  47. # Key: ('a', 'b', 'c'), Value: value2
  48. # Key: (True, False, True), Value: value3
  49. # Key: (4, 5, 6), Value: value4
  50. # {('a', 'b', 'c'): 'value2', (True, False, True): 'value3', (4, 5, 6): 'value4'}
  51. # 应用二:存储异质的元素集合
  52. # 使用字面量创建一个包含异质元素的元组
  53. heterogeneous_tuple = (1, 'two', 3.0, [4, 5, 6], {'seven': 7})
  54. # 使用tuple()函数从列表或其他可迭代对象创建一个元组
  55. heterogeneous_list = [1, 'two', 3.0, [4, 5, 6], {'seven': 7}]
  56. heterogeneous_tuple_from_list = tuple(heterogeneous_list)
  57. # 打印元组
  58. print("使用字面量创建的元组:", heterogeneous_tuple)
  59. print("从列表创建的元组:", heterogeneous_tuple_from_list)
  60. # 访问元组中的元素
  61. print("第一个元素(整数):", heterogeneous_tuple[0])
  62. print("第二个元素(字符串):", heterogeneous_tuple[1])
  63. print("第三个元素(浮点数):", heterogeneous_tuple[2])
  64. print("第四个元素(列表):", heterogeneous_tuple[3])
  65. print("第五个元素(字典):", heterogeneous_tuple[4])
  66. # 尝试修改元组中的元素(将会失败,因为元组是不可变的)
  67. # heterogeneous_tuple[0] = 2 # 这会抛出一个 TypeError
  68. # 尝试修改元组中的列表元素(这将成功,因为列表本身是可变的)
  69. heterogeneous_tuple[3].append(7) # 修改元组中的列表
  70. print("修改后的第四个元素(列表):", heterogeneous_tuple[3])
  71. # 尝试修改元组中的字典元素(这也将成功,因为字典本身是可变的)
  72. heterogeneous_tuple[4]['eight'] = 8
  73. print("修改后的第五个元素(字典):", heterogeneous_tuple[4])
  74. # 使用字面量创建的元组: (1, 'two', 3.0, [4, 5, 6], {'seven': 7})
  75. # 从列表创建的元组: (1, 'two', 3.0, [4, 5, 6], {'seven': 7})
  76. # 第一个元素(整数): 1
  77. # 第二个元素(字符串): two
  78. # 第三个元素(浮点数): 3.0
  79. # 第四个元素(列表): [4, 5, 6]
  80. # 第五个元素(字典): {'seven': 7}
  81. # 修改后的第四个元素(列表): [4, 5, 6, 7]
  82. # 修改后的第五个元素(字典): {'seven': 7, 'eight': 8}
  83. # 应用三:返回多个值
  84. def return_multiple_values_with_tuple():
  85. # 使用tuple()函数创建一个元组并返回
  86. return tuple([1, 'two', 3.0])
  87. # 调用函数并解包元组
  88. a, b, c = return_multiple_values_with_tuple()
  89. # 打印结果
  90. print("a:", a)
  91. print("b:", b)
  92. print("c:", c)
  93. # 如果你不想解包元组,可以直接接收整个元组
  94. result_tuple = return_multiple_values_with_tuple()
  95. print("result_tuple:", result_tuple)
  96. # a: 1
  97. # b: two
  98. # c: 3.0
  99. # result_tuple: (1, 'two', 3.0)
  100. # 应用四:函数参数的打包和解包
  101. # 示例1:打包
  102. def my_function(a, b, c):
  103. print(f"a: {a}, b: {b}, c: {c}")
  104. # 使用元组字面量打包参数
  105. params = (1, 'two', 3.0)
  106. # 使用*操作符解包元组参数并传递给函数
  107. my_function(*params)
  108. # a: 1, b: two, c: 3.0
  109. # 示例2:解包
  110. def unpack_tuple(params):
  111. # 手动解包元组
  112. a, b, c = params
  113. print(f"a: {a}, b: {b}, c: {c}")
  114. # 创建一个元组
  115. params = (1, 'two', 3.0)
  116. # 调用函数并传递元组
  117. unpack_tuple(params)
  118. # a: 1, b: two, c: 3.0
  119. # 应用五:元组推导式
  120. # 示例1:使用tuple()函数和生成器表达式
  121. # 使用生成器表达式和tuple()函数创建一个元组
  122. my_tuple = tuple(x * x for x in range(1, 8))
  123. print(my_tuple)
  124. # (1, 4, 9, 16, 25, 36, 49)
  125. # 示例2:使用元组推导式
  126. # 使用元组推导式创建一个元组
  127. my_tuple = (x * x for x in range(1, 8)) # 注意:这里实际上是一个生成器表达式,不是元组推导式
  128. print(tuple(my_tuple)) # 我们需要将生成器转换为元组以打印结果
  129. # 真正的元组推导式(但这种写法在Python中并不存在,因为它会报错)
  130. # my_tuple = (x * x for x in range(1, 4)) # 这会创建一个生成器,而不是元组
  131. # 要得到元组,我们需要将其转换为元组,如上面的例子所示
  132. # 但如果我们想要立即得到一个元组,我们可以使用圆括号和条件表达式(不是推导式)
  133. my_immediate_tuple = tuple(x * x for x in [1, 2, 3, 4, 5, 6, 7]) # 这里使用了列表而不是范围,但立即转换为元组
  134. print(my_immediate_tuple)
  135. # (1, 4, 9, 16, 25, 36, 49)
  136. # (1, 4, 9, 16, 25, 36, 49)
  137. # 应用六:表示记录或点的坐标
  138. # 示例1:二维坐标点
  139. # 创建一个表示二维坐标点的元组
  140. point_2d = tuple((1, 2)) # 也可以直接写为 point_2d = (1, 2)
  141. # 访问坐标点的值
  142. x = point_2d[0]
  143. y = point_2d[1]
  144. print(f"二维坐标点: ({x}, {y})")
  145. # 二维坐标点: (1, 2)
  146. # 示例2:三维坐标点
  147. # 创建一个表示三维坐标点的元组
  148. point_3d = tuple((1, 2, 3)) # 也可以直接写为 point_3d = (1, 2, 3)
  149. # 访问坐标点的值
  150. x = point_3d[0]
  151. y = point_3d[1]
  152. z = point_3d[2]
  153. print(f"三维坐标点: ({x}, {y}, {z})")
  154. # 三维坐标点: (1, 2, 3)
  155. # 示例3:从列表转换为元组
  156. # 有一个表示坐标的列表
  157. coord_list = [4, 5, 6]
  158. # 使用tuple()函数将列表转换为元组
  159. point_from_list = tuple(coord_list)
  160. # 访问坐标点的值
  161. x = point_from_list[0]
  162. y = point_from_list[1]
  163. z = point_from_list[2]
  164. print(f"从列表转换的坐标点: ({x}, {y}, {z})")
  165. # 从列表转换的坐标点: (4, 5, 6)
  166. # 应用七:作为命名元组
  167. from collections import namedtuple
  168. # 定义一个命名元组类型,用于表示一个点
  169. Point = namedtuple('Point', ['x', 'y'])
  170. # 创建一个命名元组实例
  171. p = Point(1, 2)
  172. # 访问命名元组的属性
  173. print(p.x) # 输出: 1
  174. print(p.y) # 输出: 2
  175. # 命名元组也支持解包到单独的变量中
  176. x, y = p
  177. print(x) # 输出: 1
  178. print(y) # 输出: 2
  179. # 命名元组是不可变的,尝试修改属性会抛出异常
  180. # p.x = 3 # 这会抛出一个 AttributeError
  181. # 你可以像普通元组一样对命名元组进行迭代
  182. for coord in p:
  183. print(coord) # 输出: 1, 然后输出: 2
  184. # 你还可以将命名元组转换为普通元组或列表
  185. print(tuple(p)) # 输出: (1, 2)
  186. print(list(p)) # 输出: [1, 2]
  187. # 1
  188. # 2
  189. # 1
  190. # 2
  191. # 1
  192. # 2
  193. # (1, 2)
  194. # [1, 2]
  195. # 应用八:数据库或API交互
  196. # 示例1:使用tuple()处理从数据库查询结果中获取的数据
  197. import sqlite3
  198. # 连接到SQLite数据库(仅为示例)
  199. conn = sqlite3.connect('example.db')
  200. cursor = conn.cursor()
  201. # 执行查询
  202. cursor.execute("SELECT id, name FROM users")
  203. # 从查询结果中获取所有行,每行都是一个元组(SQLite的默认行为)
  204. rows = cursor.fetchall()
  205. # 假设我们想将结果转换为命名元组以便于访问
  206. from collections import namedtuple
  207. User = namedtuple('User', ['id', 'name'])
  208. # 使用列表推导式将普通元组转换为命名元组
  209. users = [User(*row) for row in rows]
  210. # 现在我们可以像访问对象属性一样访问数据
  211. for user in users:
  212. print(f"ID: {user.id}, Name: {user.name}")
  213. # 关闭数据库连接
  214. cursor.close()
  215. conn.close()
  216. # 示例2:一个假设的API交互示例,其中使用tuple()打包参数
  217. import requests
  218. # 假设有一个API需要元组格式的参数(这在实际中很少见)
  219. # 但为了示例,我们假设它需要一对(x, y)坐标
  220. api_url = 'https://api.example.com/coordinates'
  221. # 使用tuple()打包坐标
  222. coordinates = (10, 24)
  223. # 构造请求(但注意,大多数API会期望JSON或表单编码的数据)
  224. # 这里我们假设API接受URL中的查询参数
  225. response = requests.get(f'{api_url}?x={coordinates[0]}&y={coordinates[1]}')
  226. # 处理响应...
  227. if response.status_code == 200:
  228. print(response.json())
  229. else:
  230. print(f"Error: {response.status_code}")
  231. # 应用九:数据分析和科学计算
  232. # 示例1:使用元组存储多维数据点
  233. # 创建一个三维数据点的元组
  234. point_3d = (1.0, 2.0, 3.0)
  235. # 访问元组中的元素
  236. x, y, z = point_3d
  237. print(f"X坐标: {x}, Y坐标: {y}, Z坐标: {z}")
  238. # X坐标: 1.0, Y坐标: 2.0, Z坐标: 3.0
  239. # 示例2:使用元组作为字典的键(在数据分析中)
  240. # 创建一个字典,其中元组作为键,值表示数据点的某种属性
  241. data_points = {
  242. (1, 2): "A点",
  243. (3, 4): "B点",
  244. (5, 6): "C点"
  245. }
  246. # 访问字典中的值
  247. print(data_points[(1, 2)]) # 输出: A点
  248. # 遍历字典
  249. for key, value in data_points.items():
  250. print(f"点 {key} 的属性是: {value}")
  251. # A点
  252. # 点 (1, 2) 的属性是: A点
  253. # 点 (3, 4) 的属性是: B点
  254. # 点 (5, 6) 的属性是: C点
  255. # 示例3:与 NumPy 数组结合使用
  256. import numpy as np
  257. # 创建一个 NumPy 数组
  258. arr = np.array([[1, 2], [3, 4], [5, 6]])
  259. # 假设我们想找到某行或某列的最大值,并将其与索引一起存储为元组
  260. max_values = [(np.argmax(row), np.max(row)) for row in arr]
  261. # 打印结果
  262. for index, value in max_values:
  263. print(f"在第 {index} 列的最大值是: {value}")
  264. # 注意:这里的索引和值是以元组形式存储的,但索引本身也可以是一个元组(对于多维数组)
  265. # 在第 1 列的最大值是: 2
  266. # 在第 1 列的最大值是: 4
  267. # 在第 1 列的最大值是: 6
  268. # 示例4:使用元组存储统计摘要
  269. import statistics
  270. # 假设我们有一组数据
  271. data = [3, 5, 6, 8, 10, 10, 11, 24]
  272. # 计算均值和标准差,并将它们存储在一个元组中
  273. stats = (statistics.mean(data), statistics.stdev(data))
  274. # 打印统计摘要
  275. print(f"均值: {stats[0]}, 标准差: {stats[1]}")
  276. # 均值: 9.625, 标准差: 6.435115716575289
1-2、VBA:
略,待后补。
2、推荐阅读:

2-1、Python-VBA函数之旅-list()函数

Python算法之旅:Algorithms

Python函数之旅:Functions

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

/ 登录

评论记录:

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

分类栏目

后端 (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