zoukankan      html  css  js  c++  java
  • 元组 tuple

    列表属于可变序列,可以任意修改列表中的元素。元组属于不可变序列,不能修改元组中的 元素。
    因此,元组没有增加元素、修改元素、删除元素相关的方法。 因此,我们只需要学习元组的创建和删除,元组中元素的访问和计数即可。元组支持如下操作:

    • 索引访问
    • 切片操作
    • 连接操作
    • 成员关系操作
    • 比较运算操作
    • 计数:元组长度 len()、最大值 max()、最小值 min()、求和 sum()等。

    元组的创建

    • 通过()创建元组。小括号可以省略。 a = (10,20,30) 或者 a = 10,20,30 如果元组只有一个元素,则必须后面加逗号。这是因为解释器会把(1)解释为整数 1,(1,) 解释为元组
    • 通过 tuple()创建元组 tuple(可迭代的对象)
    b = tuple() #创建一个空元组对象 
    b = tuple("abc") 
    b = tuple(range(3)) 
    b = tuple([2,3,4])

    总结:
    tuple()可以接收列表、字符串、其他序列类型、迭代器等生成元组。 list()可以接收元组、字符串、其他序列类型、迭代器等生成列表。

    元组的元素访问和计数

    >>>tup1 = (50)
    >>> type(tup1)     # 不加逗号,类型为整型
    <class 'int'>
    >>> tup1 = (50,)
    >>> type(tup1)     # 加上逗号,类型为元组
    <class 'tuple'>
    • 元组的元素不能修改
    • 元组的元素访问和列表一样,只不过返回的仍然是元组对象。
    • 列表关于排序的方法 list.sorted()是修改原列表对象,元组没有该方法。如果要对元组排 序,只能使用内置函数 sorted(tupleObj),并生成新的列表对象。

    zip

    zip(列表 1,列表 2,…)将多个列表对应位置的元素组合成为元组,并返回这个 zip 对象。

    >>> a = [10,20,30] 
    >>> b = [40,50,60] 
    >>> c = [70,80,90] 
    >>> d = zip(a,b,c) 
    >>> list(d) 
    [(10, 40, 70), (20, 50, 80), (30, 60, 90)]

    生成器推导式创建元组

    从形式上看,生成器推导式与列表推导式类似,只是生成器推导式使用小括号。列表推 导式直接生成列表对象,生成器推导式生成的不是列表也不是元组,而是一个生成器对象。 我们可以通过生成器对象,转化成列表或者元组。也可以使用生成器对象的__next__() 方法进行遍历,或者直接作为迭代器对象来使用。不管什么方式使用,元素访问结束后,如 果需要重新访问其中的元素,必须重新创建该生成器对象。

    >>> s = (x*2 for x in range(5)) 
    >>> s <generator object <genexpr> at 0x0000000002BDEB48>
    >>> tuple(s) (0, 2, 4, 6, 8) 
    >>> list(s) #只能访问一次元素。第二次就为空了。需要再生成一次 
    []
    >>> s <generator object <genexpr> at 0x0000000002BDEB48> 
    >>> tuple(s) 
    ()
    >>> s = (x*2 for x in range(5)) 
    >>> s.__next__() 
    0
    >>>
    s.__next__() 
    2
    >>> s.__next__()
    4 

    元组总结

    • 元组的核心特点是:不可变序列。
    • 元组的访问和处理速度比列表快。
    • 与整数和字符串一样,元组可以作为字典的键,列表则永远不能作为字典的键使用。

    拓展:namedtuple(具名元组)

    因为元组的局限性:不能为元组内部的数据进行命名,所以往往我们并不知道一个元组所要表达的意义,所以在这里引入了 collections.namedtuple 这个工厂函数,来构造一个带字段名的元组。具名元组的实例和普通元组消耗的内存一样多,因为字段名都被存在对应的类里面。这个类跟普通的对象实例比起来也要小一些,因为 Python 不会用 dict 来存放这些实例的属性。
    namedtuple 对象的定义如以下格式:

    collections.namedtuple(typename, field_names, verbose=False, rename=False)

    返回一个具名元组子类 typename,其中参数的意义如下:

    • typename:元组名称
    • field_names: 元组中元素的名称
    • rename: 如果元素名称中含有 python 的关键字,则必须设置为 rename=True
    • verbose: 默认就好
      下面来看看声明一个具名元组及其实例化的方法:
    import collections
    # 两种方法来给 namedtuple 定义方法名
    #User = collections.namedtuple('User', ['name', 'age', 'id'])
    User = collections.namedtuple('User', 'name age id')
    user = User('tester', '22', '464643123')
    print(user)

    collections.namedtuple(‘User’, ‘name age id’) 创建一个具名元组,需要两个参数,一个是类名,另一个是类的各个字段名。后者可以是有多个字符串组成的可迭代对象,或者是有空格分隔开的字段名组成的字符串(比如本示例)。具名元组可以通过字段名或者位置来获取一个字段的信息。
    输出结果:

    User(name='tester', age='22', id='464643123')

    具名元组的特有属性:
    类属性 _fields:包含这个类所有字段名的元组
    类方法 _make(iterable):接受一个可迭代对象来生产这个类的实例
    实例方法 _asdict():把具名元组以 collections.OrdereDict 的形式返回,可以利用它来把元组里的信息友好的展示出来

    from collections import namedtuple
    
    # 定义一个namedtuple类型User,并包含name,sex和age属性。
    User = namedtuple('User', ['name', 'sex', 'age'])
    
    # 创建一个User对象
    user = User(name='Runoob', sex='male', age=12)
    
    # 获取所有字段名
    print( user._fields )
    
    # 也可以通过一个list来创建一个User对象,这里注意需要使用"_make"方法
    user = User._make(['Runoob', 'male', 12])
    
    print( user )
    # User(name='user1', sex='male', age=12)
    
    # 获取用户的属性
    print( user.name )
    print( user.sex )
    print( user.age )
    
    # 修改对象属性,注意要使用"_replace"方法
    user = user._replace(age=22)
    print( user )
    # User(name='user1', sex='male', age=21)
    
    # 将User对象转换成字典,注意要使用"_asdict"
    print( user._asdict() )
    # OrderedDict([('name', 'Runoob'), ('sex', 'male'), ('age', 22)])

    以上实例输出结果为:

    ('name', 'sex', 'age')
    User(name='Runoob', sex='male', age=12)
    Runoob
    male
    12
    User(name='Runoob', sex='male', age=22)
    OrderedDict([('name', 'Runoob'), ('sex', 'male'), ('age', 22)])
    别废话,拿你代码给我看。
  • 相关阅读:
    四则运算
    androidstdio导入工程报错
    日程代码任务1
    软件团队模式选择
    初识软件工程
    java数组中最大的子数组之和
    解决键盘布局错误(日文系统)
    固态硬盘的更替
    ZendDebugger的配置
    apache命令行启动
  • 原文地址:https://www.cnblogs.com/lvxueyang/p/13707526.html
Copyright © 2011-2022 走看看