Python小贴士

Python的一些使用技巧和有趣的库


1. dataclasses

python3.7引入的内置库,实现数据类,可以利用上内置的类型提示

使用方法:

import dataclasses as dc

@dc.dataclass
class Person:
    name: str  # 简单说明类型
    age: int = 0  # 设置默认值
    sex: str = dc.field(default='male', repr=False) # 除了默认值,还可通过repr设置是否显示在字符串输出中

# 创建一个Person实例
p1 = Person('zhangyan', 25, 'female')
print(p1)  # Person(name='zhangyan', age=25, sex='female')

还可以通过asdict和astuple将其转换为dict和tuple类型:

print(dc.asdict(p1))  # {'name': 'zhangyan', 'age': 25, 'sex': 'female'}
print(dc.astuple(p1))  # ('zhangyan', 25, female)

dict类型转为dataclass

p2 = {'name': 'zhangyan', 'age': 25, 'sex': 'female'}
print(Person(**p2))  # Person(name='zhangyan', age=25, sex='female')

2. namedtuple

给元组命名,元组中的每一项也可以命名;
创建的元组实例内的值是不能更改的,但可以使用_replace()方法更改值后返回一个新的元组;
也可以当作一行代码定义一个类;
也可以当作数据类用,但是无法使用内置的类型提示,不如dataclasses。

使用方法:

from collections import namedtuple

Color = namedtuple('Color', 'r g b a', defaults=[1.0])  # 'r g b a'还可以写为'r, g, b, a'或['r', 'g', 'b', 'a']
red = Color(255, 0, 0)  # 红色
green = Color(0, 255, 0)  # 绿色
blue = Color(0, 0, 255)  # 蓝色
half_blue = Color(0, 0, 255, 0.5) # 透明度为50%的蓝色
print(half_blue)  # Color(r=0, g=0, b=255, a=0.5)
half_blue = half_blue._replace(g=233)
print(half_blue)
orange = Color._make([224, 142, 0, 1])  # 使用_make函数通过传入一个可迭代对象来构建实例,设置了默认值的项依旧不能省略
print(orange)
print(orange._asdict())  # OrderedDict([('r', 224), ('g', 142), ('b', 0), ('a', 1)])
print(tuple(orange))  # (224, 142, 0, 1)

3. threading

实现类似 JavaScript 中的 setimeout 延迟运行的效果

使用方法:

import threading

def settimeout(func, delay, *args, **kwargs):
    threading.Timer(delay, func, args, kwargs).start()

# 隔一秒输出一个 i,依次为 0 1 2 3 4
for i in range(5):
    settimeout(lambda x: print(x), i + 1, i)

# 隔一秒输出一个 i,依次为 4 4 4 4 4
for i in range(5):
    settimeout(lambda x: print(i), i + 1, i)

# 一秒后一起输出,依次为 44444
for i in range(5):
    settimeout(lambda x: print(i, end=''), 1, i)

# 一秒后一起输出,顺序随机,例如:43201、12340
for i in range(5):
    settimeout(lambda x: print(x, end=''), 1, i)

4. logging

实现日志功能,可以设置显示级别以及保存到日志文件

使用方法:

import logging

# 配置logging默认参数
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# 获取logger
logger = logging.getLogger(__name__)
# 设置logger级别,级别顺序:DEBUG -> INFO -> WARNING -> ERROR
logger.setLevel(level=logging.DEBUG)

# 获取保存日志文件的handler
handler = logging.FileHandler('log.txt')
# 设置handler级别
handler.setLevel(logging.INFO)
# 获取formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 给handler设置formatter
handler.setFormatter(formatter)
# 给logger添加handler
logger.addHandler(handler)

# 执行一些测试
logger.info('start print log')
logger.debug('do something')
logger.warning('something maybe fail')
logger.info('finish')

版权

本作品采用 CC BY-NC-ND 4.0 授权。