• 自定义序列类


    序列是Python中非常重要的协议!是可迭代的!

    序列的分类:

     

    序列的协议是放在 from collections import abc的__all__里面的“Sequence”和“MutableSequence”

    里面collection方法继承了 Sized, Iterable, Container

    如果为MutableSequence的话,就声明了很多可以使用的方法 例如:  insert,append,clear,reverse,extend,pop,remove,__iadd__

    下面很重要!!

    a = [1,2]
    a += (3,4)
    #结果是
    [1, 2, 3, 4]
    
    改为 
    a = [1,2]
    c = a + (3,4)
    TypeError: can only concatenate list (not "tuple") to list

    上面不报错的原因可以参考可变序列的MutableSequence的__iadd_函数,它实际上是调用了该类的extend的方法,对该元祖进行了for循环,这样就再在循环中使用append方法可以一个一个得将元祖内值放入list中。而后者并没有调用该函数,所以报错!

    append和extend的区别是:

    a = [1,2]
    a.append((1,2))
    print(a)
    a的结果是 [1, 2, (1, 2)]
    
    由此可见append是将所有看成一个值放进去,不迭代
    
    而extend
    a.extend(range(3))
    print(a)
    [1, 2, 0, 1, 2]
    是将能够可迭代对象实现迭代一个一个当进去

    List的基本切片操作!!!

    #模式[start:end:step]
    """
        其中,第一个数字start表示切片开始位置,默认为0;
        第二个数字end表示切片截止(但不包含)位置(默认为列表长度);
        第三个数字step表示切片的步长(默认为1)。
        当start为0时可以省略,当end为列表长度时可以省略,
        当step为1时可以省略,并且省略步长时可以同时省略最后一个冒号。
        另外,当step为负整数时,表示反向切片,这时start应该比end的值要大才行。
    """
    aList = [3, 4, 5, 6, 7, 9, 11, 13, 15, 17]
    print (aList[::])  # 返回包含原列表中所有元素的新列表
    print (aList[::-1])  # 返回包含原列表中所有元素的逆序列表
    print (aList[::2])  # 隔一个取一个,获取偶数位置的元素
    print (aList[1::2])  # 隔一个取一个,获取奇数位置的元素
    print (aList[3:6])  # 指定切片的开始和结束位置
    aList[0:100]  # 切片结束位置大于列表长度时,从列表尾部截断
    aList[100:]  # 切片开始位置大于列表长度时,返回空列表
    
    aList[len(aList):] = [9]  # 在列表尾部增加元素
    aList[:0] = [1, 2]  # 在列表头部插入元素
    aList[3:3] = [4]  # 在列表中间位置插入元素
    aList[:3] = [1, 2]  # 替换列表元素,等号两边的列表长度相等
    aList[3:] = [4, 5, 6]  # 等号两边的列表长度也可以不相等
    aList[::2] = [0] * 3  # 隔一个修改一个
    print (aList)
    aList[::2] = ['a', 'b', 'c']  # 隔一个修改一个
    aList[::2] = [1,2]  # 左侧切片不连续,等号两边列表长度必须相等
    aList[:3] = []  # 删除列表中前3个元素
    
    del aList[:3]  # 切片元素连续
    del aList[::2]  # 切片元素不连续,隔一个删一个

    bisect的用法:序列类型必须为可修改的序列类型

    import bisect
    from collections import deque
    
    #用来处理已排序的序列,用来维持已排序的序列, 升序
    #二分查找
    inter_list = deque()
    bisect.insort(inter_list, 3)
    bisect.insort(inter_list, 2)
    bisect.insort(inter_list, 5)
    bisect.insort(inter_list, 1)
    bisect.insort(inter_list, 6)
    
    #bisect的默认是bisect_right
    print(bisect.bisect_left(inter_list, 3))
    #学习成绩
    print(inter_list)

    序列的另一种类型:数组 array。数组的存储是一种连续的空间,所以性能很快。

    # array, deque
    # 数组
    import array
    #array和list的一个重要区别, array只能存放指定的数据类型 i是指的int类型,其他类型可以百度
    my_array = array.array("i")
    my_array.append(1)
    my_array.append("abc")就会报错 因为这个数组指明的只能接受int类型

    列表生成式!! 性能是高于 列表操作的!逻辑过于复杂就不用!!

    def handle_item(item):
        return item * item
    odd_list= []
    odd_list = [handle_item(i) for i in range(20) if i%2 ==0]
    print(odd_list)
    
    结果为:
    [0, 4, 16, 36, 64, 100, 144, 196, 256, 324]

    生成器表达式:

    odd_gen = (i for i in range(20) if i%2 ==0)
    print(odd_gen)
    odd_list = list(odd_gen)
    print(odd_list)
    
    
    结果为
    <generator object <genexpr> at 0x0000023A7F2B1728>
    [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

    字典推导式:

    #字典推导式
    my_dict = {
        "key1":"bobby1",
        "key2":"bobby2"
    }
    reverse_dict = {value:key for key,value in my_dict.items()}
    print(reverse_dict)
    
    
    结果是:
    {'bobby1': 'key1', 'bobby2': 'key2'}

    集合推导式:和列表推导式是一样的,只是用的是大括号。推导出来的是集合!

    #集合推导式
    my_set = {key for key,value in my_dict.items()}
    print(type(my_set))
    print(my_set)
    
    结果为
    <class 'set'>
    {'key2', 'key1'}
  • 相关阅读:
    小D课堂
    小D课堂
    小D课堂
    小D课堂
    小D课堂
    小D课堂
    小D课堂
    小D课堂
    小D课堂
    小D课堂
  • 原文地址:https://www.cnblogs.com/shrimpPython/p/10743409.html
Copyright © 2020-2023  润新知