专栏首页FluentStudyPython每日一题:标准库

Python每日一题:标准库

题目:你使用过哪些 Python 的标准库?

答案要点:

1. 在 Python 中我们经常听到 模块、包、库、标准库、第三方库 这些概念,首先要对这些概念进行区分

  • 模块:在 Python 中一个 .py 文件就是一个模块,我们也可以自定义模块
  • 包:将一系列相关的 .py 文件打包,包目录下必须有一个 init__.py文件。可以嵌套子目录,子目录里也必须有 __init.py 文件
  • 库:一些 .py 文件的集合。这也是 Python 的一大特色之一
  • 标准库:Python 安装好后自带的模块。Python 的一个显著特点是具有庞大的模块标准库,这些模块可以帮助我们方便地执行很多的任务。
  • 第三方库:由第三方机构自行研发的库
  • 其实都是模块的意思,只是单个与集合的区别

2. 比如 dict.setdefault() 赋默认值。示例如下:

days_dict = {'Mon':1, 'Tues':2, 'Wed':3, 'Thur':4, 'Fri':5, 'Sat':6, 'Sun':7}

# 给一个 key 赋默认值,会返回当前 key 对应的 value
other_day = days_dict.setdefault('Others', 0)
print(other_day)  # 0

# 如果当前 key 已经有对应的值,是不会影响的,同时返回值也是原来 dict 中的值
tues = days_dict.setdefault('Tues', 10)
print(tues)  # 2 not 10

3. 比如 collections 模块中的 defaultdict() ,用于新建一个带默认值的 dict。它接受一个参数,这个参数必须是一个函数。可以使用函数 int()、list()、或者 dict() 来返回对应默认的值。int() 返回 0 ,list() 返回空列表,dict() 返回空字典。当然也可以自定义函数。示例如下:

from collections import defaultdict
# s = defaultdict('a')
# 如果指定一个具体的值,是会报错的
# first argument must be callable or None
# 从报错信息,必须是 callable ,表示要能通过 xx() 访问,所以是一个函数名

# 使用 Python 自带的函数(示例源自文档)
s = 'mississippi'
d = defaultdict(int)  # 代表初始默认值是 0
for k in s:
    d[k] += 1  # 如果没有默认值,则直接 +=1 是会报错的
sorted(d.items()) #  [('i', 4), ('m', 1), ('p', 2), ('s', 4)]

# 自定义函数(示例代码源自《Python语言及其应用》)
def no_idea():
    return 'Huh?'

bestiary = defaultdict(no_idea)
destiary['A'] = 'Abominable' 
print(destiary['A'])  # Abominable
print(destiary['B'])  # Huh?

4. 比如 collections 中的 OrderedDict。有序字典,个人觉得这个很好用。示例请看第二篇文章。

5. 比如 collections 中的 namedtuple(),具名元组。它用于创建一个 tuple-like 的对象。它不仅有正常的 tuple 该有的功能,同时它还支持通过里面的key来访问值。可以简单理解为它是一个带 key 的元组。这个比较常用。定义及示例如下:

# 定义
# collections.namedtuple(typename, field_names, *, verbose=False, rename=False, module=None)
"""
第一个参数,接受一个 String 类型,表示定义的元组的类型。这里需要注意它和返回值的区别。

该方法返回的是 typename 类型的一个元组,返回值可以和 typename 不一致,返回值是用来定义一个 typename 类型的名称。

第二个参数,接受用空格或者字符串间隔元素的字符串,它表示元组里的 key 值。也可以是一个字符串的序列,比如列表,元组等

这里需要注意的是,除了以下划线开头的名称外,任何有效的 Python 标识符都可以用于 filedname,不能是关键字

第三个参数 verbose 已经过时,表示定义完就返回定义信息

第四个参数 rename,如果为 True,会自动过滤掉不合规定的 fieldname

第五个参数 module,如果为 True,表示 __module__ 会返回该值
"""


from collections import namedtuple
# 如果 filedname 里有不符合要求的字符串并且 rename 不为 True 时
# Test = namedtuple('Test1', ['def', 'a', 'a', '_abc'])
# 上述语句会报错

# 当有非法 filedname 时,rename 必须为 True
Test = namedtuple('Test1', ['def', 'a', 'a', '_abc'], rename=True)
print(Test)  # __main__.Test1 表示了返回值与 typename 的区别
t1 = Test(1, 2, 3 ,4)
print(t1)  # Test1(_0=1, a=2, _2=3, _3=4)
# 可以看到,非法字符都自动作了转换

print(t1[0])  # 可以通过下标访问
print(t1.a)   # 可以通过 key 访问

扩展:

对于 dict,当使用 dict['key'] 时,当 key 不存在,会报错,而用 dict.get('key') 时则不会。同时我们也可以使用setdefault 和 defaultdict 来解决这个问题

PS:这里只举了几个简单的常用的标准模块,后面如果还有机会,会再进行总结。

愿关注我们的人都能找到

属于自己的皮球

本文分享自微信公众号 - FluentStudy(gh_30ef659095e0),作者:Demon

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-03-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 每日一题:协程相关

    答案要点: a、进程是资源分配,每个进程拥有独立的资源空间,因为进程不共享资源,所以就涉及到进程间通信的方式,常见的方式有:消息队列、管道、信号量、socket...

    用户7685359
  • Python笔试面试题总结(一)

    最近一直在面试找工作,总算是决定去一家公司入职。这里对最近这半个月的一些笔试面试题进行分享,希望对大家有帮助。今天首先总结笔试题部分,明天将慢慢给出答案,并给出...

    用户7685359
  • 全方位了解协程概念

    今天介绍下协程的概念,文末会对整篇做一个总结,了解总结的几点,也就大致理解了协程的用法。

    用户7685359
  • Python 200个标准库汇总!

    dummy_threading:threading模块的替代(当_thread不可用时)

    double
  • 谁来颠覆 ARM 构架?

    在移动互联网时代,ARM无处不在。在从ARM成立至今的25年里,基于ARM架构的芯片全球出货量已经超过750亿。在智能手机领域,称ARM处于统治地位并不为过。 ...

    新智元
  • ARM mbed是你在等的吗?

    今天看了几篇ARM mbed在2015技术大会上的视频,小猿第一次关注到这一系统也是在去年一次偶然的机会,那么mbed到底是什么样的一个针对嵌入式的操作系...

    用户1605515
  • 被软银收购之后,特立独行的ARM会发生哪些改变?

    镁客网
  • 芯片巨头ARM中国合资公司正式运营,中国芯迎来新突破?

    据路透社等外媒消息,ARM中国合资公司已于4月底正式运营,新公司名为ARM mini China,注册在深圳,中方投资者占股51%,ARM占股49%,这家新公司...

    量子位
  • 谁才是ARM平台存储系统的忠实践行者?

    当生态被把持住之后,想撼动真是难上加难,几十年了,没有任何一家非x86平台能在企业级和桌面市场撼动Intel的地位。幸好在移动终端领域ARM彻底站稳了脚跟,没有...

    冬瓜哥
  • jdk10与springboot2.1.0尝鲜

    tanoak

扫码关注云+社区

领取腾讯云代金券