python 自称 "Batteries included"(自带电池, 自备干粮?), 就是因为他提供了很多内置的模块, 使用这些模块无需安装和配置即可使用.

本章主要介绍 python 的一些内置常用核心模块

Python 常用的核心模块

一、collections模块

这是个有用的容器模块, 提供了许多有用的集合, 来弥补通用的内置容器:list, dict, tuple, set

1.1 namedtuple()

namedtuple()是一个工厂函数, 用来创建一个tuple的子类型namedtuple.

我们以前的tuple只能通过下标去访问, namedtuple访问元素的时候可以使用类似属性的东西去访问.


基本使用

from collections import namedtuple

# 参数1: 要创建的 tuple 的类型的名字 参数2:新类型拥有的属性列表
# 返回的是个类, 这个类的类名就是 Point(参数1确定的) , 拥有两个属性 x, y
# 变量 Point 只是表示我们又重新定义了变量指向了返回的那个类而已
Point = namedtuple("Point", ["x", "y"])
print(Point)
print(issubclass(Point, tuple)) # 确实是 tuple 的子类 # 使用返回的类型创建一个对象, 这个对象就表示一个平面中的点
p1 = Point(x=10, y=20)
print(p1.x)
print(p1.y)

说明:

  1. 从上面可以很容易的看出来, 使用namedtuple可以很容易定义出一种数据类型
  2. 他具备tuple的不可变性, 又能根据属性来引用, 一个字:用起来就是爽
  3. 定义一个表示平面的圆: Circle = namedtuple('Circle', ['x', 'y', 'r'])

继承自tuple

由于namedtuple返回的类继承自tuple, 所以tuple的属性和方法在这里都可以使用.

比如用下标去访问, 用for去迭代等等.

from collections import namedtuple

Point = namedtuple("Point", ["x", "y"])
p1 = Point(x=10, y=20) print(p1[0])
print(p1[1]) for i in p1:
print(i)

3 个新增方法和 2 个新增属性

类方法:_make(序列或迭代器)

从已知的序列或迭代器中创建一个实例

from collections import namedtuple

Point = namedtuple("Point", ["x", "y"])

nums = [20, 100]
p1 = Point._make(nums)
print(p1) p2 = Point._make(range(10, 12))
print(p2)


实例方法:_asdict()

返回一个列表(从3.1f开始是一个OrderedDict)

from collections import namedtuple

Point = namedtuple("Point", ["x", "y"])
p1 = Point(10, 20)
d = p1._asdict()
print(d)


实例方法:_replace(关键字参数)

更改某个属性的值, 由于namedtuple是不可变的, 所以返回的是一个新的namedtuple实例对象

from collections import namedtuple

Point = namedtuple("Point", ["x", "y"])
p1 = Point(10, 20)
p2 = p1._replace(y=100)
print(p2)


类属性:_source

返回创建的类的源码

类属性: _fields

返回创建类的所有属性

from collections import namedtuple

Point = namedtuple("Point", ["x", "y"])
print(Point._fields)

1.2 类:deque

deque是一个双向队列.

发音: deck 是 "double-ended queue" 的简写

deque线程安全, 内存高效, 支持在两端添加和删除元素.

相对list主要体现在添加和删除效率比较高.


创建deque对象

deque([iterable[, maxlen]])

两个参数都是可选

参数1: 可迭代对象, 会把里面的数据初始近双端队列中

参数2: 双端队列允许的最大长度. 如果元素个数超出了这个只, 则只保留后面添加的.

from collections import deque

d = deque(range(10))
print(d)


方法和属性

append(x)

队列的右边添加元素.

注意:对队列来说, 左边指队首, 右边指队尾

appendleft(x)

在队列的左边添加元素

clear()

情况队列中的所有元素, 然后长度成为 0

copy()

浅复制队列中的元素 (3.5新增)

count(x)

统计指定的元素 x 在队里中出现的次数

extend(iterable)

向右扩展队列

extendleft(iterable)

向左扩展队列

index(x)

查找x在队里中第一次出现的下标. 如果没有找到, 则抛出异常

insert(i, x)

x插入到下标为i的位置

pop()

删除并返回最右边的元素

popleft

删除并返回最左边的元素

remove(x)

删除队列中第一个x

reverse()

翻转队列中的元素

只读属性:maxlen

创建队列的时候设定的允许的元素的最大个数

1.3 类:Counter

Counter用来统计集合中元素出现的次数.

Counterdict的子类, 每个键值对都表示元素和元素出现的次数.

创建Counter对象

Counter([iterable-or-mapping])

参数:需要统计的迭代类型或mapping 类型

from collections import Counter

# 通过可迭代类型创建一个 Counter
c1 = Counter("abcabc3344efg") print(c1) # 通过 dict 创建一个 Counter
c2 = Counter({"a": 3, "b": 4}) # 表示 a 出现了3次
print(c2) # 通过关键字创建一个 Counter
c3 = Counter(cats=4, dogs=8) # 表示 cats 出现了4次
print(c3)


有用的几个方法

elements()

根据统计结果, 返回一个包含所有元素的可迭代类型的对象

most_common(n)

返回出现次数最多的前n个元素

from collections import Counter

c1 = Counter("abcabc3344efg")
print(sorted(c1.elements())) # 所有的元素
print(c1.most_common(2)) c2 = Counter({"a": 3, "b": 4})
print(sorted(c2.elements()))
print(c2.most_common(2)) c3 = Counter(cats=4, dogs=8)
print(sorted(c3.elements()))
print(c3.most_common(1))

