Python 进阶之路 (三) Tuple元组使用指南

比List更安全的数据类型

你们好,今天为你们介绍一种更为安全的Python内置数据类型:tuple(元组),以及它的基础用法python

元组是什么

元组(tuple)是另外一种有序的数据类型,与list比较相似。主要不一样的一点是tuple被建立后就不能对其进行修改。因此,tuple与list不一样,没有append(),pop(),insert()这些方法可使用。获取元素的方法和list是同样的,能够经过索引来访问(也是从0开始的),只不过不能赋值成为其余的元素。安全

由于 tuple不可变,因此代码更安全。若是能够的话,咱们尽可能使用tuple代替list。app

建立元组
# 定义一个空的tuple
t = ()
print(t)
Out:()

只有1个元素的元组在进行定义的时候,须要加一个逗号 , 来消除歧义,不然定义的就不是一个元组而是元素自己spa

t1 = (5)
t2 = (5, )
print(t1)
print(t2)

Out: 5
    (5,)
tup4 = (1, 2, 3, 4, 5 );          # 建立时直接赋值
tup5 = "a", "b", "c", "d";        # 建立时直接赋值
print(tup4)
print(tup5)

Out:(1, 2, 3, 4, 5)
     ('a', 'b', 'c', 'd')

一旦建立完,好比tup4 和 tup5 这两个tuple不能变了,它也没有append(),insert()这样的方法。其余获取元素的方法和List是同样的,咱们能够正常地使用tup4[0],tup5[-1],但不能赋值成另外的元素code

访问元组

访问元组和List基本同样,咱们能够用切片很容易的查看元组中的元素,这里很少说,看个小栗子:对象

tup4 = (1, 2, 3, 4, 5 );
tup5 = "a", "b", "c", "d";
print(tup4[0])
print(tup5[1:3])
print(tup5[::-1])
print(sorted(tup5,reverse=True))   # 使用sorted结果变成了List

Out: 1
    ('b', 'c')
    ('d', 'c', 'b', 'a')
    ['d', 'c', 'b', 'a']
理解元组的不可变

上面已经说过了,元组是不可变的,让咱们来看下面这个小栗子:blog

test=('a','b',[1,2,3])
    print(test)
    test[2][0]=100
    print(test)

Out: ('a', 'b', [1, 2, 3])
     ('a', 'b', [100, 2, 3])

不知道有没有朋友会有疑问? 你不是说元组不能变嘛,这里怎么回事,test元组的第三个元素是List,这里咱们修改了List的值结果不是变了吗?排序

这里要给你们说明一下,tuple不可变指的是指向不变,也就是说test[2]永远指向List[1,2,3],这里是由于List可变,因此咱们才能修改成[100,2,3],可是改变先后test[2]的指向没有发生任何变化,若是咱们想要直接改变test[2]的值,就会发现以下错误索引

test[2]=[100,2,3]
Out: TypeError: 'tuple' object does not support item assignment

理解了“指向不变”后,若是咱们须要建立一个内容也不变的tuple怎么作?那就必须保证tuple的每个元素自己也不能变。ip

元组的链接

如前面所说,元组是不可改的,可是能够链接,咱们可使用 + 对元组进行链接:

t1 = (2,3,5)
t2 = ('ricequant','python')
t3 = t1 + t2
print(t3)
Out:(2, 3, 5, 'ricequant', 'python')
元组的删除

元组中的元素不能被删除,可是咱们可使用 del 删除整个元组,删除后能够从新定义,很是简单,很少说啦

person = ('xiaobai',18,'paris')
print(person)
del person
print(person)

Out: ('xiaobai', 18, 'paris')
     NameError: name 'person' is not defined
元组的解包
这里是比较有意思的地方,假设咱们有一个元组t以下:
t = ('foo', 'bar', 'baz', 'qux')

当咱们建立 t 时,实际上就是一个打包,过程展现以下图:

clipboard.png

那若是是解包呢? 换过来就好了呀

t = ('foo', 'bar', 'baz', 'qux')
(s1, s2, s3, s4) = t
print(s1,s2,s3,s4)

Out:foo bar baz qux

当咱们执行(s1, s2, s3, s4) = t的时候,实际发生的状况以下:

clipboard.png

这里注意一点,若是咱们尝试解包一个元祖是传递的变量和元组实际元素数量不相符时会产生错误:

(s1, s2, s3) = t
ValueError: too many values to unpack (expected 3)

(s1, s2, s3, s4, s5) = t
ValueError: not enough values to unpack (expected 5, got 4)
元组的互换swap

其实Python里面还有一种很是简单的建立元组的方法,那就是逗号,咱们若是用逗号分隔一些元素,会自动生成一个元组:

a = 'foo'
b = 'bar'
x= a, b
print(x)

Out:('foo', 'bar')

若是作一个简单的互换很容易,只要这样就能够了:

x= b,a
print(x)
Out:('bar', 'foo')
元组的经常使用方法汇总
  • tup.index(x, [start, [stop]])) 返回元组中start到stop索引中第一个值为 x的元素在整个列表中的索引。若是没有匹配的元素就会返回一个错误。
  • tup.count(x) 返回 x 在元组中出现的次数。
  • cmp(tuple1, tuple2) 比较元组中两个元素。
  • len(tuple) 计算元组元素个数。
  • max(tuple) 返回元组中元素最大值。
  • min(tuple) 返回元组中元素最小值。
  • tuple(seq) 将列表转换为元组。
  • 元组不提供字符串、列表和字典中的方法。若是相对元组排序,一般先得将它转换为列表并使其成为一个可变对象,才能得到使用排序方法,或使用sorted内置方法。

总结

今天为你们讲解了我知道的有关tuple的一切,也为你们展现了一些常规操做,但愿可以帮助到你们,立刻就要到初五了,迎财神,吃饺子!!! 但愿你们在2019大吉大利,大发横财!!

相关文章
相关标签/搜索