元组(Tuple) | 不可改变的 Python 数据类型

前言

文章首发于微信公众号:可乐python说

Hi,大家好,我是可乐,到目前为止,我们已介绍了 字符串列表字典 的相关知识, 今天介绍一下 Python 元组 的相关知识,并附上相应的案例代码,便于学习、吸收。

元组简介

元组 (Tuple) 是 Python 中基本数据结构之一,与列表类似,但元组中的元素不允许被修改,因此元组也被称作只读列表

元组使用小括号- () 包裹,元素之间使用逗号- 分隔,元组中的元素可以是字符串、数字、列表、元组等其他数据类型。

元组不支持修改,但支持索引、拼接、成员检查、重复等相关操作,下面我们通过案例来学习。

初识元组

1、使用小括号定义一个空元组。

>>> def_tuple = ()
>>> def_tuple
()
# type 查看数据类型
>>> type(def_tuple)
<class 'tuple'>

2、使用 tuple() 方法定义一个空元组。

>>> def_tuple = tuple()
>>> def_tuple
()
# type 查看数据类型
>>> type(def_tuple)  
<class 'tuple'>

3、使用索引获取元组元素。

>>> def_tuple = ("kele", "tea")
>>> def_tuple[0]
'kele'

4、元组也可嵌套。

>>> def_tuple = ("kele", ("xuebi", "tea"))
>>> def_tuple[1]
("xuebi", "tea")
# 怎么取嵌套元组中的元素?
>>> def_tuple[1][0]
'xuebi'

5、元组特性之元素不允许被修改,但其元素的元素为可变类型时则支持修改。

>>> def_tuple = ("kele", "tea")
>>> def_dict[0] = "xuebi"
# 试图修改元组中的元素会报错
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
# 元组第二个元素是一个列表,可直接通过索引修改
>>> def_tuple = ("kele", ["tea", "kele"])
>>> def_tuple[1][1] = "xuebi"
>>> def_tuple
('kele', ['tea', 'xuebi'])

6、元组特性之元素不能被删除,但可删除整个元组

>>> def_tuple = ("kele", "tea")
>>> del def_tuple[0]
# 试图删除元组中的元素会报错
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: 'tuple' object doesn't support item deletion
# 使用 del 删除整个元组
>>> del def_tuple

7、元组特性之任何无符号的对象,以逗号分割,默认被视为元组

>>> any_unsigned_objects = "kele", "age", 18 
>>> any_unsigned_objects
('kele', 'age', 18)
>>> type(any_unsigned_objects)
<class 'tuple'>

元组基本操作符

操作符 说明
+ 连接元组元素
* 重复元组元素
in / not in 成员判断
[index:index] 元组切片

1、使用 + 连接元组元素。

>>> def_tuple1 = ("kele", "tea")
>>> def_tuple2 = ("xuebi", "coffee")
>>> def_tuple1 +  def_tuple2
('kele', 'tea', 'xuebi', 'coffee')

2、使用 * 重复元组元素。

>>> def_tuple = ("kele", "tea")
>>> def_tuple * 2
('kele', 'tea', 'kele', 'tea')

3、使用 innot in 判断元素是否在元组中,是则返回 True , 否则返回 False

>>> def_tuple = ("kele", "python")
>>> "kele" in def_tuple
True
>>> "python" not in def_tuple
False

4、使用 [:] 对元组进行切片,遵循左闭右开原则。

>>> def_tuple = ("Hi", "my", "name", "is", "kele")
# 截取第一至第三个元素(不包括第三个元素)
>>> def_tuple[0:2]    
("Hi", "my")
# 超出索引值并不会报错
>>> def_tuple[0:10]    
('Hi', 'my', 'name', 'is', 'kele')
# 全元组截取(复制元组)
>>> def_tuple[:]    
('Hi', 'my', 'name', 'is', 'kele')
# 指定步长,截取列表
# 步长为 2 ,表示每两个元素取一个元素
>>> def_tuple[0:5:2]    
('Hi', 'name', 'kele')
# 怎么反转元组?
>>> def_tuple[::-1] 
('kele', 'is', 'name', 'my', 'Hi')

元组基础方法

元组基础方法可参照下表:

方法 说明
len(tuple) 计算元组元素数量
max(tuple) 返回元组中最大的元素
min(tuple) 返回元组中最小的元素
type(tuple) 查看数据类型
tuple(iterable) 将可迭代对象转换为元组

1、使用 len 方法计算元组数量。

>>> def_tuple = ("kele", "python")
>>> len(def_tuple)
2

2、使用 max 方法,返回元组中最大的元素。

>>> def_tuple = (18, 8, 168)
>>> max(def_tuple)
168

3、使用 min 方法,返回元组中最小的元素。

