元组在某些意义上可以简单理解为“不可变的列表”,但是实际上,元组还有比这个说法本身更高级的用法:作为没有字段名的记录,并因此具有拆包之类的进阶用法;
元组与记录
在说这一部分之前,请大家构思一下我们如何传输一条微博(的详细内容),最直观的方法就是:
发送时间:18/10/20;发送者:某菜鸡;内容:这是一条微博;
每一个微博的要素和它“是什么”构成了一个映射关系,并且在数据储存的时候把这个关系标出来,但是我们储存大量微博信息的时候就会发现,我们的储存器搞成了这个样子:
发送时间:18/10/20;发送者:某菜鸡;内容:这是一条微博;
发送时间:18/10/20;发送者:某菜鸡;内容:这又是一条微博;
发送时间:18/10/20;发送者:某菜鸡;内容:这还是一条微博;
我们可以看到,在大量储存的时候,“发送时间”这四个字是被大量重复的,“发送者”和“内容”这几个字也相似,所以我们就可以想办法改进一下这种记录方式,比方说——把微博的要素(每个字段)和它的位置建立联系:
"18/10/20","某菜鸡","这是一条微博","18/10/20","某菜鸡","这又是一条微博","18/10/20","某菜鸡","这还是一条微博"
这样,即使是计算机也能通过位置来判断字段究竟“是什么”,很简单,索引号能被三整除的就是微博内容嘛哈哈哈哈哈哈;
这样的映射比较优秀,但是又面临着这样一个问题,就是列表的可变性,不仅是单个元素可变,元素的顺序也可变,甚至只需要一行代码就可以给整个列表大排序,所以元组,作为元素和顺序都不可变的一种卧槽类型,就天然成为了储存这种记录的最佳形式。
但是读者可能要问,元组既然不可变,在用的时候会不会有不够灵活的问题呢,毕竟就像微博记录那样的数据,肯定是经常变动的,别忘了,元组也可以作为列表的元素出现嘛:
List_Weibo = [('2018/10/20','某菜鸡','这是一条微博'),
('2018/10/20','某菜鸡','这又是一条微博'),
('2018/10/20','某菜鸡','这还是一条微博')]
Tuple_Weibo = ('2018/10/21','某菜鸡','又发了一条微博')
List_Weibo.append(Tuple_Weibo)
for _ , _ , Content in List_Weibo :
print(Content)
#结果如下:
这是一条微博
这又是一条微博
这还是一条微博
又发了一条微博
我们不妨就把这种列表和元组的组合叫做“微博记录法”,很显然,可以用for循环提取这样的记录法的元素的元素,这样的操作就叫作元组的拆包(unpaking),其中的两个_
用来代表暂时不用的字段,称为占位符;
当然,拆包本身与迭代一样,只是一种程序设计的思路而并不专指某种操作方法,只要提取到一个序列的某些元素,即使是List[1]
这样的索引访问,在广义上都属于“拆包”的范围,所以我们今后还会经常看到这个概念,总之,放轻松。
多说两句:
推荐一本书噻:
《计算的本质——深入剖析程序与计算机》
by Stuart
脱离了语言(当然示例代码是用Ruby写的),更深入的了解那些比语法和算法还要重要的东西;
网友评论