1.4 类:defaultdict

在以前我们使用dict的时候, 如果访问不存在的key时会抛出异常. 使用defaultdict则可以避免这个问题.

defaultdict(函数)

说明:

  1. 如果访问的key不存在, 则会调用传递的函数, 把函数作为value
  2. 其余的使用和dict一样
from collections import defaultdict

d = defaultdict(lambda: "默认值")
d["b"] = "bbb"
# key 不存在, 则调用函数, 把函数返回值作为值. 并把键值对存入到 defaultdict中
print(d["a"])
print(d["b"])
print(d)


from collections import defaultdict

s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]

d = defaultdict(list)
for k, v in s:
d[k].append(v) print(sorted(d.items()))


from collections import defaultdict
# 统计每个字符出现的次数
s = "abcdabAbc" d = defaultdict(int)
for k in s:
d[k] += 1 print(sorted(d.items()))

1.5 类:OrderedDict

dict的键值对是无序的.

ordereddict是可以记录键值对的插入顺序的dict.

from collections import OrderedDict

od = OrderedDict()
od["a"] = 10
od["c"] = 20
od["b"] = 40
for k, v in od.items():
print(k + " : " + str(v))

Python第十一章-常用的核心模块01-collections模块的更多相关文章

  1. Python第十一章-常用的核心模块03-json模块

    python 自称 "Batteries included"(自带电池, 自备干粮?), 就是因为他提供了很多内置的模块, 使用这些模块无需安装和配置即可使用. 本章主要介绍 py ...

  2. Python第十一章-常用的核心模块04-datetime模块

    python 自称 "Batteries included"(自带电池, 自备干粮?), 就是因为他提供了很多内置的模块, 使用这些模块无需安装和配置即可使用. 本章主要介绍 py ...

  3. python的常用模块之collections模块

    python的常用模块之collections模块 python全栈开发,模块,collections 认识模块 什么是模块?    常见的场景:一个模块就是一个包含了python定义和声明的文件,文 ...

  4. Python 常用模块(1) -- collections模块,time模块,random模块,os模块,sys模块

    主要内容: 一. 模块的简单认识 二. collections模块 三. time时间模块 四. random模块 五. os模块 六. sys模块 一. 模块的简单认识 模块: 模块就是把装有特定功 ...

  5. Python模块01/自定义模块/time模块/datetime模块/random模块

    Python模块01/自定义模块/time模块/datetime模块/random模块 内容大纲 1.自定义模块 2.time模块 3.datetime模块 4.random模块 1.自定义模块 1. ...

  6. 模块二之序列化模块以及collections模块

    模块二之序列化模块以及collections模块 一.序列化模块 json模块 ''' 序列化:将python或其他语言的数据类型转换成字符串类型 json模块: 是一个序列化模块. json: 是一 ...

  7. 《Python》常用模块之collections模块

    内置的数据类型: int  float  complex str  list  tuple dict  set 基础数据类型: int  float  complex str  list  tuple ...

  8. python常见模块之collections模块

    一.模块简介 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict.namedtu ...

  9. 常用模块(collections模块,时间模块,random模块,os模块,sys模块,序列化模块,re模块,hashlib模块,configparser模块,logging模块)

    认识模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的 ...

随机推荐

  1. 可视化工作流程设计开发OA系统,一两个程序员就搞定!

    随着信息化的发展,越来越多的公司老板要求实现企业审批流程化.一个公司在初期,人员少,流程简单,员工也会经常不按工作流程来走,甚至有些跨部门的工作因为关系原因,没有走工作流程就实施,导致后期出现问题或者 ...

  2. 利用GitHub制作在线炫酷简历

    首先我们先体验一下炫酷简历.然后决定我们要不要使用. https://jessezhao1990.github.... 如何使用本项目部署你自己的在线简历 1. 书写简历 在src文件夹里面有个con ...

  3. JZOJ 3453.【NOIP2013中秋节模拟】连通块(connect)

    3453.[NOIP2013中秋节模拟]连通块(connect) Time Limits: 1000 ms Memory Limits: 262144 KB (File IO): input:conn ...

  4. IntelliJ IDEA 2020 全家桶注册码

    WU78YHTY7E-eyJsaWNlbnNlSWQiOiJPUVQzT0oyNVhFIiwibGljZW5zZWVOYW1lIjoi5rC45LmF5r+A5rS7IGlkZWEubWVkZW1pb ...

  5. 使用AtomicStampedReference<T>的大坑

    //在初始化的时候会把引用和时间戳存到pair中 AtomicStampedReference<Integer> integerAtomicStampedReference = new A ...

  6. 使用SharpDevelop配合MonoGame进行游戏开发

    SharpDevelop是一款开源的轻量级IDE,它支持众多的语言及项目开发.可以看看支持的项目. 程序本体仅十几MB,打开项目速度飞快. 目前SharpDevelop最高支持C# 5.0,.NET ...

  7. echart图表中legend不显示问题

    主要是legend中的name要和series中的name对应上.

  8. Element UI中的上传文件功能

    上传文件给后台: <el-upload style="display:inline-block" :limit=" class="upload-demo& ...

  9. 从源码看 PHP 7 数组的实现

    本文所用源码为 PHP 7.4.4 的版本. PHP 7 数组概述 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.此类型在很多方面做了优化,因此可以把它当 ...

  10. 【TIJ4】第五章全部习题

    第五章习题 5.1 package ex0501; //[5.1]创建一个类,它包含一个未初始化的String引用.验证该引用被Java初始化成null class TestDefaultNull { ...