>>> def_tuple = (18, 8, 168)
>>> min(def_tuple)
8

4、使用 type 方法查看数据类型。

>>> def_tuple = ("kele", "python")
>>> type(def_tuple)
<class 'tuple'>

5、使用 tuple 方法将可迭代对象转换为元组。

>>> def_list = ["kele", "python"]
>>> tuple(def_list)
('kele', 'python')
>>> type(tuple(def_list))
<class 'tuple'>

元组内置方法

Python 中的 tuple 类提供了元组操作相关的内置方法,由于元组仅有两个内置方法,这里再选择类中的部分 魔法方法 进行演示,下面按照类中方法定义的顺序演示。

1、使用 index 返回某一元素在元组中第一次出现的索引值。

# 使用语法:dict.index(obj)
>>> def_tuple = ("Hi", "kele", "python", "kele")
>>> def_dict.index("kele")
1

2、使用 count 方法统计某一元素在元组中出现的次数。

# 使用语法:dict.count(obj)
>>> def_tuple = ("Hi", "kele", "python", "kele")
>>> def_tuple.count("kele")
2
>>> def_tuple.count("xuebi")
0

3、使用 __add__ 方法在元组后面追加新的元组,与 + 类似。

# 使用语法:dict.__add__(tuple)
>>> def_tuple = ("Hi", "kele")
>>> def_tuple2 = ("python", "say")
>>> def_tuple.__add__(def_tuple2)
('Hi', 'kele', 'python', 'say')

4、使用 __contains__ 方法判断某一元素是否包含在元组中,是则返回 True , 否则返回 False ,与 innot in 类似。

# 使用语法:dict.__contains__(obj)
>>> def_tuple = ("Hi", "kele")
>>> def_tuple.__contains__("kele")
True
>>> def_tuple.__contains__("xuebi")
False

5、使用 __mul__ 方法重复元组元素,与 * 类似。

# 使用语法:dict.__mul__(num)
>>> def_tuple = ("Hi", "kele")
>>> def_tuple.__mul__(2)
('Hi', 'kele', 'Hi', 'kele')
>>> def_tuple.__contains__("xuebi")
False

元组扩展

1、使用 sorted 函数对元组进行排序。

>>> def_tuple = ("2c", "3a", "1b")
# 直接调用
# 返回排序后元素组成的列表
>>> sorted(def_tuple)
['1b', '2c', '3a']
# 使用匿名函数 lambda 按照元素的第一个字符排序
>>> sorted(def_tuple, key=lambda x:x[0])
['1b', '2c', '3a']
# 使用匿名函数 lambda 按照元素的第二个字符排序
>>> sorted(def_tuple, key=lambda x:x[1])
['3a', '1b', '2c']
# 原元组并不会改变
>>> def_tuple
('2c', '3a', '1b')

2、使用 sorted 函数对元组进行多规则的排序。

>>> def_tuple = ("2c", "3a", "1b", "3d")
# 先按第一个字符排序,若相同,再按第二个字符排序
>>> sorted(def_tuple,key=lambda x:(x[0], x[1]))
['1b', '2c', '3a', '3d']

总结

  1. Python 中的元组与列表类似, 索引、切片等用法基本相同,但也存在一定差异,其不允许修改的特性,经常被用于定义、保存一些特定的数据。

  2. 定义元组可直接使用小括号- (), 也可选择 tuple() 方法,在定义单元素元组时需要在末尾加上 , ,否则会引起误会。

    # 习惯用法尝试
    >>> def_tuple = ("kele")
    >>> type(def_tuple)
    # 居然不是元组,是字符串类型
    <class 'str'>
    >>> def_tuple = (1)
    >>> type(def_tuple)
    # 居然不是元组,是数字类型
    <class 'int'>
    # 正确用法
    >>> def_tuple = ("kele", )
    >>> type(def_tuple)
    <class 'tuple'>
    >>> def_tuple = (1, )
    >>> type(def_tuple)
    <class 'tuple'>
    
  3. 元组虽然不允许修改,但当其元素的子元素包含可变类型时,也是允许修改的,当然,也可通过连接、重复组成新的元组。

  4. 元组仅有两个内置方法, tuple 类中的其他魔法方法,大家可逐个进行尝试,对于效果一样的方法,使用时可自行选择。

  5. 文中难免会出现一些描述不当之处(尽管我已反复检查多次),欢迎在留言区指正,也可分享元组相关的知识。

  6. 原创文章已全部更新至 Github:https://github.com/kelepython/kelepython

  7. 本文永久博客地址:https://kelepython.readthedocs.io/zh/latest/c01/c01_06.html

  8. 为了便于沟通交流,我已创建微信学习交流群,欢迎在后台回复 加群 加入我们。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343