元组
元组类比与列表
既有列表一样:同时容纳多种类型的对象
也有字符串一样:不可变的特性
和列表的差别:
列表:[元素1,元素2,元素3,…]
元组: (元素1,元素2,元素3,…])
列表用的是方括号[]
元组用的是圆括号()
类比列表的的一些例子:
# 创建一个元组
>>> 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] # 与列表相同的索引来查找元素
2
>>>
# ------------------------------ 元组里的元素是不可被修改的,否则会报错
>>> rhyme[1] = 10
Traceback (most recent call last):
File "<pyshell#2>", 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, '上山打老虎')
>>>
# count()方法和index()方法
>>> nums = (3, 1, 9, 6, 8, 3, 5, 3)
>>> nums.count(3) # 计算元组内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]
>>>
圆括号的必要性
在不引起歧义的情况下,Python允许你不加。
但最好还是加上,可增加代码的可读性以及更加规范。
如何生成只有一个元素的元组
>>> x = (520) # 直接这么写是错误的,查看类型只会是整数型
>>> type(x)
<class 'int'>
>>> x = (520,) # 加上逗号,查看类型就是元组。
>>> type(x)
<class 'tuple'>
>>>
打包和解包(适用于包括元组、列表、字符串在内的序列)
打包和解包
就是将不同类型的数据放在一个序列里:
>>> t = (123, "FischC", 3.14)
>>> x, y, z = t
# 以上为打包
# ------------------------------
# 以下为解包
>>> x
123
>>> y
'FischC'
>>> 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#48>", 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
-------------
>>> _ = (10,20)
>>> x, y = _
>>> x
10
>>> y
20
>>>
元组真的就固若金汤了吗?
>>> s = [1,2,3]
>>> y = [4,5,6]
>>> w = (s,t)
>>> w[0][0] = 0
>>> w
([0, 2, 3], (123, 'FischC', 3.14))
>>> 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])
>>>
元组的元素是不可变的,如果元组里的元素指向的是一个可变的列表,那么我们还是可以修改的。