美文网首页
2018-10-20 021 元组进阶 A

2018-10-20 021 元组进阶 A

作者: 杜若飞er | 来源:发表于2018-10-20 20:50 被阅读4次

    元组在某些意义上可以简单理解为“不可变的列表”,但是实际上,元组还有比这个说法本身更高级的用法:作为没有字段名的记录,并因此具有拆包之类的进阶用法;

    元组与记录

    在说这一部分之前,请大家构思一下我们如何传输一条微博(的详细内容),最直观的方法就是:

    发送时间: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写的),更深入的了解那些比语法和算法还要重要的东西;

    相关文章

      网友评论

          本文标题:2018-10-20 021 元组进阶 A

          本文链接:https://www.haomeiwen.com/subject/kpnmzftx.html