1. #序列类型  
  2. #Python提供了5种内置的序列类型:bytearray、bytes、list、str、tuple  
  3. #Python标准库中还提供了其他一些序列类型,最值得注意的是collections.namedtuple。  
  4.  
  5. #元组  
  6. #元组是个有序序列,其中包含0个或多个对象引用。  
  7. #元组支持与字符串一样的分片与的语法,这使得从元组中提取项比较容易。  
  8. #与字符串类似,元组也是固定的,因此,不能替换或删除其中包含的任意数据项。  
  9. #如果需要修改有序序列,我们应该使用列表而非元组。  
  10. #如果需要对一个元组对齐进行修改,那么可以用list()转换函数将其转换为列表,  
  11. #之后在产生的列表之上进行适当修改。  
  12.  
  13. # tuple()在不指定参数的时候将返回一个空元组,  
  14. #包含一个或多个项的元组可以使用逗号分隔进行创建。  
  15. #元组只提供了两种方法:  
  16. #t.count(x),返回对象x在元组中出现的次数;  
  17. #t.index(x),返回对象在元组t中出现的最左边位置,在元组中不包含x时,产生ValueError异常  
  18. #此外元组可以使用操作符+(连接)、*(赋值)与[](分片),也可以使用in与not in来测试成员关系。  
  19. #虽然元组是固定对象,但+=与*=这两个增强的赋值运算符也可以使用,  
  20. #实际上是Python创建了新的元组,用于存放结果,并将左边的对象引用设置为指向新元组。  
  21. #元组可以使用标准的比较操作符(<、<=、==、!=、>=、>)进行比较,  
  22. #这种比较实际上逐项进行的(对嵌套项,如果元组内的元组,递归进行处理)  
  23. >>> hair = "black""brown""blonde""red" 
  24. >>> hair[2]  
  25. 'blonde' 
  26. >>> hair[-3:]  
  27. ('brown''blonde''red')  
  28. >>> hair[:2], "gray", hair[2:]  
  29. (('black''brown'), 'gray', ('blonde''red'))  
  30. >>> hair[:2] + ("gray",) + hair[2:]  
  31. ('black''brown''gray''blonde''red')  
  32. >>> eyes = ("brown""hazel""amber""green""blue""gray")  
  33. >>> colors = (hair, eyes)  
  34. >>> colors[1][3:-1]  
  35. ('green''blue')  
  36. #[]分片操作符可以应用于一个分片,必要时可用使用多个  
  37. >>> things = (1, -7.5, ("pea", (5"Xyz"), "queue"))  
  38. >>> things [2][1][1][2]  
  39. 'z' 
  40. #元组可以存放任意数据类型的任意项,包括组合类型,比如元组与列表,实际上存放的是对象引用。  
  41. #但是使用这样复杂的嵌套数据结构很容易造成混淆,一个解决的办法是为特定的索引位置指定名字:  
  42. >>> MAINUFACTURER, MODEL, SEATING = (012)  
  43. >>> MINIMUM, MAXIMUM = (01)  
  44. >>> aircraft = ("Airbus""A320-200", (100220))  
  45. >>> aircraft[SEATING][MAXIMUM]  
  46. 220 
  47. #在赋值操作的右边是序列,左边是元组的情况下,我们称右边被拆分。序列拆分可用于交换值:  
  48. a, b = (b, a)  
  49.  
  50. >>> import math  
  51. >>> for x, y in ((-34), (512), (28, -45)):      #将其中的每个二元组拆分为x, y  
  52.     print(math.hypot(x, y))  
  53.  
  54. 5.0 
  55. 13.0 
  56. 53.0 
  57.  
  58. #命名的元组  
  59. #命名的元组与普通元组一样,有相同的表现特征,  
  60. #其添加的功能就是可以根据名称引用元组中的项,  
  61. #就像根据索引位置一样,这一功能使我们可以创建数据项的聚集。  
  62.  
  63. #collections模块提供了namedtuple()函数,  
  64. #该函数用于创建自定义的元组数据类型,例如:  
  65. import collections  
  66. Sale = collections.namedtuple("Sale",  
  67.                   "productid customerid date quantity price")  
  68. # collections.namedtuple()的第一个参数是想要自定义元组数据类型的名称,  
  69. #第二个参数是一个字符串,其中包含使用空格分隔的名称,  
  70. #每个名称代表该元组数据类型的第一项。  
  71. #第一个参数以及第二个参数中空格分隔开的名称必须都是有效的Python字符串。  
  72. #该函数返回一个自定义的类(数据类型),可用于创建命名的元组。  
  73. #因此,这一情况下,我们将Sale与任何其他Python类(比如元组)一样看都看待,  
  74. #并创建类型为Sale的对象,如:  
  75. sales = []  
  76. sales.append(Sale(432921"2008-09-14"37.99))  
  77. sales.append(Sale(419874"2008-09=15"118.49))  
  78. #这里创建了包含两个Sale项的列表,也就是包含两个自定义元组。  
  79. #我们可以使用索引位置来引用元组中的项。  
  80. #如,第一个销售项的价格为sales[0][-1](也就是7.99)   
  81. #但我们也可以使用名称进行引用,并且这样会更加清晰:  
  82. total = 0 
  83. for sale in sales:  
  84.     total += sale.quantity * sale.price  
  85. print("Total ${0:.2f}".format(total))               #Total $42.46