Python每日一题:标准库

时间:2022-07-23
本文章向大家介绍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:这里只举了几个简单的常用的标准模块,后面如果还有机会,会再进行总结。

愿关注我们的人都能找到

属于自己的皮球