尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
有趣的Python代码:从一行回文到终端动画的编程乐趣
我笔记本里有个文件夹名字就叫这是一些有趣的代码。没有版本管理没有README甚至好几个文件连后缀都是乱的但每次清理磁盘时我都舍不得删。因为翻一遍它就像翻自己的旧抽屉——有些代码写得蠢萌有些却让我想起来当年为什么会心一笑。今天把这个文件夹摊开挑几段最能代表有趣这个气质的代码聊聊它们背后的原理也聊聊我后来从这些不正经的代码里学到的东西。这些代码大多不解决什么宏大问题有的短到只有一行有的运行起来只是在终端里动一动但它们有一个共同特点第一次跑出来的时候你会忍不住哦一声。如果你平时也写代码想找点编程本身的乐子或者想在茶余饭后看点能动手玩的东西这篇应该合你胃口。1. 反直觉的代码越短越需要讲道理有趣代码里最不缺的就是短小精悍但反直觉的类型。这类代码往往让人先愣一下然后意识到背后藏着语言特性和计算机原理。我挑三个最有代表性的。1.1 一行回文判断def is_palindrome(s: str) - bool: return s s[::-1]先动手试试再讲道理。s[::-1]是Python切片操作的完整形态[start:stop:step]的简写当step为-1时序列就从末尾往开头逐步取值。所以abc[::-1]得到cba字符串反转后还等于原串那它必然是回文。这个写法我第一次看到时觉得是魔法后来理解了切片机制后就觉得很朴素。但要注意它的成本它会额外创建一个反转后的字符串时间和空间都是O(n)。对于绝大多数场景这个开销无所谓但如果要判断一个超长串可以换成双指针写法从两端向中间比不需要额外空间。def is_palindrome(s: str) - bool: left, right 0, len(s) - 1 while left right: if s[left] ! s[right]: return False left 1 right - 1 return True对比C语言里动不动就for (i 0, j len - 1; i j; i, j--)的写法Python一行搞定。这种一行代码的快乐本质上是语言抽象能力的直接体现。玩归玩搞清楚底层在干什么这行代码才不算白抄。1.2 0.1加0.2不等于0.3print(0.1 0.2) # 0.30000000000000004这个坑我从入门踩到带人入门几乎每批初学者都会在某一次if 0.1 0.2 0.3时卡住。原因很底层计算机用二进制浮点数表示小数而十进制的0.1在二进制里是无限循环小数就像十进制没法精确表示1/3一样只能近似存储。两个近似值相加误差自然就显露出来了。处理方案有很多我整理了一个表格对比方案代码示例适用场景误差范围比较abs((0.1 0.2) - 0.3) 1e-9常规数值判断简单直接Decimal精确计算Decimal(0.1) Decimal(0.2)金额等要求精确十进制的业务Fraction分数运算Fraction(1, 10) Fraction(2, 10)推导数学结论做精确演算Decimal字符串构造方式有个坑不能写Decimal(0.1)那样会先把浮点数算出来再转成Decimal误差已经固化了必须写Decimal(0.1)。这类代码有趣的点在于它不是写错而是很诚实地把IEEE 754标准的行为展示给你看。理解它之后你写金额系统时就会下意识避开浮点数。一个看起来像是bug的现象其实是最好的老师。1.3 用product生成组合六层循环变一行有时候写代码写得很累是累在循环嵌套上。比如想生成所有六位数字组合初学时会写六层循环for a in 0123456789: for b in 0123456789: for c in 0123456789: # 后面还有三层...这种代码能跑但它占用了你宝贵的屏幕空间和注意力。用itertools.product把它压成一行from itertools import product combinations [.join(p) for p in product(0123456789, repeat6)]product做的事情就是笛卡尔积它接收多个可迭代对象然后以元组形式穷举它们的组合。repeat6表示自己和自己做六次积。整个生成过程是惰性的也就是说它会一个个产出结果而不是一次性把一百万条数据全塞进内存。配合列表推导式代码简短、可读性强、性能也对得起人。这种代码在实际工作里的价值是凡是遇到多路嵌套遍历的场景比如生成测试数据、遍历参数组合做测试矩阵都可以考虑用product。代码看起来是炫技其实比多层循环更不容易漏掉边界组合。2. 会动的代码终端里那点视觉效果终端程序是有趣代码的重灾区。明明是个黑框框偏偏有人能整出动画来。原理不复杂但组合起来效果很唬人。2.1 \r实现进度条别用print刷屏新手做进度显示最常见的是for i in range(100): print(f{i}%)后果是终端被几百行数字淹没。我当年也这么干过同行一句你这是在刷屏还是在写进度条让我去翻了终端控制符的文档。正确做法是用\r回车符它把光标移回行首每次输出就会覆盖掉上一次的内容import time for i in range(101): bar # * (i // 2) print(f\r[{bar:50}] {i}%, end, flushTrue) time.sleep(0.05)这里有两个关键点。第一end不让print自动换行否则\r只回到行首但换行符会把光标带到下一行效果就没了。第二flushTrue强制把缓冲区内容立即写到终端否则程序可能攒着一批输出一次性打印看不到动画过程。如果你在终端里跑这个脚本能看到[#####...]从左往右滚动。加上\r之后同一行的空间被反复利用视觉上就是原地生长。这种技巧在做命令行工具时很实用像下载进度、批量处理计数都能用它保持终端清爽。2.2 ANSI转义码给终端文本上色进度条看久了会想要点颜色。终端里上色不是靠什么高级UI框架就是往输出里塞转义序列。比如print(\033[31m这是红色\033[0m) print(\033[32m这是绿色\033[0m)\033[31m表示从当前位置开始用红色\033[0m表示恢复默认颜色。常见的颜色码表格大致是颜色前景色码黑30红31绿32黄33蓝34紫35青36白37知道这个原理就能整活了。比如写个彩虹字生成器遍历字符串的每个字符轮流换色号最后统一恢复默认色。def rainbow(text: str): colors [31, 33, 32, 36, 34, 35] out .join(f\033[{colors[i % len(colors)]}m{c} for i, c in enumerate(text)) print(out \033[0m) rainbow(这是一些有趣的代码)跑起来之后每个字颜色都不一样终端瞬间变得花里胡哨。这算是所有CLI美化工具的地基现在各种命令行工具还展示彩色输出底层用的都是同一套转义序列。区别只是封装得好不好看。2.3 文本版Sierpinski三角数学长在代码里还有一类代码效果不靠颜色靠的是纯字符排布出来的几何美感。比如用帕斯卡三角形的奇偶性生成Sierpinski三角n 16 for i in range(n): print( * (n - i), end) for j in range(i 1): print(* if (i j) 0 else , end ) print()原理不复杂帕斯卡三角形第i行第j列的值等于组合数C(i, j)当且仅当(i j) 0时它是奇数。奇数打星号偶数打空格生成的图案就是一个个嵌套的三角形。真正执行起来n16的输出已经很壮观了。而这一切只用了一个位运算判断。这个代码我每次翻到都会盯着看一会儿。它展示了一个很迷人的事实数学上的一个恒等式落到代码里居然能被画出来。这种代码不需要引入任何图形库只在终端里用空格和星号就能做出分形效果适合作为代码可以是艺术这句说法的证据。3. 把代码写成段子注释、命名与那些彩蛋有些有趣的代码运行时没有任何输出但人读到源代码那一刻就开始笑了。这类代码考验的不是算法是表达方式。3.1 注释小剧场写给下一位维护者的话我见过一个注释写得像微型小说一样的代码片段开头是一段注释对话# 为什么这里要用魔法数字 42 # 因为 41 的效果我们已经试过了不行。 # 44 呢44 也想试试但 42 已经打败它了。这种注释在正经项目里会被当成废话但在个人有趣代码库里它就是宝藏。我自己的文件夹里也有一段# 该函数理论上永远不会被调用。 # 如果它被调用了请你先检查一下上面那个调用的条件。 # 如果条件没问题那问题在更上游。 # 如果更上游也没问题那说明本次发布的测试环境是测试环境。玩笑归玩笑这种写法有个实际作用它能把这个函数为什么还留着这个复杂背景用极低的阅读成本传递给后人。相比长篇大论的解释带点情绪的注释反而更容易让人记住。3.2 能运行的套娃自打印程序Python生态里有个经典彩蛋叫Quine指一类打印自身源代码的程序。最短的版本之一长这样s s {!r}; print(s.format(s)) print(s.format(s))解释一下{!r}它是格式化操作里的repr标志会把字符串带上引号原样插入。第一行里s的内容包含两个部分一个模板和一个print语句。s.format(s)把s自身的repr形式填进模板打印出来的内容恰好就是第一行和第二行的完整内容于是程序把自己完整打印了一份。第一次看懂这段代码的人十个有九个会愣一下然后开始手动验证。这种代码在日常开发里用不上但它极其适合用来练格式化字符串和自我指涉这两件事。想进阶的还可以去挑战用才几行的Python写出带循环和条件的Quine。3.3 标准库自带的隐藏彩蛋Python的标准库里确实埋着一些开发者自己放的彩蛋。最著名的是这两个import this运行之后会输出《Python之禅》全文一整套设计哲学其中可读性计数优美胜过丑陋这些话写代码的人读一遍会有点共鸣。import antigravity运行之后它会直接打开浏览器跳到一个漫画页面讲的是Python无处不在的梗。这两个彩蛋严格意义上不产生有用的输出但它们的存在让标准库有了人味儿。我教别人Python时讲到标准库这一节总会顺手跑一下课堂气氛瞬间就会轻松不少。4. 小玩意大用处那些不太正经但能解决实际问题的小工具有趣代码也不全是花架子。有一部分是因为太滑稽才显得有趣但真用起来还真能解决具体问题。4.1 今天吃什么从决策困难中拯救我程序员午休时间的永恒难题是吃什么。后来我写了个脚本import random menu [楼下麻辣烫, 街角兰州拉面, 外卖轻食, 公司食堂, 便利店的饭团, 泡面加蛋] def decide(): choice random.choice(menu) print(f今天吃{choice}) if __name__ __main__: decide()这是最没有技术含量的代码但它用随机选择强制终结了纠结本质上是把做决定这件事外包给随机数生成器。后来我给它加过权重weights [1, 3, 1, 2, 1, 1] choice random.choices(menu, weightsweights, k1)[0]有几次手气不好抽到泡面我就会把泡面的权重调低。这个脚本后来被我同事拿过去改成今天谁请客版实际效果是谁跑脚本谁请客大家反而乐此不疲。这种小工具类代码的有趣点在于它解决的不是技术难题是生活难题。代码写得烂不烂根本不重要能跑、能随机、能带点小偏好就已经完成使命了。4.2 生日悖论模拟直觉靠不住另一个能让人哦一声的小工具是生日悖论模拟器。问题本身很朴素一个房间里有多少人时至少有两个人生日相同的概率超过50%直觉上感觉要一百多人实际答案是23人。我用蒙特卡洛方式验证了一下import random def has_duplicate(n): birthdays [random.randint(1, 365) for _ in range(n)] return len(birthdays) ! len(set(birthdays)) trials 10000 for n in [23, 30, 50]: cnt sum(has_duplicate(n) for _ in range(trials)) print(f{n} 人时至少两人生日相同的概率约 {cnt / trials:.2%})在我的机器上跑出来的结果大概是23人时概率约50.7%50人时已经超过97%。它有趣的地方在于仅仅三次随机模拟就验证了一个反直觉的数学结论整个过程不需要查表不需要公式推导只用最朴素的方法——随机生成生日然后看有没有重复。这类代码对思维的塑造很有帮助。它让我养成一个习惯遇到直觉上不可能的概率问题先写一小段模拟代码跑一下往往会有惊喜。某种程度上写模拟比翻概率论教材快得多。4.3 让电脑演奏《小星星》最后是一个我在Windows上试过的玩法用系统扬声器播放简单旋律。Python的winsound模块提供了最原始的Beep接口能指定频率和时长import time import winsound notes { C4: 262, D4: 294, E4: 330, F4: 349, G4: 392, A4: 440, B4: 494 } melody [ (C4, 0.5), (C4, 0.5), (G4, 0.5), (G4, 0.5), (A4, 0.5), (A4, 0.5), (G4, 1), ] for note, beat in melody: winsound.Beep(notes[note], int(beat * 800)) time.sleep(beat * 0.1)跑起来电脑会用单调的蜂鸣声演奏一段《小星星》的开头。虽然音色和乐器不沾边但这套音符字符串 频率映射 节拍列表的思路是可以直接扩展成完整谱子的。把melody换成其它曲目的数据就能让电脑演奏更多旋律。这个脚本适合拿来理解频率和音符的关系四四拍里每个音符对应一个频率时间轴由sleep控制。它不算啥工程实践但作为用代码做一件完全没用的浪漫小事的代表在这个文件夹里地位很高。5. 从有趣到有用这些代码教会我的几件事翻完这个文件夹我意识到有趣的代码和有用的代码之间并不是对立的。很多有趣的片段抽掉表面的搞笑和花哨之后留下的是对语言特性更深的理解。5.1 有趣的本质往往是视角切换回文判断一行能写完是因为切片反转组合生成一行能写完是因为标准库提供了笛卡尔积终端图案能做出来是因为把数学恒等式转成了位运算。每一段有趣的背后都是一个之前没接触过的视角原来还能这么写原来这个API还能这么用原来这俩概念是同一回事。所以我在收集这些代码时真正收集的不是代码本身是某一种写法对应的思考方式。当工作中遇到类似问题这些视角会在需要的时候冒出来。比如后来我写日志输出的格式化工具就用了ANSI转义码写测试数据的生成器就用了product。当初觉得只是好玩的代码后来都回馈到了实用场景。5.2 给自己的代码手账留个位置整理这个文件夹让我养成了一个习惯遇到有趣的小片段不管多短随手存下来并补一段注释说明为什么觉得它有趣。这个注释非常重要否则三个月后回看你可能根本想不起当初被哪一点击中过。我的保存格式很简单一个文件一个主题文件名起得口语化一点比如一行回文.py、彩虹终端.py、生日悖论模拟.py。代码里第一段注释写当时为什么觉得有趣第二段写它是怎么工作的。这些东西不需要进正式项目的代码库就放在个人目录里想复盘就翻一翻用碎片时间积累下来的都是很珍贵的思维痕迹。5.3 分清游乐场和生产线最后我想强调一点有趣的代码和生产环境的代码两者对标准的要求完全不同。生产环境讲可维护性、可读性、稳定性一行炫技取代六层循环有时候没问题但前提是团队里每个人都理解那行代码在干什么。如果把我这份代码写得别人看不懂才厉害当成目标那就是搞错了场景。我自己的原则是游乐场代码怎么自由怎么来怎么好笑怎么来一旦要进正式仓库先把那些花活拆掉换成每个人都认识的最朴素的写法。但反过来那些有趣的视角不应该被丢掉——它们可以沉淀成注释、设计说明或者成为下一次技术分享的话题。我后来建了一个新文件夹叫这是另一些有趣的代码。坦白讲我已经开始存第二份了。写代码这件事保持一点找乐子的心态能让你在工作里苦哈哈地搬砖之余还记得当初为什么觉得编程有趣。有兴趣的读者可以从这个文件夹里随便挑几个例子跑一跑改一改再想一想它们为什么能跑说不定你的第一个有趣代码就这么诞生了。
RELATED

