Loading...
墨滴

瀋凣

2021/10/17  阅读:49  主题:极简黑

python笔记20

Python day20

1. 元组

Python 的元组与列表类似,不同之处在于元组的元素不能修改。

1.1 创建元祖

元组使用小括号 ( ),列表使用方括号 [ ]

tuple = (obj1, obj2, obj3, ···, objN)

元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可:

>>> tuple1 = (12345'上山打老虎')
>>> tuple1
(12345'上山打老虎')

甚至可以不带括号:

>>> tuple1 = 12345'上山打老虎'
>>> tuple1
(12345'上山打老虎')

思考:
如何创建一个只有一个元素的元组?

我相信会有同学这么做:

>>> _ = (404)

利用type函数来检验一下:

>>> type(_)
<class 'int'>

元组中只包含一个元素时,需要在元素后面添加逗号,,否则括号会被当作运算符使用:

>>> _ = (404,)
>>> type(_)
<class 'tuple'>

甚至可以不带括号:

>>> _ = 404,
>>> type(_)
<class 'tuple'>

1.2 访问元组中的元素

适用于列表的访问方法同样适用于元组,比如迭代

>>> tuple1
(12345'上山打老虎')
>>> for each in tuple:
        print(each)
        
1
2
3
4
5
'上山打老虎'

元组同样也支持索引下标

下标
下标
>>> tuple1[0]
1
>>> tuple1[-1]
'上山打老虎'

既然支持索引,那么跟索引相关的切片自然也是可以的:

  • 指定开头和结尾:
>>> tuple1[1:4]
(234)
  • 只指定开头或结尾:
>>> tuple1[1:]
(2345'上山打老虎')
>>> tuple1[:5]
(12345)
  • 前后都不指定(原样输出):
>>> tuple1[:]
(12345'上山打老虎')
  • 指定步长:
>>> tuple1[::2]
(135)
>>> tuple1[::-1]
('上山打老虎'54321)

1.3 修改元组

>>> marvel = ('钢铁侠''美国队长''雷神''黑寡妇''浩克''灭霸')
  • 尝试对元组的元素进行修改:
>>> marvel[-1] = '鹰眼'
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
TypeError: 'tuple' object does not support item assignment

元组中的元素值是不允许修改的。但我们可以对元组进行连接组合,
举个栗子

>>> tup1 = ('QMRobot'4'somebody')
>>> tup2 = ('tuple'1.414'简单')
#创建新元组tup3
>>> tup3 = tup1 + tup2
>>> tup3
('QMRobot'4'somebody''tuple'1.414'简单')
  • 尝试对元组的元素进行删除:
>>> marvel.remove('灭霸')
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
AttributeError: 'tuple' object has no attribute 'remove'

元组中的元素值是不允许删除的。但我们可以使用del语句来删除整个元组,
举个栗子:

>>> marvel
('钢铁侠''美国队长''雷神''黑寡妇''浩克''灭霸')
>>> del marvel
>>> marvel
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
NameError: name 'marvel' is not defined

元组运算符

与字符串一样,元组之间可以使用 + 号和 * 号进行运算。这就意味着他们可以组合和复制,运算后会生成一个新的元组。

python表达式 结果 描述
len((1, 2, 3)) 3 计算元素个数
(1, 2, 3) + (4, 5, 6) (1, 2, 3, 4, 5, 6) 连接
('Hi!',) * 4 ('Hi!', 'Hi!', 'Hi!', 'Hi!') 复制
3 in (1, 2, 3) True 元素是否存在
for x in (1, 2, 3): print (x,) 1 2 3 迭代

列表推导式

之前讲的列表推导式同样也适用于元组:

>>> list1 = [12345]
>>> [each * 2 for each in list1]
#生成新列表
[246810]

这时候就有同学要问了,既然有列表推导式,那把[]换成()是不是就变成元组推导式呀?

试试:

>>> (each * 2 for each in list1)
<generator object <genexpr> at 0x717d23ff20>

事实上并没有元组推导式这种东西,而我们写的这个其实叫做生成器
那么什么是生成器呢?以后再讲~

1.4 元组的方法和函数

1.4.1 方法

由于元组不可修改的特点,列表支持的 增、删、改、查 方法,只有 适用于元组。

  • count()
>>> nums = (31415926)
>>> nums.count(1)
2
  • index()
>>> marvel
('钢铁侠''美国队长''雷神''黑寡妇''浩克''灭霸')
>>> marvel.index('黑寡妇')
3

1.4.2 内置函数

Python元组包含了以下内置函数

  • len(tuple):计算元组元素个数。
>>> marvel
('钢铁侠''美国队长''雷神''黑寡妇''浩克''灭霸')
>>> len(marvel)
6
  • max(tuple):返回元组中元素最大值。
>>> nums
(31415926)
>>> max(nums)
9
  • min(tuple):返回元组中元素最小值。
>>> min(nums)
1
  • tuple(iterable):将可迭代序列转换为元组。
>>> list1 = [12345'yyds']
>>> tup1 = tuple(list1)
>>> tup1
(12345'yyds')
>>> str1 = 'QMRobot'
>>> tup2 = tuple(str1)
>>> tup2
('Q''M''R''o''b''o''t')

1.5 打包和解包

生成一个元组,我们也称为元组的打包:

>>> pkg = (123'QMRobot'3.14)

而将他们一次性赋值给多个变量的操作我们也称为元组的解包:

>>> p, k, g = pkg
>>> p
123
>>> k
'QMRobot'
>>> g
3.14

其实不仅仅是元组,我们学过的所有序列类型都支持解包操作,比如列表、字符串等。

>>> lst = [123'QMRobot'3.14]
>>> l, s, t = lst
>>> l
123
>>> s
'QMRobot'
>>> t
3.14
>>> a, b, c, d, e, f = "python"
>>> a
p
>>> b
y
>>> c
t
>>> d
h
>>> e
o
>>> f
n

需要注意的是,=左面变量的数量要和右边数据的数量保持一致

>>> a, b, c = "python"
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
ValueError: too many values to unpack (expected 3)

有没有觉得似曾相识?
还记得我们第二节课讲过的,python独特的赋值方式吗?

>>> x, y = 1020
>>> x
10
>>> y
20

其实这就是利用了元组的解包来实现的~

点点关注不迷路
点点关注不迷路
- END -

瀋凣

2021/10/17  阅读:49  主题:极简黑

作者介绍

瀋凣