• think python 第12章 tuples


    12.1tuples are immutable

     创建元组的关键是使用‘,’,要创建只含一个元素的元组,需要包含最后的逗号。

    创建元组的另一个方法是使用内置函数tuple。没有参数时,创建一个空元组。

    如果参数是一个序列(字符串、列表或元组),返回结果是使用序列中的元素构成的元组。

    大多数的列表运算符适用于元组。括号运算可以索引一个元素。也可以使用切片。

    但是元组中的元素是不可修改的,我们可以使用另一个元组代替原来的元组

    12.2tuple assignment

    >>> #如果对两个元组交换赋值,不需要中间变量
    >>> a = 1,
    >>> b = 2,
    >>> a,b = b,a
    >>> print(a,b)
    (2,) (1,)
    >>> #如果我们项分离一个元组为两个元组,可以在后面使用split函数
    >>> addr = '12345678@qq.com'
    >>> qq,domain = addr.split('@')
    >>> print (qq)
    12345678
    >>> print(domain)
    qq.com

    12.3tuples as return values

    元组作为返回值时,可以返回多个值

    >>> def min_max(t):
        return min(t),max(t)
    
    >>> t = 1,2,3,4,5
    >>> print(min_max(t))
    (1, 5)
    >>> min1,max1 = min_max(t)
    >>> min1
    1
    >>> max1
    5

    12.4variable-length argument tuples

    >>> #以*开头的参数将参数聚集为一个元组
    >>> def printall(*agrs):
        print(agrs)
    
        
    >>> printall(1,2.0,'3')
    (1, 2.0, '3')
    >>> #于聚集(gaters)相对应的是散布(scatter)。如果一个值的序列要作为多个参数传递给一个函数,可以使用*运算符
    >>> t = (7,3)
    >>> divmod(t)
    Traceback (most recent call last):
      File "<pyshell#142>", line 1, in <module>
        divmod(t)
    TypeError: divmod expected 2 arguments, got 1
    >>> divmod(*t)
    (2, 1)

    许多内建函数可以使用变长参数元组,如min,max,但是sum不可以。我们可以构建一个sumall函数,用来接收多个参数,并返回它们的和。

    >>> min(1,2,3)
    1
    >>> max(1,2,3)
    3
    >>> sum(1,2,3)
    Traceback (most recent call last):
      File "<pyshell#146>", line 1, in <module>
        sum(1,2,3)
    TypeError: sum expected at most 2 arguments, got 3
    >>> def sumall(*t):
        return sum(t)
    
    >>> sumall(1,2,3)
    6

    12.5lists and tuples

    内建函数zip可以将多个序列zip成一个元组的列表,每个元组包含每个列表的一个元素,如果序列长度不同,结果的长度与较短的序列相同。

    python3中返回的是一个元组的迭代器,我们需要用list强制转换。

    >>> s = 'abc'
    >>> t = [0,1,2]
    >>> zip(s,t)
    <zip object at 0x000001BFD4DE2388>
    >>> print(zip(s,t))
    >>> zip('abcd','01234')
    <zip object at 0x000001BFD4E093C8>
    >>> list(zip(s,t))
    [('a', 0), ('b', 1), ('c', 2)]
    >>> list(zip('abcd','01234'))
    [('a', '0'), ('b', '1'), ('c', '2'), ('d', '3')]

    使用for循环遍历一个元组的列表

    >>> t = list(zip('abcdefg','0123456'))
    >>> for letter,number in t:
        print(letter,number)
    
        
    a 0
    b 1
    c 2
    d 3
    e 4
    f 5
    g 6
    >>> t1 = [1,2,3,4,5]
    >>> t2 = 1,2,3,4,0
    >>> def has_match(t1,t2):
        for x,y in zip(t1,t2):
            if x == y:
                return True
        return False
    
    >>> has_match(t1,t2)
    True
    >>> #可以使用enumerate内建函数来遍历一个序列中的元素和它们的下标
    >>> for index,element in enumerate('abc'):
        print(index,element)
    
        
    0 a
    1 b
    2 c

    12.6dictionaries and tuples

    >>> d = {'a':0,'b':1,'c':2}
    >>> t = d.items()#items返回的是元组的列表,与python2稍有不同,输出结果多了前面的dict_items
    >>> print(t)
    dict_items([('a', 0), ('b', 1), ('c', 2)])
    >>> d = {'a':0,'b':1,'c':2}
    >>> t = dict(d)
    >>> t
    {'a': 0, 'b': 1, 'c': 2}
    >>> #除了用元组;列表来初始化一个字典,我们还可以结合dict和zip创建字典
    >>> d = dict(zip('abc',range(3)))
    >>> d
    {'a': 0, 'b': 1, 'c': 2}

    12.7comparing tuples

    DSU模式

    Decorate 装饰序列,生成元组列表,将一个或多个排序关键字放在元素的最前面

    Sort 对元组列表排序

    Undecorate 通过从以排序的序列中抽出元素来还原

     1 def sort_by_length(words):
     2     t = []
     3     for word in words:
     4         t.append((len(word),word))
     5 
     6     t.sort(reverse=True)
     7 
     8     res = []
     9     for lengte,word in t:
    10         res.append(word)
    11     return res
    12 
    13 wo = 'hello','python','hi','world'
    14 print(sort_by_length(wo))

    12.8sequences of sequences

    列表比元组更为常用,主要因为它们是可改变的。但有一些情况我们会更倾向元组

    1.在某些情况下,如return语句,句法上创建一个元组比创建一个列表更方便。在其它情况下,我们也许更倾向列表

    2.若使用一个类似字典关键字的序列,我们必须使用类似元组或字符串的不可改变的数据类型

    3.若将序列作为函数值参数,使用元组会减少潜在的因为别名而造成的意外的行为

    由于元组是不可改变的,他们不提供类似sort或reverse等修改列表的方法。但是python提供内建函数sorted和reversed,它们读取任何序列作为参数,并返回一个新的排序后的列表

  • 相关阅读:
    MVC HtmlHelper
    Bellman-ford算法、SPFA算法求解最短路模板
    Dijkstra算法求最短路模板
    静态邻接表模板
    HDU 4511 小明系列故事——女友的考验 ( Trie图 && DP )
    HDU 4758 Walk Through Squares ( Trie图 && 状压DP && 数量限制类型 )
    HDU 3341 Lost's revenge ( Trie图 && 状压DP && 数量限制类型 )
    POJ 3691 DNA repair ( Trie图 && DP )
    POJ 2456 Aggressive cows ( 二分 && 贪心 )
    HDU 2296 Ring ( Trie图 && DP && DP状态记录)
  • 原文地址:https://www.cnblogs.com/Kingwjk/p/7922083.html
Copyright © 2020-2023  润新知