参考 Python从零开始系列连载,by 王大伟 Python爱好者社区
参考 Hellobi Live | 1小时破冰入门Python
参考 《简明python教程》
Note: 更多连载请查看【python】
目录
元组
上了枷锁的列表
一诺千金, 不可改变
元组是Python的另一种特色的数据类型,元组和列表是相似的,可以存储不同类型的数据。但是!划重点:元组是不可改变的,创建后就不能做任何修改操作了
下面是列表的一些常用的方法,圈出来部分是元组可以使用的
1 元组的创建
莫莫问:元组和列表最大的区别是什么?
小明:废话,当然是[]和()
其实不是
元组最大的特点是,(逗号)
创建一个元组的时候,必须加逗号,不然会认为是整型
tuple1 = 1,#特殊情况:创建一个元素的元组时必须加逗号
print (tuple1)
print (type(tuple1))
tuple2 = (1,)
print (tuple2)
print (type(tuple2))
tuple3 = (1)
print (tuple3)
print (type(tuple3))
结果为
(1,)
<class 'tuple'>
(1,)
<class 'tuple'>
1
<class 'int'>
a = 1,2,3#创建元组,用逗号隔开的就是元组,但是为了美观和代码可读性,我们一般加小括号
print (a)
type(a)
结果为
(1, 2, 3)
tuple
元组支持嵌套
tuple1 = ('a',1,2.33,[1,'a'],(1,3,5),{'a':1})
tuple1#注意:上面的元组包含了列表,所以元组允许嵌套
结果为
('a', 1, 2.33, [1, 'a'], (1, 3, 5), {'a': 1})
创建空元组
tuple1 = ()#创建空元组
tuple1
结果为
()
我们在创建元组的时候,其实是在进行元组打包
tuple1 = 1,2,3,4 #我们在创建元组的时候,其实是在进行元组打包
a,b,c,d = tuple1 #元组解包,将等号右侧的元组中的元素按顺序依次赋值给等号左边的变量
print(a,b,c,d)
结果为
1 2 3 4
要写完整左边的,一 一对应好,否者报错
a,b,c = tuple1 #要写完整左边的,一 一对应好
结果报错
ValueError: too many values to unpack (expected 3)
2 元组的索引
同列表
tuple1 = (0,1,2,3,4,5,6,7,8)
print (tuple1[3]) #索引
print (tuple1[-2]) #索引
结果为
3
7
3 元组的切片
同列表
tuple1 = (0,1,2,3,4,5,6,7,8)
print (tuple1[1:3]) #切片
print (tuple1[5:3:-1]) #切片
结果为
(1, 2)
(5, 4)
4 元组的连接
可以结合切片和连接,对元组进行所谓的添加和删除
同列表
tuple1 = (0,1,2)
tuple2 = (3,4,5)
print (tuple1 + tuple2) #连接
结果为:
(0, 1, 2, 3, 4, 5)
5 元组的复制
同列表
tuple1 = (0,1,2)
tuple1*3 #复制
结果为
(0, 1, 2, 0, 1, 2, 0, 1, 2)
6 元组对内部元素的循环
同列表
tuple1 = (0,1,2)
for i in tuple1: #对内部元素循环
print(i)
结果为
0
1
2
7 查找元组的元素
同列表
tuple1 = (0,1,2)
print (2 in tuple1) #查找元组中是否有某元素
print (3 in tuple1)
结果为
True
False
8 元组的删除
同列表
tuple1 = (0,1,2,3,4,5,6,7,8,9,10)
del tuple1 #删除元组
tuple1
结果报错
NameError: name 'tuple1' is not defined
9 元组的最大值、最小值
同列表
tuple1 = (0,1,2,3,4,5,6,7,8,9,10)
print (max(tuple1))
print (min(tuple1))
结果为
10
0
10 元组的长度
同列表
tuple1 = (0,1,2,3,4,5,6,7,8,9,10)
len(tuple1)#查看元组长度
结果为
11
空元素的元组长度为0
len(())#对空元组执行长度操作,显示长度为0
结果为0
11 元组的元素的不变性
列表中的
• pop()
• append()
• extend()
• remove()
• index()
在元组中都不可用
tuple1 = (1,2,3)
tuple1[0] = 2 #元组元素不能修改
结果报错
TypeError: 'tuple' object does not support item assignment
12 元组与列表之间的转换
list()和tuple()
13 元组与for…in的结合
[(m,n) for m in 'abcd' for n in'abcd']
结果为
[('a', 'a'),
('a', 'b'),
('a', 'c'),
('a', 'd'),
('b', 'a'),
('b', 'b'),
('b', 'c'),
('b', 'd'),
('c', 'a'),
('c', 'b'),
('c', 'c'),
('c', 'd'),
('d', 'a'),
('d', 'b'),
('d', 'c'),
('d', 'd')]
如果要删去相同的元素,可以在最后加一个约束条件
[(m,n) for m in 'abcd' for n in'abcd' if m != n] #如果字符串里有重复的字符,而我们要找不同的字符的排列组合,加条件判断!
结果为
[('a', 'b'),
('a', 'c'),
('a', 'd'),
('b', 'a'),
('b', 'c'),
('b', 'd'),
('c', 'a'),
('c', 'b'),
('c', 'd'),
('d', 'a'),
('d', 'b'),
('d', 'c')]
下面看看一般的方法
#一般方法
list1 = []
for i in 'abcd':
for j in 'abcd':
if i != j:
list1.append((i,j))
list1
结果同上
那么问题来了
小莫:元组操作方法比列表少?为啥还要学这个!感觉没啥优势!
小苏:小莫啊!元组在某些方面有优势的:
- 元组的运算速度比列表快,如果你经常要遍历一个序列,且不需要修改内容,用元组比列表好
- 元组相当于给数据加了保护(不可修改),有些场合需要这种不可修改的内容,想想我们生活中的很多通知说明等pdf文件不就是只读不可写么,能理解了吧。
小莫:震惊!元组在这种情况下竟然能将劣势转为优势
14 元组有像列表一样的推导式吗?
把列表推导式中的[]换成()试试
tuple1 = (i**2 for i in range(10))
type(tmp)
结果为
generator
是生成器,amazing
访问一下下
for j in range (10):
print (tuple1.__next__())
结果像挤牙膏一样,一点一点出来
0
1
4
9
16
25
36
49
64
81
Note: 更多连载请查看【python】