“专业人士笔记”系列目录:
创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!创建元组
元组是不可变的值列表。元组是Python最简单和最常见的集合类型之一,可以使用逗号操作符(value = 1,2,3)创建。
语法上,元组是用逗号分隔的值列表:
t = 'a', 'b', 'c', 'd', 'e'
虽然不是必须的,但通常将元组括在括号中 :
t = ('a', 'b', 'c', 'd', 'e')
创建一个带有括号的空元组 :
t0 = ()
type(t0)
# <type 'tuple'>
要创建包含单个元素的元组,必须包含最后一个逗号 :
t1 = 'a',
type(t1)
# <type 'tuple'>
注意,括号中的单个值不是元组 :
t2 = ('a')
type(t2)
# <type 'str'>
要创建单个元素的元组 ,后面必须有逗号,这是最容易在编程中出现的问题:
t2 = ('a',)
type(t2)
# <type 'tuple'>
请注意,对于单个元素的元组,建议使用括号(请参阅PEP8后面的逗号)。此外,在逗号后面不能肝空格(参见PEP8关于空格)
t2 = ('a',)
# 遵从 PEP8
t2 = 'a',
#不符合 PEP8 规范
t2 = ('a', )
#不符合 PEP8 规范
另一种创建元组的方法是内置的函数 tuple:
t = tuple('lupins')
print(t)
#输出:('l', 'u', 'p', 'i', 'n', 's')
t = tuple(range(3))
print(t)
#输出 (0, 1, 2)
元组的不可变特性
Python中列表和元组之间的主要区别之一是,元组是不可变的,也就是说,一旦元组初始化,就不能添加或修改项。例如 :
t = (1, 4, 9)
t[0] = 2
#报错:TypeError: 'tuple' object does not support item assignment
类似地,元组不像list那样有.append和.extend方法。使用+=是可能的,但是它改变了变量的绑定,而不是元组本身 :
t = (1, 2)
q = t
t += (3, 4)
print(t)
#(1, 2, 3, 4)
print(q)
#(1, 2)
在元组中放置可变对象(例如列表)时要小心。 当更改它们时 ,这可能导致非常混乱的结果:例如
t = (1, 2, 3, [1, 2, 3])
t[3] += [4, 5]
#此操作会在tuple中引发错误并同时更改列表的内容
#报错:TypeError: 'tuple' object does not support item assignment
# t的值变为: (1, 2, 3, [1, 2, 3, 4, 5])
你可以使用+=操作符来“附加”到一个元组——这是通过使用“附加”新元素来创建一个新的元组并将其分配给新变量来实现的;旧的元组没有改变,而是被替换了!
这避免了转换到列表和从列表中转换,但这是不好的做法,特别是在你打算多次追加时。
打包和解包元组
Python中的元组是用逗号分隔的值。用于输入元组的圆括号是可选的,因此这两个赋值方式都可以:
a = 1, 2, 3 #a的值 (1, 2, 3)
a = (1, 2, 3) # a 的值(1, 2, 3)
赋值a = 1,2,3也称为包装,因为它将值打包在一个元组中。注意,一个单值元组也是一个元组。要告诉Python变量是元组而不是单个值,可以使用尾随逗号
a = 1 #a是一个整数
a = 1, # a 是一个元组 (1,)
要从元组解包值并执行多个赋值可以使用:
#解包并链式赋值变量
x, y, z = (1, 2, 3)
# x == 1
# y == 2
# z == 3
如果只需要tuple的某些元素,可以将符号“_”用作占位符:
a = 1, 2, 3, 4
_, x, y,_ =a
# x == 2
# y == 3
在python3中,一个带有*前缀的目标变量可以被用来按位置解包元组(参见对迭代变量进行解包)。
first, *more, last = (1, 2, 3, 4, 5)
print(first)
print(more)
print(last)
#输出:
1
[2, 3, 4]
5
内置元组函数
元组支持以下内置函数 :
比较(operator模块,python3已放弃cmp函数)
如果元素是相同类型的,python执行比较并返回结果。如果元素是不同的类型,它将检查它们是否是数字
1、如果是数字,直接进行比较。
2、如果其中一个元素是数字,则认为另外一个非数字元素更大,因为从比较角度来说认为数字是最小的。
3、否则,按字母顺序排序类型。
如果两个元组有相同的值但长度不同,较长的元组就会“更大”。如果两个列表长度也相同,用eq函数则返回True。
import operator
tuple1 = ('a', 'b', 'c', 'd', 'e')
tuple2 = ('1','2','3')
tuple3 = ('a', 'b', 'c', 'd', 'e')
print(operator.gt(tuple1, tuple2))
print(operator.lt(tuple2,tuple1))
print(operator.eq(tuple1,tuple3))
#以上结果都输出True
相关比较函数用法:
长度
函数len返回元组的总长度 :
tuple1 = (‘a’, ‘b’, ‘c’, ‘d’, ‘e’)
len(tuple1)
# 5
元组最大值
函数max从tuple返回最大值的项:
tuple1 = ('a', 'b', 'c', 'd', 'e')
print(max(tuple1))
# 输出: 'e'
tuple2 = ('1','2','3')
print(max(tuple2))
# 输出: '3'
元组最小值
import operator
tuple1 = ('a', 'b', 'c', 'd', 'e')
print(min(tuple1))
# 输出: 'a'
tuple2 = ('1','2','3')
print(min(tuple2))
# 输出: '1'
将列表转换为元组 :
内置函数tuple将列表转换为元组:
list = [1,2,3,4,5]
print(tuple(list))
#输出: (1, 2, 3, 4, 5)
元组连接
使用+连接两个元组
tuple1 = ('a', 'b', 'c', 'd', 'e')
tuple2 = ('1','2','3')
tuple1 + tuple2
#输出: ('a', 'b', 'c', 'd', 'e', '1', '2', '3')
元组的可哈希化特性
hash( (1, 2) )
#这样没问题
hash( ([], {"hello"})
#这样会报错,因为列表和集合不能被hash化
因此,基于上述特性,tuple只能放在set中,或者作为dict中的键,而不能反过来:
{ (1, 2) } # 这样可以
{ ([], {"hello"}) } # 这样会报错
元组索引
x = (1, 2, 3)
x[0]
# 1
x[1]
# 2
x[2]
# 3
x[3]
# 超出索引 IndexError: tuple index out of range
带有负数的索引将从最后一个元素开始往前推:
x[-1] # 3
x[-2] # 2
x[-3] # 1
x[-4] # IndexError: tuple index out of range
反转元组
反转元组中的元素 :
colors = "red", "green", "blue"
rev = colors[::-1] #是否很熟悉,之前讲过,第三个参数为步长,为-1代表从后往前,实际上这样就实现了反转的效果
#rev: ("blue", "green", "red")
或者使用reverse 函数:
colors = "red", "green", "blue"
rev = tuple(reversed(colors))
print(rev)
#输出:('blue', 'green', 'red')
今天的分享就到这里,禁止转载,违者必究