元组是一个不可变的序列。

元组的操作的方式基本上和列表是一致的,所以你在操作元组时,就把元组当成是一个不可变的列表就OK了。

一般情况下,当我们希望数据不改变时,就使用元组,其余情况都使用列表。

思考:如果想要存储多个数据,但是这些数据是不能修改的数据,怎么做?

答:列表可以一次性存储多个数据,但是列表中的数据允许更改。

  1. # 结果:[100, 20, 30]
  2. num_list = [10, 20, 30]
  3. num_list[0] = 100
  4. print(num_list)

这个时候,我们就可以定义一个元祖,一个元组可以存储多个数据,元组内的数据是不能修改的。

元组特点:定义元组使用小括号,且用逗号隔开各个数据,数据可以是不同的数据类型。

示例

  1. # 1. 定义多个元素元组
  2. t1 = (10, 20, 30)
  3. print(type(t1)) # <class 'tuple'>
  4. # 2. 定义单个元素的元组
  5. # 如果元组不是空元组,它里边至少要有一个逗号
  6. t2 = (10,)
  7. print(type(t2))
  8. # 3. 如果单个数据的元组不加逗号
  9. t3 = (10)
  10. print(type(t3)) # <class 'int'>
  11. t4 = ('aaa')
  12. print(type(t4)) # <class 'str'>
  13. t5 = ('aaa',)
  14. print(type(t5)) # <class 'tuple'>
  15. # 4.当元组不是空元组时,括号可以省略(封包)
  16. my_tuple = 10,20,30,40
  17. print(type(my_tuple)) # <class 'tuple'>
  18. my_tuple1 = 40,
  19. print(type(my_tuple1)) # <class 'tuple'>

注意:如果定义的元组只有一个数据,那么这个数据后面也要添加逗号,否则该数据类型为对应的基本类型数据。

元组是不可变对象,所以不能尝试为元组中的元素重新赋值(修改、删除),只支持查找,具体如下:

  1. tuple1 = ('aa', 'bb', 'cc', 'bb')
  2. print(tuple1[0]) # aa
  3. # 如果下标越界会报异常
  4. # IndexError: tuple index out of range
  5. tuple1 = ('aa', 'bb', 'cc', 'bb')
  6. print(tuple1[7])

index()方法:查找某个数据,如果数据存在返回对应的下标,否则报错。

语法和列表、字符串的index()方法相同。

  1. tuple1 = ('aa', 'bb', 'cc', 'bb')
  2. print(tuple1.index('aa')) # 0
  3. # ValueError: tuple.index(x): x not in tuple
  4. print(tuple1.index('aaa'))

count()方法:统计某个元素在当前元组出现的次数。没有出现结果就是0。

  1. tuple1 = ('aa', 'bb', 'cc', 'bb')
  2. print(tuple1.count('bb')) # 2
  3. print(tuple1.count('bbb')) # 0

len():统计元组中元素的个数。

  1. tuple1 = ('aa', 'bb', 'cc', 'bb')
  2. print(len(tuple1)) # 4

注意:元组内的直接数据如果修改则立即报错

  1. # TypeError: 'tuple' object does not support item assignment
  2. tuple1 = ('aa', 'bb', 'cc', 'bb')
  3. tuple1[0] = 'aaa'

但是如果元组里面有列表,则列表里面的元素是支持修改的,这点要记住。

  1. # 结果:['aa', 'bb', 'cc']
  2. tuple2 = (10, 20, ['aa', 'bb', 'cc'], 50, 30)
  3. print(tuple2[2]) # 访问到列表
  4. # 结果:(10, 20, ['孙悟空', 'bb', 'cc'], 50, 30)
  5. tuple2[2][0] = '孙悟空'
  6. print(tuple2)
  • 序列封包:程序把多个值赋给一个变量时,Python会自动将多个值封装成元组,这种功能叫做序列封包。
  • 程序允许将序列(字符串、元组、列表等)直接赋值给多个变量,此时序列的各元素会被依次赋值给每个变量(要求序列的元素个数和变量个数相等),这种功能叫做序列解包。

