Python 固定容量堆:heapreplace 总会换入新值,为什么可能把前三名越换越小 数据不断进入,只想保留最大的三个数,可以用小顶堆把当前门槛放在堆顶。但如果每来一条就直接heapreplace,低于门槛的新值也会被放进去,原本应该留下的高值反而出局。容量保持三,并不代表内容仍是前三名。下面先让两个... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python redirect_stdout 的作用范围:已经捕获输出,为什么保存过的流仍写到原处 为了测试一个旧函数的打印内容,外面包上redirect_stdout,仍有几行跑到了原来的位置。常见原因是某段代码提前保存了流对象,后来通过print的file参数直接写它。重定向没有追踪所有输出对象,只在作用期间替... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python yield from 的返回值:子生成器写了 return,为什么 list 里没有这份汇总 批处理生成器逐条yield记录,最后return一份计数与总和。调用者转成list后只看到记录,便以为汇总被丢了。实际上return结束生成器,并把完成值放进结束信号;普通迭代消费的项目和完成时的返回值并不是同一条通... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python 数字字符判断:isdigit 已经通过,为什么 int 仍然不接受上标二 数量输入先通过 isdigit,再交给 int,上标二却在第二步报错。原因是“字符属于数字类别”和“整个字符串符合整数语法”回答不同问题。Unicode 还收录了分数、上标以及多种文字系统里的数字,三个常见判断方法的... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python 三种余数:同样是七除以四,remainder 为什么会给出负一 周期位置、相位差和循环索引都可能需要余数,但 Python 的百分号、math.fmod 和 math.remainder 并不承诺同一个结果。七除以四,前两者可以得到三,remainder 却得到负一;差异首先来自... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python except as 的名称清理:异常处理结束,为什么原来同名的变量也不见了 脚本先给 error 赋了一个默认说明,随后又写 except ValueError as error。异常在处理块里打印正常,离开后再次访问却抛出 UnboundLocalError。这里不是异常还没被捕获,而是处... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python match 的裸名称:常量已经定义,为什么 case 仍把任意输入都接住 把状态路由从 if 改成 match 时,程序员常把 READY = "ready" 放在函数里,然后写 case READY。看起来是在引用已有常量,实际却会把收到的值绑定给 READY。就算输入是 "broken... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python super 的查找顺序:明明写在左边父类里,为什么下一步会进入兄弟类 维护两个组合功能的父类时,常见写法是在各自的方法里调用 super。单独测试 Left,下一步进入 Root;把 Left 和 Right 组合成 Joint 后,同一行代码却先进入 Right。如果把 super ... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python ISO 周编号年份:日期还是十二月,为什么已经属于下一年的第一周 周报用日期的 year 加上 isocalendar 得到的周号作为分组键,到了年末突然把同一周拆开。2024年12月30日的公历年份是2024,它的ISO周编号年份却是2025。把两套年份与周号混拼,得到的标签可能... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python asyncio.wait 超时:等待已经返回,为什么任务稍后仍然完成了 后台任务被交给 asyncio.wait,并设置等待超时。调用方已经拿到返回值,过一会儿却发现任务仍更新了结果。wait 的超时结束的是这一次等待,不会自动取消尚未完成的任务,也不会因此抛出 TimeoutError... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读