引出

在使用Python过程中,列表、集合和字典是比较常用的数据结构。

  • 列表简单说就是数组,不对,它就是数组

  • 集合就是去重的元素结构,和JAVA中的set一样

  • 字典就是一个key-value的键值对,和JAVA中的HashTable一样

但是,Python中有一个特立独行的对象,元组tuple,看一个元组的简单使用:

tu = (2, 3)
a = tu[0] # a=2
b = tu[1] # b=3

什么?你告诉我这个一个新的结构?不是数组???

这用起来跟数组也没什么区别啊?

要看元组和数组的区别,最直观的比较,就是比较两个结构的方法,通过方法来理解结果。

方法比较

列表用的比较多了,方法基本上都是常规的数组操作:对数组的增删改查。对了,还有Python列表最屌的操作,数组的切片操作。

(悄悄告诉你,查看方法只要Python运行 help(list), 就可以了)

再看一下元组的方法,暴露出来的方法只有两个,countindex

  • count(x): 统计x在元组中的个数

  • index(x): 返回x在元组中第一次出现的索引

恩,我知道区别了,元组只能查,不能做增删改的操作。

只能查询,不可修改,这不是常量么。。。。既然是常量,想必虚拟机内部会做优化,元组占用的空间会比列表少很多吧。

内存比较

分别定义列表和元组,查看其内存占用情况:

from sys import getsizeof
​
if __name__ == '__main__':tu = (x for x in range(20000))li = [x for x in range(20000)]print(getsizeof(tu))print(getsizeof(li))

输出结果:

啥?元组这么小么?我两万个数字才占用88个字节?我不服,再怎么优化这也不可能,它不是元组:

if __name__ == '__main__':tu = (x for x in range(20000))li = [x for x in range(20000)]print(type(tu))print(type(li))

哦哦,不好意思啊,走错片场了,这是个生成器。重新来过:

from sys import getsizeof
​
if __name__ == '__main__':tu = tuple(x for x in range(20000))li = list(x for x in range(20000))print(type(tu))print(getsizeof(tu))print(type(li))print(getsizeof(li))

这回没毛病了,元组确实比列表占用空间要少一些。

至此,基本已经确定了,元组最大的特性就是不可变。

通过元组的不可变特性,引申出了很多数组无法实现的功能

这里,看到网上有人说元组中的数组是可变的,也给出了对应的解释。简单说,元组中保存的是数组的地址,尽管数组内容变了,但地址没有变,也就是元组内容没有发生变化,很好理解。

元组的灵活使用

  1. 元组是可以计算hash值的,这也就意味元组可以当做hashTable中的key存在

if __name__ == '__main__':tu = tuple(x for x in range(20000))li = list(x for x in range(20000))print(hash(tu))print(hash(li))

有人说,字符串就足够了,没必要用元组。恩?我想到一个应用场景:

如果要通过用户的信息(身高,体重,性别)来查找用户的id,我们固然可以遍历一遍用户,将符合条件的筛选出来。但这样太慢了,如果我们维护一个用户信息为key,值为id数组的hashMap,那查找就十份快速了。

当然,使用字符串也完全可以满足,将用户的各种信息拼接起来,但使用元组显然更加直观,key直接就是(身高,体重,性别)。

  1. 这个虽然和元组的不可变没什么关联,但同样十分实用。实现函数返回多个值。

def test_fun():return 2, 3
​
if __name__ == '__main__':a, b = test_fun()# 用*来接受剩余的内容d, *other = test_fun()re = test_fun()print(a, b)print(re)print(type(re))

妈妈再也不用担心我的函数返回了。

站在巨人的肩膀上

通过先人的成果来理解列表和元组,下面以numpy为例,通过作者对二者的理解来帮助我理解。

import numpy
​
if __name__ == '__main__':# 创建一个二维数组a = numpy.arange(9).reshape(3, 3)print(a)tu = (1, 2)li = [1, 2]print(a[tu])print(a[li])

显然,使用元组访问时,它接收到的意图是:我想要下标为1的数组中下标为2的元素。而使用数组访问时,它收到的意图是:请把下标为1和下标为2的元素给我。在此,意会一下。

