python的元祖类型_python元组类型

元组类型简介

使用括号包围的数据结构是元组(tuple)。例如:

>>> (1,2,3)

(1, 2, 3)

>>> T = (1,2,3,)

>>> T

(1, 2, 3)

元组和列表一样,都是容器型的数据结构,且都是序列,所以容器中的元素都是按照索引位置有序存放的。所以,可以进行索引取值、切片等序列通用操作。

不同的是,元组是不可变序列,无法原处修改,意味着修改元组必须创建新的元组对象。实际上元组的概念来源于数学,在关系型数据库中用来表示一行数据对象,而行数据对象是固定不变的完整、稳定结构,python的元组也一样隐含的是完整性、稳定性。

不可变序列同样意味着可以使用hash()内置函数进行hash,也就是说它是hashable的。

hashable的类型是稳定的数据,可以放在一些需要稳定结构的地方,比如Set、dict的key,它们内部都是通过hash后的数据存放的。hashable意味着不同对象的hash值不同。比如类的实例对象全都是不同的,之所以不同是因为它们默认就是hashable的,不同对象的hash值不同。

元组的结构

元组可以看作是不可变的列表。它们的结构非常类似,都是在容器中存放元素的引用地址。

它的结构图如下:

这个结构图什么意思,这里不再赘述,如有需要,参考我对列表的介绍文章。

因为元组是不可变对象,所以修改元组数据会报错。也就是说,元组中的保存的引用地址是不可变的。

>>> T = (1111,2222,3333,4444)

>>> T[0] = 11111

Traceback (most recent call last):

File "", line 1, in

TypeError: 'tuple' object does not support item assignment

构造元组

直接使用括号包围元素即可,或者使用元组的构造函数tuple()将数据转换成元组。例如:

>>> (1,2,3,4)

(1, 2, 3, 4)

>>> tuple("abcdef")

('a', 'b', 'c', 'd', 'e', 'f')

>>> tuple([1,2,3,4])

(1, 2, 3, 4)

括号中可以加一个尾随逗号:

>>> 1

1

需要注意的是,python中很多地方隐式地自动构造元组。它的隐式构造规则是这样的:如果没有指定括号,又有多个值,那么就使用元组作为容器。

>>> 1,2

(1, 2)

再者,为了区分没有括号的元组和单个数据对象,可以在想要作为元组元素的数据后面加上逗号。例如:

>>> 1, # 元组

(1,)

>>> (1,) # 元组

(1,)

>>> 1 # 单个数据

1

>>> (1) # 单个数据

1

元组中可以嵌套任意类型的数据对象:

>>> (1,2,(3,4))

(1, 2, (3, 4))

>>> (1,2,[3,4])

(1, 2, [3, 4])

操作元组

元组是不可变的序列。序列意味着它的元素是按索引位置有序的,序列的通用操作元组都可以使用,不可变序列意味着那些序列的修改行为都不能用,但是却可以使用hash()内置函数对元组进行hash。

关于序列有哪些通用操作,哪些是不可变序列具有的操作,哪些是可变序列具有的操作,详细内容参见:Python中的序列操作。

这里简单介绍一点基本操作。

元组支持+ *符号操作:

>>> T = (1,2,3,4)

>>> T1 = ('a','b','c')

>>> T + T1

(1, 2, 3, 4, 'a', 'b', 'c')

>>> (1,2) + tuple("34")

(1, 2, '3', '4')

>>> T * 2

(1, 2, 3, 4, 1, 2, 3, 4)

>>> 2 * T

(1, 2, 3, 4, 1, 2, 3, 4)

可以通过+=的方式进行二元赋值:

>>> T1 = (1,2,3)

>>> T2 = (4,5,6)

>>> T1 += T2

>>> T1

(1, 2, 3, 4, 5, 6)

元组是序列,序列类型的每个元素都是按索引位置进行存放的,所以可以通过索引的方式取得元组中的各个元素,通过切片的方式取得子元组:

>>> T = (1,2,3,4,5)

>>> T[0]

1

>>> T[:3]

(1, 2, 3)

>>> T[:]

(1, 2, 3, 4, 5)

>>> T[2:-1]

(3, 4)

但不能赋值,因为元组是不可变对象。

>>> T = (1,2,3,4)

>>> T[0] = 11

Traceback (most recent call last):

File "", line 1, in

TypeError: 'tuple' object does not support item assignment

因为元组是不可变对象,所以可以使用hash()进行hash:

>>> hash(T)

-1883319094

>>> hash((1,2,3))

-378539185

>>> hash([1,2,3])

Traceback (most recent call last):

File "", line 1, in

TypeError: unhashable type: 'list'

修改元组

因为元组是不可变对象,所以没有直接方法修改元组,只能通过其它手段根据原始元组间接地构造新元组。切片返回的元组也是一种修改方式。

另外,要修改元组,可以考虑将元组转换成可变的列表,修改之后再转换回元组。例如:

