热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python基本数据类型tuple

Tupletuple是一个不可变的有序序列,在某种程度上,元组在索引、嵌套对象和重复方面与列表相似,但元组是不可变的,列表是可变的,tuple一但初始化之后就不能修改。class

Tuple

tuple是一个不可变的有序序列,在某种程度上,元组在索引、嵌套对象和重复方面与列表相似,但元组是不可变的,列表是可变的,tuple一但初始化之后就不能修改。

class tuple([iterable])

tuple接收的参数是一个可迭代对象。

tuple可通过多种方式构建:

tuple_One= () # 空tuple
tuple_two = "a", # 单元素的元组
tuple_there = ("a", "b", "c")# 多个元素的元组
tuple_four = tuple(["a", "b", "c"])# tuple的构建方法
temp = (1, 2, 3, 4, 5, 6, 7)
print(id(temp)) # 2472437218840
tuple_five = tuple(temp) # 如果参数是元组,返回值就是相同的对象
print(id(tuple_five))# 2472437218840

tuple 方法:

  • count(self,value):
    • value:要统计的值
    • 返回值:value 在tuple 出现的次数,没有则返回0
temp = ("peach", "Lemon", "Pear","Lemon", "Pear")
print(temp.count("Lemon"))# 2
print(temp.count("apple"))# 0
  • index(self, value, start=None, stop=None):
    • value:需要查找index的value
    • start:开始位置
    • stop:结束位置
    • return:返回value第一次出现的index, value不存在则,Raises ValueError
temp = ("peach", "Lemon", "Pear","Lemon", "Pear")
print(temp.index("Lemon"))# 1

不可变特性

tuple 一但初始化了,元素的值是不可变的:

temp = ("peach", "Lemon", "Pear", "Lemon", "Pear")
temp[0] = "Banana"

执行后Raises一个TypeError:
TypeError: 'tuple' object does not support item assignment

但是,不可变不是绝对

temp = ("peach", "Lemon", ["cranberry", "raspberry","Mango"],"Pear", "Lemon", "Pear")
temp[2][0] = "Banana"
print(temp)#("peach', 'Lemon', ['Banana', 'raspberry', 'Mango'], 'Pear', 'Lemon', 'Pear")

temp[2][0]的值从“cranberry”变成了“Banana”。
Why?,不是说不可变的嘛?
因为list序列是可变的,且temp[2][0]的值被改变后,temp[2]的指向没变,所以不建议在tuple存放可变序例元素。

temp_list = ["cranberry", "raspberry", "Mango"]
temp = ("peach", "Lemon",temp_list,"Pear", "Lemon", "Pear")
print(id(temp_list)) # 1375508844168
temp[2][0] = "Banana"
print(id(temp[2]))# 1375508844168

Iterable

tuple 是一个可迭代的,所以可以使用for in 语句

temp = ("peach", "Lemon","Pear", "Lemon", "Pear")
for fruit in temp :
     print(fruit)

拆包

tuplu 有一个很重要的特性就是拆包

temp = ("William", 18, "programmer")
name, age, job = temp
print(name,age,job) # William 18 programmer
name, *other  = temp
print(name, other)  # William [18, 'programmer']
def function (name,age,job):
    print(name, age, job)
function(*temp) # "William [18, 'programmer']

tuple与list的不同

性能优化

遍历tuple的速度确实比list快。为什么呢?stackoverflow上有人的解释:
总体可分以下几点:

  • tuple中是不可变的,在CPython中tuple被存储在一块固定连续的内存中,创建tuple的时候只需要一次性分配内存。但是List被的被存储在两块内存中,一块内存固定大小,记录着Python Object(某个list对象)的信息,另一块是不固定大小的内存,用来存储数据。所以,查找时tuple可以快速定位(C中的数组);list必须遍历(C中的链表)。在编译中,由于Tuple是不可变的,python编译器将它存储在它所在的函数或者模块的“常量表”(constants table)中。运行时,只要找到这些预构建的常量元组。但是List是可变的,必须在运行中构建,分配内存。

  • 当Tuple的元素是List的时候,它只存储list的引用,(C中定长数组里一个元素是指向某个链表的指针),定位查找时它还是会比List快。

  • CPython中已经做了相关优化以减少内存分配次数:释放一个List对象的时候,它的内存会被保存在一个自由List中以重复使用。不过非空list的创建时,仍然需要给它分配内存存储数据。

可做dict的key

  • dict的key必须是一个可hash的对象:而list没有实现__hash__()这个魔术方法。
temp_list = []
temp_tuple = tuple()
temp_dict = {}
temp_dict[temp_tuple] = "tuple"
print(temp_dict) # {(): 'tuple'}
temp_dict[temp_list] = "list" # TypeError: unhashable type: 'list'

如果你觉得还不错,那就点个赞吧

听说喜欢留言分享的人
运气都不会差

python笔记侠python笔记侠


推荐阅读
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 本文详细介绍了 GWT 中 PopupPanel 类的 onKeyDownPreview 方法,提供了多个代码示例及应用场景,帮助开发者更好地理解和使用该方法。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • CMake跨平台开发实践
    本文介绍如何使用CMake支持不同平台的代码编译。通过一个简单的示例,我们将展示如何编写CMakeLists.txt以适应Linux和Windows平台,并实现跨平台的函数调用。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
author-avatar
张哥他爹
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有