相关推荐

Vue 是一个渐进式 JavaScript 前端框架,擅长构建响应式单页应用

Vue 是一个渐进式 JavaScript 前端框架,擅长构建响应式单页应用

Vue 作为一款渐进式 JavaScript 前端框架,专注于构建响应式单页应用;Python 则常以 Flask、FastAPI、Django 等框架提供后端服务。二者通常通过 RESTful API 或 WebSocket 通信,形成“前端负责交互与展示、后端负责数据与业务逻辑”的前后端分…

📅 2026/10/16 8:27:16
逻辑回归在信贷风控中的应用:从违约预测到评分卡实践

逻辑回归在信贷风控中的应用:从违约预测到评分卡实践

一个客户在APP上提交了借款申请,系统要在几秒内决定批不批、批多少、利率怎么定。你可能会以为背后跑着的是某个深度学习模型,但实际上,大多数信贷机构真正跑在评分决策流里的,还是那个看起来有点“过时”的逻辑回归。我在做个人贷…

📅 2026/10/16 8:27:16
Gated DeltaNet:融合Delta Rule与Gating的线性注意力机制解析与PyTorch实现

Gated DeltaNet:融合Delta Rule与Gating的线性注意力机制解析与PyTorch实现

最近在调研长文本建模方案时,Gated DeltaNet 这个名字反复出现在我的视野里。它总是和 Delta Rule、Gating 绑在一起讨论,还被不少技术社区的人是下一代开源大模型可能采用的核心机制,标题里的 Qwen 3.5 相关猜测就是在这种背景下冒出来的。先…

