Python成为专业人士笔记–Tuple 元组

“专业人士笔记”系列目录:

创帆云: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
      

相关比较函数用法:

v2-9cbf02beb23c70a19589377956cd24ed_b.jpg

长度

函数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')
      

今天的分享就到这里,禁止转载,违者必究

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值