- 博客(298)
- 收藏
- 关注
原创 科普:Python 中颜色的格式: RGB 格式 v.s. RGBA 格式
在实际开发中,若需处理透明效果(如游戏中的粒子、图像水印、渐变叠加),优先使用 RGBA;若仅需纯色且不透明,用 RGB 更简洁。
2025-08-21 23:24:33
565
原创 python中的单下划线“_”与双下划线“__”的使用场景及“左右双下划线”(魔术方法:`__xxx__`)
1. 单下划线:遵循“内部成员”约定,提醒自己和他人不要随意外部访问,但不阻止访问。 2. 双下划线:仅在需要“防止子类覆盖父类关键成员”时使用,避免过度使用(会降低代码可读性)。 3. 魔术方法:仅使用Python内置的`__xxx__`方法,不自定义类似格式的方法(如`__myfunc__`)。
2025-08-19 20:42:28
845
原创 Pygame中,精灵Sprite与精灵组Group,显性入组与隐性入组,它们之间的关系是什么?
显性添加精灵到组中—— 开发者明确控制精灵与组的关联关系。这种方式是最基础、最常用的,核心优势在于灵活性和可控性。隐式添加精灵到组的方法,其核心原理是利用了pygame.sprite.Sprite基类的构造函数(__init__)特性:当创建精灵时,可直接将组作为参数传入,精灵会自动加入这些组,无需再显式调用group.add()。
2025-08-19 16:03:28
894
原创 python泛型类Generic[TypeVar(“T“)]
python泛型类Generic[TypeVar("T")]:`Generic` 与 `TypeVar("T")` 是实现**泛型编程**的核心工具,用于在不指定具体类型的情况下定义类、函数或数据结构,从而提高代码的复用性和灵活性。- **类型检查依赖工具**:Python 解释器运行时不检查泛型类型,需通过 `mypy` 等工具进行静态类型检查。- **命名规范**:类型变量通常用单个大写字母表示(如 `T`、`U`、`V`),多个变量可区分用途(如 `T` 表示输入类型,`U` 表示输出类型)。
2025-08-18 16:26:53
971
原创 Pygame 中,`pg.display.update(dirty)` v.s. `pg.display.flip()`
`pg.display.update(dirty)` 和 `pg.display.flip()` 是 Pygame 中用于**更新屏幕显示**的两个核心函数,它们的底层机制和适用场景有显著区别,选择正确的函数能直接影响游戏性能。
2025-08-16 06:53:21
537
原创 为什么游戏会出现“卡顿”:`clock.tick()` v.s. `clock.get_fps()`
为什么游戏会出现“卡顿”——当实际帧率远低于目标帧率时,画面更新变慢,不能满足视觉对动画速度的要求,你就感觉到“卡顿”。此时需要优化代码(如减少精灵、简化绘制)来降低每帧成本,让实际帧率接近目标值。
2025-08-15 22:34:09
644
原创 科普:Pygame 中,`pg.Surface` v.s. `screen`
- `Surface`(草稿纸): 草稿纸是“透明的”,即草稿纸“贴到”另一草稿纸上时,仅考虑图片的叠放。 - `Surface`(草稿纸)只在内存中处理,即使你在上面画了内容,不贴到 `screen` 上也看不到。- `screen` 是特殊 `Surface`(展示墙):需要显示的内容都要通过这里“贴”的方式, 贴到 `screen` 上。 - 只有贴到 `screen` 上的内容,经过 `pg.display.flip()` 刷新后,才能显示在窗口中被你看到。
2025-08-15 21:44:27
747
原创 科普:Pygame 中的`pg.mixer.Sound` vs `pg.mixer.music` 的区别是什么?
pygame中,所有音频播放默认是非阻塞的(`play()` 调用后立即返回,不等待播放完成),确保游戏主循环不卡顿(核心特性)。
2025-08-15 15:31:34
885
原创 科普:Pygame 中射击速度控制
**检查频率相对于你手的动作而言,无论你按键动作多快,都能被主循环非常及时地捕捉到,所以,你可以视为它“一直在检查”空格键的状态。** 因此,示例中射击速度取决于你敲击空格键的速度。
2025-08-15 12:28:20
935
原创 科普:Pygame中的显示屏,`SCREENRECT.size` 与 `pg.FULLSCREEN`
在 Pygame 中,与显示大小相关的描述量(属性、函数、常量等)有很多,它们分别用于获取、设置或判断显示窗口/屏幕的尺寸、分辨率、适配模式等。例如:`SCREENRECT.size`(逻辑分辨率)和 `pg.FULLSCREEN`(全屏标志),以及其它。
2025-08-15 09:28:51
1001
原创 pygame的帧处理中,涉及键盘的有`pg.event.get()`与`pg.key.get_pressed()` ,二者有什么区别与联系?
- `pg.event.get()` 中的键盘事件(`KEYDOWN`/`KEYUP`):处理**按键动作的瞬间**,适合单次操作; - `pg.key.get_pressed()`:获取**按键的当前状态**,适合持续操作。 两者机制不同,但**在游戏的帧循环中同时使用**(如上例),是 Pygame 中处理键盘交互的核心工具。
2025-08-14 23:21:23
763
原创 科普:python中,你的工作目录中不是是多了个`__pycache__`文件夹?
`__pycache__` 文件夹是 Python 自动生成的,用于存储编译后的 `.pyc` 文件,而`.pyc` 是 Python 为了提高执行效率而生成的“中间编译产物”,是源代码和机器码之间的过渡形态。
2025-08-14 15:16:05
639
原创 Python中,`all_sprites: List[pg.sprite.Sprite] = []`与 `all_sprites = pg.sprite.Group()` 等价么?
`List[pg.sprite.Sprite] = []` 只是一个**普通的精灵存储容器**,需要手动实现所有管理逻辑(更新、绘制、碰撞等);而 `pg.sprite.Group()` 是 Pygame 为精灵管理设计的**专用工具**,内置了高效的批量操作方法,能极大简化游戏开发流程。 在 Pygame 中,几乎所有场景都推荐使用 `Group` 而非列表管理精灵——这正是 `Group` 类存在的意义。
2025-08-13 23:05:33
469
原创 科普:Pygame 中的坐标系
- Pygame 中 x 轴和 y 轴的**逻辑单位(像素)长度相等**,绘制正方形(宽高相等)和圆(指定半径)时,逻辑上是标准图形。 - 实际显示是否“正”,取决于屏幕硬件的像素是否为正方形(现代设备几乎都是正方形像素),与 Pygame 无关。 因此,在开发中只需按逻辑像素绘制即可,无需额外处理坐标系单位差异。
2025-08-13 17:54:53
542
原创 在 Pygame 中,精灵的形状并不是矩形,为何当rect来处理?
游戏中最常见的需求之一是“碰撞检测”(如角色碰到敌人、子弹击中目标)。如果直接基于精灵的真实形状(如像素级精确碰撞),计算会非常复杂: - 不规则形状需要逐像素比对或复杂的几何运算(如多边形相交检测); - 实时游戏中,频繁的高精度碰撞计算会严重消耗性能(尤其是大量精灵同时存在时)。 而 `Rect` 实现的“矩形碰撞检测”(Axis-Aligned Bounding Box,AABB)是一种低成本的近似方案
2025-08-13 15:42:40
758
原创 Pygame 中,`pygame.Rect`的参数及其衍生属性
`pygame.Rect` 除了最基础的 `x`(左边缘x坐标)、`y`(上边缘y坐标)、`width`(宽度)、`height`(高度)这四个核心参数外,还封装了一系列**衍生属性**(或称**便捷属性**),用于直接访问矩形的边缘、中心等位置。这些属性会根据核心参数自动计算,并且**支持直接赋值修改**(修改后会反向更新核心参数)。
2025-08-13 15:29:17
675
原创 游戏中角色持枪:玩家操控角色,角色转向时枪也要转向
面向多方向时,核心是用 **(dx, dy) 方向向量** 替代单一的 `facing` 值,通过向量分量分别控制水平和垂直偏移,再结合角色中心坐标计算武器位置。这种方式可以灵活支持任意方向(包括8向、16向等),是2D游戏中处理多方向朝向的常用逻辑。
2025-08-12 22:48:16
792
原创 科普:增强细节真实感的“微弹跳”
1像素的“微弹跳”在游戏中通常不是为了让玩家“明确看到弹跳”,而是为了**增强细节真实感**: 例如,模拟物体在粗糙表面移动时的轻微颠簸(如汽车行驶在非平整路面)、或角色行走时的细微重心起伏。它更像一种“潜意识层面的细节补充”,让动画显得更自然,而非明显的“弹跳动作”。如果需要更明显的弹跳(如球的上下反弹),通常需要结合速度、重力等物理逻辑。
2025-08-12 22:01:24
563
原创 科普:python中的“__init__.py”与“import”的关系
当Python解释器遇到一个目录时,会检查该目录下是否存在`__init__.py`文件。如果存在,就会将这个目录识别为一个**Python包**(而非普通文件夹),允许通过`import`语句导入其中的模块或子包。`__all__` 是一个特殊的列表变量(通常定义在包的 `__init__.py` 文件中),它的核心作用是明确指定当使用 `from package import *` 语句时,哪些模块、函数或类会被导入到当前作用域
2025-08-12 20:37:07
340
原创 python中,通过“类变量”实现“实例的自动注册”
Pygame的“Sprite自动注册机制”本质是**通过`Sprite`子类与`Group`的配合,在实例化时自动加入管理组,实现批量更新、绘制和碰撞检测**。其核心价值是简化多对象场景的代码逻辑,让开发者更专注于游戏逻辑而非对象管理,尤其适合中大型游戏中大量重复元素的处理。
2025-08-09 07:00:47
433
原创 科普:python -m pip install 与pip install 安装的区别
`python -m pip install numpy` 和 `pip install numpy` 本质上都是用于安装 `numpy` 库的命令,但它们的**调用方式和适用场景存在细微区别**,核心差异在于“如何定位并使用 `pip` 工具”。
2025-08-08 08:01:52
306
原创 科普:NumPy 中多维数组的切片操作
多维数组切片的核心是“按维度独立处理”,通过 `start:stop:step`、整数索引、`...` 等组合,可灵活提取任意子数组。掌握切片规则能极大提升处理高维数据(如图像、张量)的效率。
2025-08-08 07:03:32
291
原创 科普:游戏编程中图像的“颜色深度”“深度”和“景深”
在图像编程中,“颜色深度”“深度”和“景深”是三个完全不同的概念,分别对应图像的**颜色信息精度**、**三维空间距离**和**光学聚焦效果**,在编程处理中关注的维度和应用场景也截然不同。颜色深度是计算机图形中表示颜色精度的基本参数,它决定了每个像素可以显示的颜色数量。从早期的1位黑白到现代的32位真彩色+透明度,颜色深度的提升使得数字图像能够越来越准确地还原真实世界的色彩。在实际应用中,需要在图像质量、存储空间和性能之间找到平衡。
2025-08-08 06:56:56
422
原创 科普:PSI属于散度家族
最近发现一件很有趣的知识:PSI属于散度家族,其核心原理是通过分箱后的KL散度衡量两个分布的差异,是散度理论在变量分布稳定性分析中的具体应用。它利用对数差异和加权求和,量化实际分布与预期分布的漂移程度,是模型监控中检测数据分布变化的重要工具。
2025-04-15 09:57:13
1064
原创 科普:想想神经网络是参数模型还是非参数模型
多层感知机(Multilayer Perceptron, MLP)被归类为**非参数模型**(或更准确地说,**半参数模型**或**灵活参数模型**),这一分类的核心在于统计学习中对“参数模型”和“非参数模型”的定义差异,而非简单取决于是否存在可学习的权重参数。
2025-04-15 06:59:40
904
原创 科普:如何通过ROC曲线,确定二分类的“理论阈值”
在二分类问题中,已知预测概率(如逻辑回归、神经网络输出的概率值)时,阈值的选择直接影响分类结果(正/负样本判定)。到甲方做POC时,作为外部的技术人员并不懂它的业务,这时需要先从理论上给出阈值。ROC曲线上**切线与对角线(斜率1)平行的点**,是**约登指数最大的点**,也是几何上离对角线最远的“拐点”(切点)。
2025-04-14 22:56:32
1072
原创 科普:数据存储“key - value”与“key - key - value”
在实际应用中,选择使用“key - value”还是“key - key - value”存储方式,需根据数据结构特点、查询需求、系统性能要求等多方面因素综合考虑
2025-04-12 07:15:30
555
原创 科普:关系图谱中的网络特征如何输入到模型中?
关系网络特征是以图的方式表达,而模型算法的输入是变量表达(离散的或连续的),那么,图谱表达的方式是否要转化为特征向量才能作为模型算法的输入?那又如何转化?将关系网络(图谱)转化为模型算法可处理的输入(如特征向量)通常是必要的,因为大多数传统机器学习模型(如线性回归、神经网络)无法直接处理图结构数据。
2025-04-11 10:26:33
991
原创 科普:“特征向量”是数学中的向量么?
机器学习中的特征向量也是由一组有序的数值组成,例如在一个预测某个人是否会购买某商品的模型中,特征向量可能是[年龄, 收入, 消费频率]等有序的数值组合,每个元素代表了被描述对象的一个特征,这与数学中用向量表示一个点或一个物理量等在本质上是一致的,都是通过一组有序数值来进行量化表示。但向量空间并不强制要求坐标轴为正交,只要满足向量空间的八条公理(包括加法交换律、加法结合律、存在零向量、存在负向量、数乘结合律、数乘分配律等),就可以定义为向量空间,坐标轴可以是任意线性无关的向量组。
2025-04-08 21:40:15
647
原创 科普:原始数据是特征向量么?
**原始数据不是特征向量**,需通过特征工程(清洗、转换、提取)生成模型可输入的数值型特征向量。 **特征维度无需强制正交**,仅在线性模型或降维场景下需要考虑正交性;对于LightGBM等树模型,特征相关性不影响模型效果,重点在于特征的预测能力,而非数学正交性。
2025-04-08 21:16:20
777
原创 大模型LLM:谎言重复一千遍就是真理
在大模型训练中,训练数据中重复出现错误或偏见信息,导致模型生成时倾向于这些内容。在大模型训练语境下,“谎言重复一千遍就是真理”这句话可从**数据分布、统计学习机制、认知偏差映射**三个维度理解,本质上反映了训练数据特性对模型输出的决定性影响
2025-04-08 08:50:21
868
原创 科普:GRU、LSTM及RNN
GRU(门控循环单元)、LSTM(长短期记忆网络)、RNN(循环神经网络)均为处理序列数据的神经网络模型,它们之间存在着紧密的联系与明显的差异。
2025-04-07 21:47:22
1365
原创 科普:GBDT与XGBoost比较
XGBoost是GBDT的“工程化增强版”,在保持Boosting核心思想的同时,通过数学优化(二阶导数、正则化)和工程优化(并行化、分布式)大幅提升了模型的效率和效果,成为当前结构化数据建模的首选工具。GBDT则作为基础算法,适合学习Boosting原理或小规模场景快速验证。实际应用中,XGBoost凭借其全面优势,已在绝大多数场景中取代传统GBDT。
2025-04-07 21:22:19
719
原创 科普:One-Class SVM和SVDD
SVM(支持向量机)算法是用于解决二分类问题的,它在样本空间(高维空间)中找一个最优超平面,使得两类数据点中离超平面最近的点(称为支持向量)到超平面的距离最大。对于极少数“坏样本”的二分类场景,我们可以换个思路:将所有样本视为一类(而不是二类),而将极少数“坏样本”视为这一类的异常。这样,用于二分类的SVM就可以改造为用于一分类的One-Class SVM和SVDD。
2025-04-03 07:53:12
1124
原创 科普:此“特征”非彼“特征”
机器学习中的特征工程是提升模型性能的关键环节,根据特征的生成方式和复杂度,可将其分为以下三个层次:从初级到高级,包括原始特征、业务公式生成的特征,以及算法生成的特征。
2025-03-26 22:19:40
583
原创 科普:特征、规则、模型,及Lift(提升度)
*Lift**可评估规则和模型的效果,也可用于特征的分箱:通过特征分箱并计算每箱的Lift值,是一种常用的特征评价和筛选方法。
2025-03-26 21:32:29
1125
原创 科普:评估特征对结果的贡献:SHAP值和IV值
SHAP(Shapley Additive exPlanations)和IV值(Information Value,信息价值)都是机器学习中用于评估特征对结果贡献的指标,但它们在原理、特点和应用场景等方面存在一些区别
2025-03-17 19:19:53
1612
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人