zoukankan      html  css  js  c++  java
  • Python(25):collections集合,typing数据类型模块

    一、collections集合

    collections是Python内建的一个集合模块,提供了许多有用的集合类。

    1、namedtuple:命名tuple对象

    namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素。

    namedtuple('名称', [属性list])

    这样一来,我们用namedtuple可以很方便地定义一种数据类型,它具备tuple的不变性,又可以根据属性来引用,使用十分方便。

    我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:

    p = (1,2)

    但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的。

    定义一个class又小题大做了,这时,namedtuple就派上了用场:

    from collections import namedtuple
    Point = namedtuple('Point', ['x', 'y'])
    p = Point(1, 2)
    p.x # 1
    p.y #2

    可以验证创建的Point对象是tuple的一种子类:

    isinstance(p, Point) #True
    isinstance(p, tuple) #True

    类似的,如果要用坐标和半径表示一个圆,也可以用namedtuple定义:

    Circle = namedtuple('Circle', ['x', 'y', 'r'])

    2、deque:双端队列

    使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。

    deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:

    deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。

    from collections import deque
    q = deque(['a', 'b', 'c'])
    q.append('x')
    q.appendleft('y')
    q
    #deque(['y', 'a', 'b', 'c', 'x'])

    3、defaultdict:默认字典

    使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict。

    注意默认值是调用函数返回的,而函数在创建defaultdict对象时传入。

    除了在Key不存在时返回默认值,defaultdict的其他行为跟dict是完全一样的。

    from collections import defaultdict
    dd = defaultdict(lambda: 'N/A')
    dd['key1'] = 'abc'
    dd['key1'] # key1存在
    #'abc'
    dd['key2'] # key2不存在,返回默认值
    #'N/A'

    4、OrderedDict:顺序字典

    使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。

    如果要保持Key的顺序,可以用OrderedDict:

    from collections import OrderedDict
    d = dict([('a', 1), ('b', 2), ('c', 3)])
    d # dict的Key是无序的
    #{'a': 1, 'b': 2, 'c': 3}
    od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
    od # OrderedDict的Key是有序的
    #OrderedDict([('a', 1), ('b', 2), ('c', 3)])

    注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:

    od = OrderedDict()
    od['z'] = 1
    od['y'] = 2
    od['x'] = 3
    od.keys() # 按照插入的Key的顺序返回
    #odict_keys(['z', 'y', 'x'])

    OrderedDict可以实现一个FIFO(先进先出)的dict,当容量超出限制时,先删除最早添加的Key:

    from collections import OrderedDict
    
    class LastUpdatedOrderedDict(OrderedDict):
    
        def __init__(self, capacity):
            super(LastUpdatedOrderedDict, self).__init__()
            self._capacity = capacity
    
        def __setitem__(self, key, value):
            containsKey = 1 if key in self else 0
            if len(self) - containsKey >= self._capacity:
                last = self.popitem(last=False)
                print('remove:', last)
            if containsKey:
                del self[key]
                print('set:', (key, value))
            else:
                print('add:', (key, value))
            OrderedDict.__setitem__(self, key, value)

    5、Counter:计数器

    Counter是一个简单的计数器.

    Counter实际上也是dict的一个子类,下面的结果可以看出,字符'g'、'm'、'r'各出现了两次,其他字符各出现了一次。

    例如,统计字符出现的个数:

    from collections import Counter
    c = Counter()
    for ch in 'programming':
        c[ch] = c[ch] + 1
    print(c)
    #Counter({'p': 1, 'r': 2, 'o': 1, 'g': 2, 'a': 1, 'm': 2, 'i': 1, 'n': 1})

    二、typing模块

    1、typing模块的作用

    1. 类型检查,防止运行时出现参数和返回值类型不符合。
    2. 作为开发文档附加说明,方便使用者调用时传入和返回参数类型。
    3. 该模块加入后并不会影响程序的运行,不会报正式的错误,只有提醒
    • 注意:typing模块只有在python3.5以上的版本中才可以使用,pycharm目前支持typing检查。

    2、使用typing模块

    • 在传入参数时通过"参数名:类型"的形式声明参数的类型;
    • 返回结果通过"-> 结果类型"的形式声明结果的类型。

    在调用的时候如果参数的类型不正确pycharm会有提醒,但不会影响程序的运行。

    from typing import List, Tuple, Dict
    
    
    def add(a: int, c: str, d: float,  b: bool) -> Tuple[List, Tuple, Dict, bool]:
        list1 = list(range(a))
        tup = (c, c, c)
        d = {"a": d}
        bl = b
        return list1, tup, d, bl
    
    
    print(add(5, "hhhh", 2.3, False))
    # ([0, 1, 2, 3, 4], ('hhhh', 'hhhh', 'hhhh'), {'a': 2.3}, False)

    对于如list列表等,还可以规定得更加具体一些。如:"-> List[str]”,规定返回的是列表,并且元素是字符串。

    from typing import List
    
    
    def func(a: int, b: str–>  List[int or str] :  # 使用or关键字表示多种类型
        list1 = []
        list1.append(a)
        list1.append(b)
        return list1

    4、typing常用类型

    • int、long、float: 整型、长整形、浮点型
    • bool、str: 布尔型、字符串类型
    • List、 Tuple、 Dict、 Set:列表、元组、字典、集合
    • Iterable、Iterator:可迭代类型、迭代器类型
    • Generator:生成器类型
  • 相关阅读:
    快速排序法
    ios随机数
    ios简单更改系统TabBar的高度
    ios电话拨打进行监听电话状态
    iosUISegmentedControl的基本设置
    ios使用xcode进行Archive打包上传出现的常见错误
    ios实现文字的自适应
    ios 给view添加一个渐变的背景色
    iOSNSDate的相关操作
    ios导航栏又按钮添加图片后使其保持原色
  • 原文地址:https://www.cnblogs.com/springsnow/p/11972985.html
Copyright © 2011-2022 走看看