
Python代码总写得又慢又容易出错,别东说念主改几行就跑通,你调半天还不知说念哪错了,这确实仅仅教常识题吗。

最近翻了十来个真确项缱绻代码,发现一个挺着实的事:老手和生手写的代码差得不远,但老手改起来快,别东说念主看也顺,不是因为他们多懂算法,而是他们用对了Python原来就有、但没东说念主教你若何用的那些小东西。比如一个`with`,一个`pathlib.Path`,或者一个`dataclass`,写上去不而已,但背面少踩约略坑。
我试过把一段读文献+处理+写回的代码拆成两版。旧版用`open`手动`close`,中间加点日记再出错,文献句柄就卡着;新版就一转`with open(...) as f:`,哪怕中间炸了,文献也自动关。这不是炫技,是Python我方说“这事我来兜底”,你非毋庸,硬写三行去管,铁心还漏了。
还有字符串拼接。往常民风`s += 'abc'`,看着顺,但真跑一万次轮回,速率班师掉三倍。换成`''.join(list)`,代码多敲两个字,但背后是Python提前算好内存大小,一次惩办。不是你变机灵了,是你终于听了文档的话。
{jz:field.toptypename/}`for-else`这个,被好多东说念主当“语法怪胎”。其实它就干一件事:当for没被`break`中断时,走else。比如找列内外第一个偶数,找到了就`break`,没找到才进else报错。写成`found = False; for...if...found=True; if not found:`,字多了还容易忘改flag。Python给了更直的路,你偏绕着走。
解包亦然。`a, *b, c = [1,2,3,4,5]`这种,不是为了装酷,是真能少写四五行判断长度、切片、默许值的代码。更实用的是`_, *_, last = data`,丢掉中间悉数,只留头尾,连哑变量名齐毋庸念念。
pathlib刚用时以为冠上加冠,`os.path.join('a','b','c')`不也行?铁心Windows启航径斜杠反斜杠混着来,`os.path`只怕候返字符串只怕候返bytes,而`Path('a') / 'b' / 'c.txt'`,打出来即是对的,类型安全,IDE还能点进去跳转。不是它多利害,米兰app官网版是`os.path`原来就没想象好。
类型教导往常以为是给机器看的,自后发现写`def calc(x: int) -> float:`之后,VS Code能立马标出你传了个字符串进去,Copilot生成代码时也不再乱猜参数名。不是为了过静态搜检,是让器具真能帮你盯住荒唐。
`heapq.nlargest(3, data)`和`sorted(data)[-3:]`后果不异,但数据一过万,前者快一倍,内存只用三分之一。不长短要追求快,是等你数据涨到十万条时,毋庸重写逻辑,换一转就解决问题。
模块里提到`tempfile.TemporaryDirectory`,我往常手动建临时文献夹,完事再`shutil.rmtree`,铁心某次零碎退出,残留文献占满磁盘。咫尺用这个高下文料理器,缩进一完了,自动清空,连try/finally齐省了。
测试部分,`@pytest.mark.parametrize`让我少写了七八个重迭测试函数。传三组输入,三行代码,跑出三个用例。毋庸复制粘贴改数字,改错了还难发现。
终末发现,所谓手艺,其实齐是Python官方文档里空口无凭写着的,仅仅没东说念主告诉你“这个该啥时候用”。不是学得不够多,是信息太散,没东说念主帮你挑出来,按你每活泼会遭受的问题排个序。
有些手艺用了几次就忘了,但有些用上就再也回不去了,比如`dataclass`。手写`__init__`、`__repr__`、`__eq__`,写错一个就debug半天;换成`@dataclass`,两秒生成,改字段毋庸动逻辑。不是偷懒,是把时辰省下来干别的。
附录里阿谁GitHub仓库,我全下了,每个手艺齐跑了一遍。有对比图,有反例,有VS Code成就。莫得PPT式栽植,就几个`.py`文献,双击就能看铁心。
今天改完第三个形势,用上了`graphlib.TopologicalSorter`处理成就依赖,比我方写递归显着多了。文档说“3.12新加”,我查了下照实,何况真能用。
代码没那么玄,即是一个个小遴荐堆起来的。