📅 2026/10/16 8:27:16
MORE NEWS

更多资讯

📰

用 PreferenceFragment 构建分组设置界面:解读 cw-omnibus 中的 FragmentsBC 示例

示例工程教程 【免费下载链接】cw-omnibus Source code to omnibus edition of _The Busy Coders Guide to Android Development_ 项目地址: https://gitcode.com/gh_mirrors/cw/cw-omnibus 点击查看 免费下载 本篇技术指南以 cw-omnibus 仓库(The Busy…

📰

KBEngine 嵌入式 Python 整数对象 C API(PyLong)权威指南

游戏开发后端 【免费下载链接】kbengine A MMOG engine of server. 项目地址: https://gitcode.com/gh_mirrors/kb/kbengine 点击查看 免费下载 本指南以 KBEngine 仓库内嵌的 CPython 3.7.3 官方文档 kbe/src/lib/python/Doc/c-api/long.rst 为骨架,逐…

📰

STM32F103_串口通信

STM32F103C8T6 串口通信:轮询 / 中断 / DMA 三种方式,附 Keil 逻辑分析仪测波特率这次做的实验是 STM32 串口(USART)。要求挺全:先用 HAL 库实现最基本的串口收发,再把轮询、中断、DMA 三种方式都过一遍&am…

📰

【附源码】基于SpringBoot的在线骑行网站(源码+数据库+论文+答辩ppt一整套齐全)java开发springboot+vue框架javaweb,可做计算机毕业设计或课程设计

🙊作者简介:多年一线开发工作经验,分享技术代码帮助学生学习。自有计算机毕设的工作室团队,专注计算机毕设开发、定制、远程、文档编写指导等。 🍅 查看主页更多项目 | 计算机毕设工作室 🍅 🍅 …

📰

二分查找进阶:深入理解lower_bound与upper_bound的边界与使用技巧

1. 为什么二分查找不是"找到就停":需求先行的两个变种很多人第一次接触二分查找,学的是"在有序数组里找一个目标值,找到了返回下标,找不到返回-1"。这个版本没有错,但它只覆盖了二分查找最基础的一…

📰

基于MATLAB的多特征融合火灾检测系统GUI实现

控制室里的监控画面往往是最枯燥的,但一旦画面里出现不该有的红色,谁都不敢大意。之前给某个厂区做安防监控需求评估时,对方问能不能用现有摄像头自动识别早期火情,不需要换硬件,最好快速出一版可演示的原型。当时我第…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