一、引入
元组是什么?它既能像列表一样容纳不同类型的元素,也拥有字符串不可变的特性,所以元组是退化的列表吗?
列表:[元素1, 元素2, 元素3, ... , 元素n]
元组:(元素1, 元素2, 元素3, ... , 元素n)
但事实上,元组的话可以不带小括号,只要用逗号隔开就行,如下所示:
>>> rhyme = (1, 2, 3, 4, 5, "上山打老虎")
>>> rhyme
(1, 2, 3, 4, 5, '上山打老虎')
>>> rhyme = 1, 2, 3, 4, 5, "上山打老虎"
>>> rhyme
(1, 2, 3, 4, 5, '上山打老虎')
但是
二、元组的方法
跟其他序列类型一样,元组也可以通过下标来获取元素,如下所示:
>>> rhyme[0]
1
>>> rhyme[-1]
'上山打老虎'
元组是不可变的,所以试图修改元组内的元素的行为是不可取的,如下所示:
>>> rhyme[1] = 10
Traceback (most recent call last):
File "<pyshell#169>", line 1, in <module>
rhyme[1] =10
TypeError: 'tuple' object does not support item assignment
元组也支持切片操作,因为切片是将目标对象中的元素以某种特定的组合导出,而非修改对象本身,如下所示:
>>> rhyme[:3]
(1, 2, 3)
>>> rhyme[3:]
(4, 5, '上山打老虎')
>>> rhyme[:]
(1, 2, 3, 4, 5, '上山打老虎')
>>> rhyme[::2]
(1, 3, 5)
>>> rhyme[::-1]
('上山打老虎', 5, 4, 3, 2, 1)
>>>
在前面,我们巧妙地将列表的方法分为“增”、“删”、“改”、“查”,但对于元组来说,就只剩下“查”字可讲了,如下所示:
>>> nums = (3, 1, 9, 8, 3, 5, 3)
>>> nums.count(3)
3
>>> heros = ("蜘蛛侠", "绿巨人", "黑寡妇")
>>> heros.index("黑寡妇")
2
拼接和重复两个运算符对于元组也是同样适用的,如下所示:
>>> s = (1, 2, 3)
>>> t = (4, 5, 6)
>>> s + t
(1, 2, 3, 4, 5, 6)
>>> s * 3
(1, 2, 3, 1, 2, 3, 1, 2, 3)
元组也可以嵌套,嵌套的方式就是直接加个逗号就可以了,逗号是构成元组的基本条件;元组同样支持迭代,对于嵌套的元组当然就要使用嵌套的循环(迭代),如下所示:
>>> w = s , t
>>> w
((1, 2, 3), (4, 5, 6))
>>> for each in s:
print(each)
1
2
3
>>> for i in w:
for each in i:
print(each)
1
2
3
4
5
6
对于元组,我们也可以使用列表推导式来实现转化,但是将方括号改成小括号并不是想当然就变成了元组推导式,事实上,并不存在元组推导式这种东西,而是得到生成器(后续会详细讲解),如下所示:
>>> s = (1, 2, 3, 4, 5)
>>> [each * 2 for each in s]
[2, 4, 6, 8, 10]
>>> (each * 2 for each in s)
<generator object <genexpr> at 0x000001B261941F90>
三、如何生成只有一个元素的元组
如何生成只有一个元素的元组?并不是单单在这个元素外面加个小括号就可以,还得在元素后面加个逗号,如下所示:
>>> x = (520)
>>> x
520
>>> type(x)
<class 'int'>
>>> x = (520,)
>>> x
(520,)
>>> type(x)
<class 'tuple'>
四、元组的打包和解包
生成一个元组,我们有时候也称之为元组的打包, 那么,对应的把它们赋值给对应的变量名的行为我们称之为元组的解包,其实这种行为不仅适用于元组,也适用于任何的序列类型,如列表,如下所示:
>>> t = (123, "FishC", 3.14)
>>> x, y, z = t
>>> x
123
>>> y
'FishC'
>>> z
3.14
>>> t = [123, "FishC", 3.14]
>>> x, y, z = t
>>> x
123
>>> y
'FishC'
>>> z
3.14
>>>
需要注意的是,无论是哪种类型序列的解包,赋值号左边的变量名数量必须等于右侧序列元素的数量 ,否则会报错,如下所示:
>>> a, b, c, d, e = "FishC"
>>> a
'F'
>>> b
'i'
>>> c
's'
>>> d
'h'
>>> e
'C'
>>> a, b, c = "FishC"
Traceback (most recent call last):
File "<pyshell#224>", line 1, in <module>
a, b, c = "FishC"
ValueError: too many values to unpack (expected 3)
除非使用如下小技巧,后续也会讲解:
>>> a, b, *c = "FishC"
>>> a
'F'
>>> b
'i'
>>> c
['s', 'h', 'C']
>>>
我们知道,python有一个引以为傲的技能就是多重赋值 ,其实呢它背后的实现逻辑就是,先通过元组进行打包,再讲元组进行解包,如下所示:
>>> x, y = 10, 20
>>> x
10
>>> y
20
>>> _ = 10, 20
>>> x, y = _
>>> x
10
>>> y
20
>>>
那么,元组真的就固若金汤了吗?那倒未必,虽然元组中的元素是不可变的,但如果元组中的元素是指向一个可变的列表,那么我们依然是可以修改列表里的内容的,如下所示:
>>> s = [1, 2, 3]
>>> t = [4, 5, 6]
>>> w = (s, t)
>>> w
([1, 2, 3], [4, 5, 6])
>>> w[0][0] = 0
>>> w
([0, 2, 3], [4, 5, 6])
>>>
标签:rhyme,元素,FishC,元组,each,所示,Python3
From: https://blog.csdn.net/weixin_66366875/article/details/142917707