Python中的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模块的作用

  • 类型检查,防止运行时出现参数和返回值类型不符合。
  • 作为开发文档附加说明,方便使用者调用时传入和返回参数类型。
  • 该模块加入后并不会影响程序的运行,不会报正式的错误,只有提醒。
  • 注意: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:生成器类型

到此这篇关于Python集合collections、数据类型typing模块的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容