zoukankan      html  css  js  c++  java
  • python元组类型

    元组类型简介

    使用括号包围的数据结构是元组(tuple)。例如:

    >>> (1,2,3)
    (1, 2, 3)
    
    >>> T = (1,2,3,)
    >>> T
    (1, 2, 3)
    

    元组和列表一样,都是容器型的数据结构,且都是序列,所以容器中的元素都是按照索引位置有序存放的。所以,可以进行索引取值、切片等序列通用操作。

    不同的是,元组是不可变序列,无法原处修改,意味着修改元组必须创建新的元组对象。实际上元组的概念来源于数学,在关系型数据库中用来表示一行数据对象,而行数据对象是固定不变的完整、稳定结构,python的元组也一样隐含的是完整性、稳定性。

    不可变序列同样意味着可以使用hash()内置函数进行hash,也就是说它是hashable的。

    hashable的类型是稳定的数据,可以放在一些需要稳定结构的地方,比如Set、dict的key,它们内部都是通过hash后的数据存放的。hashable意味着不同对象的hash值不同。比如类的实例对象全都是不同的,之所以不同是因为它们默认就是hashable的,不同对象的hash值不同。

    元组的结构

    元组可以看作是不可变的列表。它们的结构非常类似,都是在容器中存放元素的引用地址。

    它的结构图如下:

    这个结构图什么意思,这里不再赘述,如有需要,参考我对列表的介绍文章。

    因为元组是不可变对象,所以修改元组数据会报错。也就是说,元组中的保存的引用地址是不可变的。

    >>> T = (1111,2222,3333,4444)
    
    >>> T[0] = 11111
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'tuple' object does not support item assignment
    

    构造元组

    直接使用括号包围元素即可,或者使用元组的构造函数tuple()将数据转换成元组。例如:

    >>> (1,2,3,4)
    (1, 2, 3, 4)
    
    >>> tuple("abcdef")
    ('a', 'b', 'c', 'd', 'e', 'f')
    
    >>> tuple([1,2,3,4])
    (1, 2, 3, 4)
    

    括号中可以加一个尾随逗号:

    >>> 1
    1
    

    需要注意的是,python中很多地方隐式地自动构造元组。它的隐式构造规则是这样的:如果没有指定括号,又有多个值,那么就使用元组作为容器。

    >>> 1,2
    (1, 2)
    

    再者,为了区分没有括号的元组和单个数据对象,可以在想要作为元组元素的数据后面加上逗号。例如:

    >>> 1,     # 元组
    (1,)
    >>> (1,)   # 元组
    (1,)
    
    >>> 1      # 单个数据
    1
    >>> (1)    # 单个数据
    1
    

    元组中可以嵌套任意类型的数据对象:

    >>> (1,2,(3,4))
    (1, 2, (3, 4))
    
    >>> (1,2,[3,4])
    (1, 2, [3, 4])
    

    操作元组

    元组是不可变的序列。序列意味着它的元素是按索引位置有序的,序列的通用操作元组都可以使用,不可变序列意味着那些序列的修改行为都不能用,但是却可以使用hash()内置函数对元组进行hash。

    关于序列有哪些通用操作,哪些是不可变序列具有的操作,哪些是可变序列具有的操作,详细内容参见:Python中的序列操作

    这里简单介绍一点基本操作。

    元组支持+ *符号操作:

    >>> T = (1,2,3,4)
    >>> T1 = ('a','b','c')
    
    >>> T + T1
    (1, 2, 3, 4, 'a', 'b', 'c')
    
    >>> (1,2) + tuple("34")
    (1, 2, '3', '4')
    
    >>> T * 2
    (1, 2, 3, 4, 1, 2, 3, 4)
    >>> 2 * T
    (1, 2, 3, 4, 1, 2, 3, 4)
    

    可以通过+=的方式进行二元赋值:

    >>> T1 = (1,2,3)
    >>> T2 = (4,5,6)
    
    >>> T1 += T2
    >>> T1
    (1, 2, 3, 4, 5, 6)
    

    元组是序列,序列类型的每个元素都是按索引位置进行存放的,所以可以通过索引的方式取得元组中的各个元素,通过切片的方式取得子元组:

    >>> T = (1,2,3,4,5)
    >>> T[0]
    1
    
    >>> T[:3]
    (1, 2, 3)
    >>> T[:]
    (1, 2, 3, 4, 5)
    >>> T[2:-1]
    (3, 4)
    

    但不能赋值,因为元组是不可变对象。

    >>> T = (1,2,3,4)
    >>> T[0] = 11
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'tuple' object does not support item assignment
    

    因为元组是不可变对象,所以可以使用hash()进行hash:

    >>> hash(T)
    -1883319094
    >>> hash((1,2,3))
    -378539185
    >>> hash([1,2,3])
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'list'
    

    修改元组

    因为元组是不可变对象,所以没有直接方法修改元组,只能通过其它手段根据原始元组间接地构造新元组。切片返回的元组也是一种修改方式。

    另外,要修改元组,可以考虑将元组转换成可变的列表,修改之后再转换回元组。例如:

    >>> t = ('a','b','c','d')
    >>> tmp = list(t)
    >>> tmp[2] = "cc"
    >>> t = tuple(tmp)
    >>> t
    ('a', 'b', 'cc', 'd')
    

    或者,通过解析的方式构造新元组,但元组解析必须注意的是元组的括号特殊性,因为它会被当作表达式的包围括号,而不是元组的构造括号。所以,只能使用tuple()包围解析表达式。

    >>> T = (1,2,3,4,5)
    >>> tuple( i * 2 for i in T)
    (2, 4, 6, 8, 10)
    
    >>> ( i * 2 for i in T)  # 不是元组,而是表达式括号
    <generator object <genexpr> at 0x03572150>
    
  • 相关阅读:
    Vuex基本用法
    vue ui 创建项目报错: Failed to get response from https://registry.yarnpkg.com/vue-cli-version-marker
    vue+elementui {{ }} 的使用
    vue+elementui项目去除html标签
    vue+elementui 将后端传来数据编程tree结构、同一级别数据对象
    为某个table项添加slot
    vue+elementui项目,table项内容超过确定行以“...”显示剩余部分的实现
    前端对后台数据的处理
    vue+elementUI项目获取数组最后一位,防止深拷贝问题
    thinkPHP 控制器定义
  • 原文地址:https://www.cnblogs.com/f-ck-need-u/p/10159411.html
Copyright © 2011-2022 走看看