Python元组是什么相关推荐

  1. python元组(tuple)使用示例+常用方法+列表(list)和元组(tuple)的异同?

    python元组(tuple)使用示例+常用方法+列表(list)和元组(tuple)的异同? 元组(tuple) # 元组类似列表,元组里面的元素也是进行索引计算. # 列表里面的元素的值可以修改, ...

  2. python 元组传参 *args 字典传参 **kwargs 的用法

    python 元组传参 *args 字典传参 **kwargs 的用法 # 元组参数 def func_arg(*args):print("args:", args) func_a ...

  3. 熟练掌握python是什么概念-想要熟练掌握Python元组?你需要了解这10件应知事项...

    本文转载自公众号"读芯术"(ID:AI_Discovery) 人生苦短,Python是岸. 作为一种通用编程语言,Python已成为各学术和工业领域中最流行的语言之一. 此前,IE ...

  4. Python元组与字典详解

    Python 元组 Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 如下实例: tup ...

  5. Lesson 016 —— python 元组

    Lesson 016 -- python 元组 Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔 ...

  6. python 元组使用_Python3

    Python3 元组 Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号 ( ),列表使用方括号 [ ]. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. ...

  7. python元组类型_什么是python元组数据类型

    什么是python元组数据类型 发布时间:2020-08-25 11:46:29 来源:亿速云 阅读:68 这篇文章运用简单易懂的例子给大家介绍什么是python元组数据类型,代码非常详细,感兴趣的小 ...

  8. python元组的创建取值排序计数_Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】...

    本文实例讲述了Python元组 tuple的概念与基本操作.分享给大家供大家参考,具体如下: 元组 tuple 元组 tuple的定义 元组的创建 元组的元素访问和计数 1. 元组的元素不能修改 2. ...

  9. Python元组tuple(不可变)

    Python元组Tuple(不可变): 元组的特点: 1.元组的初始化: tuple = (1, )  #元组只有一个元素的话,初始化时要加,否则当做元素的普通变量类型处理 tuple = (1, 2 ...

  10. python 元组和列表区别_Python干货整理:一分钟了解元组与列表使用与区别

    元组是 Python 对象的集合,跟列表十分相似.下面进行简单的对比. 列表与元组 1.python中的列表list是变量,而元组tuple是常量. 列表:是使用方括号[],元组:则是使用圆括号() ...

最新文章

  1. 十年沉浮,用Python看创业公司消亡史
  2. c++ lambda函数_C++ Lambda表达式
  3. case分支 shell函数 字符串的处理
  4. 全链路灰度这样做,新需求迭代上线也能放心干饭
  5. java-多线程-一道阿里面试题分析
  6. 【今日CV 计算机视觉论文速览 第115期】Fri, 10 May 2019
  7. 用python给自己DIY一款小说阅读器
  8. 从门户到搜索:谁为百度打工?
  9. 访问虚拟机web应用程序
  10. HR:你为什么选择计算机这个行业?
  11. Android webview网页截取长图
  12. Linux字符设备驱动之LED驱动
  13. Android源码学习------SystemUI(二)
  14. Vue.js中的自定义指令directives
  15. matlab中矩阵重排列,稀疏矩阵重新排序 - MATLAB Simulink Example - MathWorks 中国
  16. canvas水平垂直居中
  17. C-Tech Awards 2016最具价值大奖获奖名单新鲜出炉
  18. java 微信小程序 校园跑腿系统
  19. 2003服务器运行库,微软常用运行库合集包最新版支持XP/2003/7/8/8.1/10(32+64位)
  20. 大话设计模式之爱你一万年:系列文章 - 导读

热门文章

  1. 现代软件工程系列 结对编程 (II) 电梯调度程序
  2. mysql 事物 锁行 测试_MySQL Transaction--RR事务隔离级别下加锁测试
  3. php设置路径别名,react设置文件路径别名的具体方法你知道么
  4. php cookie 加密解密,php实现cookie加密的方法
  5. animate动画案例_animate动画案例——小小购物狂
  6. 鼠标图标怎么自定义_酷鱼魔鼠——给鼠标添加酷炫的特效
  7. 手机浏览器网址_「效率集」自定义网址导航高级功能介绍
  8. 学好Java的八个条件
  9. Java环境的正确配置你会了吗?
  10. python的py文件打包成exe_将python项目.py文件打包成.exe文件