>>> t = ('a','b','c','d')

>>> tmp = list(t)

>>> tmp[2] = "cc"

>>> t = tuple(tmp)

>>> t

('a', 'b', 'cc', 'd')

或者,通过解析的方式构造新元组,但元组解析必须注意的是元组的括号特殊性,因为它会被当作表达式的包围括号,而不是元组的构造括号。所以,只能使用tuple()包围解析表达式。

>>> T = (1,2,3,4,5)

>>> tuple( i * 2 for i in T)

(2, 4, 6, 8, 10)

>>> ( i * 2 for i in T) # 不是元组,而是表达式括号

at 0x03572150>

Python元组类型、字典类型及常用操作

一.元组类型 1.用途 记录多个值,当多个值没有改的需求,此时用元组更合适,Python的元组与列表类似,不同之处在于元组的元素不能修改. 2.定义方式 在()内用逗号分隔开多个任意类型的值 t=(1 ...

python元组类型的变量以及字符串类型的变量作为参数进行传值

今天做selenium元素对象剥离时(我把元素对象都放到了元组类型的变量中,格式:user = (“id”,“X-Auto-2”)),遇到一个元组变量,以及str字符串变量一起作为参数传值的问题,发现 ...

Python变量类型(l整型,长整形,浮点型,复数,列表,元组,字典)学习

#coding=utf-8 __author__ = 'Administrator' #Python变量类型 #Python数字,python支持四种不同的数据类型 int整型 long长整型 flo ...

Python编程Day6——元组类型、字典类型、集合

一.元组类型(tuple) 1.用途:记录多个值,当多个值没有改变的需求此时元组更为合适 2.定义:在()内用逗号分隔开多个任意类型的值(参数为for可以循环的对象) 3.常用操作: 索引(正取向+反 ...

Python全栈之路----数据类型—元组类型

元组类型:有序,不可变的,又叫只读列表  names = ("alex","jack","eric") 1.元组本身不可变,但如果元组中有可 ...

python——元组和字典类型简明理解

元组类型: 元祖创建: 不需要括号可以但是一个元素就当成了字符串类型了 >>> tup1="a"; >>> type(tup1)

Python 变量类型

Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据 ...

python字符类型的一些方法

python 字符串和字节互转换.bytes(s, encoding = "utf8") str(b, encoding = "utf-8") i.isspac ...

python 元组操作

关于元组的常用操作,请参考:http://www.runoob.com/python/python-tuples.html 元组的元素不可修改 ,元组的元素的元素可修改 count(self,valu ...

随机推荐

Linux主机上使用交叉编译移植u-boot到树莓派

0环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS: Debian Jes ...

Ubuntu里面软件的安装与卸载

在Ubuntu里面,有时候碰到软件配置错了,这是重新再安装的话,会检测到已安装,系统不会再重新安装,就需要卸载之后重装 1.通过deb包安装的情况: 安装.deb包: 代码:sudo dpkg -i ...

Unity Sprite切割导出

这次需要将美术提供的Sprite图集切割导出,整体思路依然和上次的Sprite转prefab一致,只是在转prefab的逻辑修改为了创建Texture的逻辑. 过程很简单,直接看最终代码结果: usi ...

C#中Linq查询基本操作

摘要:本文介绍Linq查询基本操作(查询关键字) - from 子句 - where 子句 - select子句 - group 子句 - into 子句 - orderby 子句 - join 子句 ...

2015年最新中国知网CNKI免费账号直接入口

以下是Free9免费资源网小编收集整理的2015年最新中国知网CNKI免费账号直接入口,现免费分享给大家(仅供测试使用),此类文献数据库资源有时效性,希望对您的学习.工作上有所帮助! 中国知网直接入口 ...

NHibernate各种查询

NHibernate各种查询 NHibernate's methods of querying are powerful, but there's a learning curve. Longer t ...

Asp.Net分页存储过程

SQL分页语句 一.比较万能的分页: sql代码: 1 2 3 select top 每页显示的记录数 * from topic where id not in  (select top (当前的 ...

pygame系列_小球完全弹性碰撞游戏

之前做了一个基于python的tkinter的小球完全碰撞游戏: 今天利用业余时间,写了一个功能要强大一些的小球完全碰撞游戏: 游戏名称: 小球完全弹性碰撞游戏规则: 1.游戏初始化的时候,有5个不同 ...

WebApi实现原理解析笔记

这是我看过WebApi实现代码后的一些总结,一方面加深自己的记忆,另外也希望能够帮助大家更深入的了解WebApi. 注:暂时没有好好的整理,可能有些晦涩难懂. Webapi 控制器类必须实现IHttp ...

Jupyter-notebook 导出时不显示Input[]代码

参考: https://stackoverflow.com/questions/34818723/export-notebook-to-pdf-without-code    1. 第一个方式是直接在 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值