(1)示例说明

  1. # 1.元组封包
  2. # 多个值赋给一个变量,将多个值封装成元组
  3. my_tuple = 10,20,30,40
  4. print(type(my_tuple)) # <class 'tuple'>
  5. print(my_tuple) # (10, 20, 30, 40)
  6. # 2.元组解包
  7. # 解包指就是将元组当中每一个元素都赋值给一个变量
  8. my_tuple = (10, 20, 30, 40)
  9. a, b, c, d = my_tuple
  10. print("a = ", a)
  11. print("b = ", b)
  12. print("c = ", c)
  13. print("d = ", d)
  14. """
  15. 输出结果:
  16. a = 10
  17. b = 20
  18. c = 30
  19. d = 40
  20. """
  21. # 3.序列的元素个数和变量个数相等,否则会报错
  22. # 结果:ValueError: too many values to unpack (expected 3)
  23. my_tuple = 10, 20, 30, 40
  24. a, b, c = my_tuple

(2)应用扩展

  1. # 1.如果元组中有100个元素,我想取前两个。
  2. # 可以在变量前边添加一个*,这样变量将会获取元组中所有剩余的元素
  3. my_tuple = (10, 20, 30, 40)
  4. a, b, *c = my_tuple
  5. print("a = ", a)
  6. print("b = ", b)
  7. print("c = ", c)
  8. """
  9. 输出结果:
  10. a = 10
  11. b = 20
  12. c = [30, 40]
  13. """
  14. # 2.*给任何一个变量都可以
  15. my_tuple = (10, 20, 30, 40)
  16. a, *b, c = my_tuple
  17. print("a = ", a)
  18. print("b = ", b)
  19. print("c = ", c)
  20. """
  21. 输出结果:
  22. a = 10
  23. b = [20, 30]
  24. c = 40
  25. """
  26. # 3.不能同时出现两个或以上的*变量,否则会报错
  27. # 结果:SyntaxError: two starred expressions in assignment
  28. my_tuple = (10, 20, 30, 40)
  29. a, *b, *c = my_tuple
  30. # 4.同理字符串和列表都支持序列的解包。
  31. a , b , *c = [1,2,3,4,5,6,7]
  32. a , b , *c = 'hello world'
  33. # 5.字典拆包
  34. dict1 = {'name': 'TOM', 'age': 18}
  35. a, b = dict1
  36. # 对字典进行拆包,取出来的是字典的key
  37. print(a) # name
  38. print(b) # age
  39. # 通过上面的拆包得到了字典中的key名,
  40. # 在通过key名就可以取到字典中key所对应的value值了。
  41. print(dict1[a]) # TOM
  42. print(dict1[b]) # 18

(3)数值交互应用

  1. 需求:有变量`a = 10`和`b = 20`,交换两个变量的值。
  2. # 1. 方法一
  3. """
  4. 1.1 定义中间的第三变量,为了临时存储a或b的数据
  5. 1.2 把a的数据存储到c,做保存
  6. 1.3 把b的数据赋值到a, a = 20
  7. 1.4 把c的数据赋值到b, b = 10
  8. """
  9. a = 10
  10. b = 20
  11. # 交互
  12. c = 0
  13. c = a
  14. a = b
  15. b = c
  16. print("a =", a) # a = 20
  17. print("b =", b) # b = 10
  18. # 2.应用序列的组包,拆包
  19. """
  20. 两个变量互换值,如交互a和b的值
  21. 等号右边b,a就是一个元祖的定义。(组包)
  22. 等号左边的两个变量接收元组中的元素。(拆包)
  23. 输出结果:
  24. a = 20
  25. b = 10
  26. """
  27. a, b = b, a
  28. print("a =", a)
  29. print("b =", b)

版权声明:本文为liuyuelinfighting原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/liuyuelinfighting/p/14975358.html