再梳理一遍 Python 系列知识点,夯实基础,无他,唯手熟尔

Python 系列总结都是我自己平时的学习笔记,如果有不正确的地方,希望各位佬儿哥指正纠偏🤗

浮点数精度问题

print(0.1+0.2)
----------------------
0.30000000000000004

可以使用 decimal 模块解决浮点数精度问题:

from decimal import Decimal
print(Decimal('0.1') + Decimal('0.2'))

print(type(Decimal('0.1') + Decimal('0.2')))
print(type(Decimal('0.1')))
---------------------------------------------------------
0.3
<class 'decimal.Decimal'>
<class 'decimal.Decimal'>

注意:在使用 Decimal 时要用字符串来表示数字

布尔值其实也是数字

def sum_even(numbers: list[int]):
    """
    返回numbers中偶数的个数
    :param numbers: 整数列表
    """
    return sum(i % 2 == 0 for i in numbers)

不常用但特别好用的字符串方法

s = 'TomAndMarry'
s2 = s.partition('And')
print(s2)
--------------------------------
('Tom ', 'And', ' Marry')
s = '明明是中文,却使用了英文标点.'
table = s.maketrans(',.', ',。')
s2 = s.translate(table)
print(s2)
-----------------------------------------------
明明是中文却使用了英文标点

使用枚举类型来替代字面量

# 用户每日奖励积分数量
DAILY_POINTS_REWARDS = 100
# VIP用户额外奖励20
VIP_EXTRA_POINTS = 20

from enum import Enum

class UserType(int, Enum):
    # VIP用户
    VIP = 3
    # 小黑屋用户
    BANNED = 13

def add_daily_points(user):
    """用户每天第一次登录增加积分"""
    if user.type == UserType.BANNED:
        return
    if user.type == UserType.VIP:
        user.points += DAILY_POINTS_REWARDS + VIP_EXTRA_POINTS
        return
    user.points += DAILY_POINTS_REWARDS
    return

生成器

fruits = {'apple','orange','pineapple'}

def batch(item):
    for _ in item:
        yield _

print(next(batch(fruits)))
print(next(batch(fruits)))
print(next(batch(fruits)))
---------------------------------------
apple
apple
apple

因为每次调用生成器函数都会生成一个新的生成器对象,所以以上程序运行结果会输出三个 apple

fruits = {'apple','orange','pineapple'}

def batch(item):
    for _ in item:
        yield _

g = batch(fruits)

print(next(g))
print(next(g))
print(next(g))
-------------------------------------------------
pineapple
apple
orange

以上代码再次验证了'每次调用生成器函数都会生成一个新的生成器对象'结论

def batch_process(item):
    result = []
    for i in item:
        # process_item = ..处理item
        result.append(process_item)
    return result

# 以上方法会有一个问题,当item过大时,会导致函数执行很耗时,并且若调用方想在某个process_item达到条件时中断,以上方法也是做不到的。所以可以使用生成器函数替代。

def batch_process_2(item):
    for i in item:
        # process_item = ..处理item
        yield process_item

# 调用方
for processed_item in batch_process_2(items):
    # 如果某个处理对象过期了,就中断当前的所有处理
    if processed_item.has_expired():
        break

面向对象编程

内置类方法装饰器

class FilePath:
    @property
    def basename(self):
        ....
    @property.setter
    def basename(self, name):
        ....
    @property.deleter
    def basename(self):
        ....

经过@property的装饰以后,basename 已经从一个普通的方法变成了 property 对象,所以可以使用 basename.setter 和 basename.deleter 方法;
定义 setter 方法,该方法会在对属性赋值是被调用;
定义 deleter 方法,该方法会在删除属性时被调用;

鸭子类型及其局限性

抽象类

多重继承于 MRO

学习建议

对于 Python 入门及进阶,我推荐两本我认为值得多次阅读的书籍:
《Python 编程从入门到实践(第二版)》- 第一部分为基础语法部分,建议刚接触 Python 的同学多次阅读并实践,夯实基础利器!
《Python 工匠》- 整本无尿点,强烈建议多次阅读并实践,是 Python 进阶的不二之选!

测试基础-Python 篇 琐碎但十分实用的知识点


↙↙↙阅读原文可查看相关链接,并与作者交流