题目:你使用过哪些 Python 的标准库?
答案要点:
1. 在 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:这里只举了几个简单的常用的标准模块,后面如果还有机会,会再进行总结。
愿关注我们的人都能找到
属于自己的皮球