python元组 (tuple)

在python中,元组是一种与列表非常相似的数据类型,除了append,insert等改变数据内容的方法,列表支持的方法,元组几乎都支持, 它们之间最大的区别在于元组里的元素不能被修改。元组几乎就是列表的翻版,你学会了列表,就可以用操作列表的方法来操作元组。

但显然,事情不会这么简单,从第3小节开始,本篇教程会向你阐明元组存在的意义,这部分内容已经超出了你目前能够理解的知识范围,只作为了解,等到你掌握了足够多的知识以后,可以再回到这里学习。

1. 元组的概念(tuple)

元组和列表非常相似,不同之处在于,元组里的元素不能修改。
元组使用小括号,列表使用中括号

tup1 = (1,2,3,4)
tup2 = (1, )

如果元组里只有一个元素,也必须使用逗号
对于元组的理解,参照列表即可

元组与列表之间可以使用list()和tuple()函数进行转换

lst = [1,2,3]
tup = tuple(lst)
lst2 = list(tup)

2. 元组练习题

写出下面代码的执行结果和最终结果的类型

  1. (1, 2)*2
  2. (1, )*2
  3. (1)*2

答案如下

1. (1, 2, 1, 2)
2. (1, 1)
3. 2

第一题应该没有异议,关键是第2题和第3题,元组里只有一个数据时,必须有逗号,如果没有逗号,就变成了第3题的形式,第3题本质上是1*2,那对小括号就如同我们小学学过的小括号一样,只是为了体现运算优先级而已。

当元组只有一个数据时,如果省略了逗号,那么小括号的作用就不再是表示元组,而是表示运算优先级

3. 为什么python的元组看起来很多余?

乍看起来,元组是一种非常多余的数据类型,因为列表已经足够用了,而元组似乎只是重复了列表的功能,却又要求不能被修改,事情果真是这样么?

当然不是,元组在特定场景下可以实现列表无法实现的效果

3.1 函数返回多个结果时,元组可以作为返回值

def func(x, y):
    return x, y, x+y

res = func(2, 3)
print(res)

当函数有多个返回值时,最终以元组的形式返回,程序输出结果为

(2, 3, 5)

当函数返回多个结果时,以列表的形式返回,难道不也是可行的么?从程序设计的角度看,函数返回多个结果时,以元组形式返回好于以列表形式返回,原因在于列表是可变对象,这意味着函数的返回结果是可修改的,那么函数在使用时就容易出现修改函数返回值的情况。

某些情况下,我们不希望函数的返回值被他人修改,元组恰好满足了我们的要求,如果函数本意就是返回一个列表,那么在renturn时,就应该直接返回列表,而不是返回多个结果。

3.2 元组作为函数的可变参数

def func(*args):
    print(args, type(args))

func(3, 4, 5)

定义一个支持可变参数的函数时,args的类型是元组,在函数内可以从args中依次取出传入的参数,那么同样的问题,为什么不是列表呢?还是从程序设计的角度出发,如果args被设计成列表,由于列表可以被修改,保不齐某个程序员在实现函数的时候修改了args,传入的参数被修改了,或是增加,或是减少,这样就会引发不可预知的错误。

但现在,python将其设计成元组,元组无法修改,你在函数内部无法修改传入的参数,这就保证了函数入参的安全性。

3.3 元组可以作为字典的key,可以存储到集合中

想要成为字典的key,或是存储到集合中,必须满足可hash这个条件,所有的可变对象,诸如列表,集合,字典都不能做key,但元组可以,在一些特定情境下,用元组做key,非常实用,比如下面这个练习题目

题目要求:已知有两个列表

lst1 = [3, 5, 6, 1, 2, 4, 7]
lst2 = [6, 5, 4, 7, 3, 8]

从两个列表里各取出一个数,他们的和如果为10,则记录下来,请写程序计算,这种组合一共有几种,分别是什么,要求组合不能重复。

从lst1中取3, lst2中取7,这对组合满足要求,从lst1中取7,lst2中取3,也满足要求,但是这个组合已经存在了,因此不算。

使用嵌套循环,就可以轻易的完成这个题目,但是这中间过程要去除掉重复的组合,正好可以利用元组,算法实现如下

lst1 = [3, 5, 6, 1, 2, 4, 7]
lst2 = [6, 5, 4, 7, 3, 8]

res_set = set()
for i in lst1:
    for j in lst2:
        if i + j == 10:
            if i > j:
                res_set.add((j, i))
            else:
                res_set.add((i, j))

print(res_set)

程序输出结果

{(3, 7), (4, 6), (5, 5), (2, 8)}

去重的过程恰好利用了元组,将组合以元组的形式存储到集合中,利用集合的不重复性来达到去重的目的,元组里第一个元素是组合中较小的那个数

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案