{"id":13456060,"url":"https://github.com/piglei/one-python-craftsman","last_synced_at":"2025-05-14T04:07:33.031Z","repository":{"id":37359597,"uuid":"155576567","full_name":"piglei/one-python-craftsman","owner":"piglei","description":"来自一位 Pythonista 的编程经验分享，内容涵盖编码技巧、最佳实践与思维模式等方面。","archived":false,"fork":false,"pushed_at":"2024-05-16T00:19:42.000Z","size":2490,"stargazers_count":6971,"open_issues_count":2,"forks_count":973,"subscribers_count":197,"default_branch":"master","last_synced_at":"2025-04-10T03:46:14.164Z","etag":null,"topics":["articles","book","python","python3"],"latest_commit_sha":null,"homepage":"https://www.piglei.com","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/piglei.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-10-31T15:03:16.000Z","updated_at":"2025-04-08T16:02:46.000Z","dependencies_parsed_at":"2022-07-12T05:30:36.728Z","dependency_job_id":"a5e7f24c-f8d6-43de-99bb-d3d0ff8f5595","html_url":"https://github.com/piglei/one-python-craftsman","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piglei%2Fone-python-craftsman","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piglei%2Fone-python-craftsman/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piglei%2Fone-python-craftsman/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piglei%2Fone-python-craftsman/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/piglei","download_url":"https://codeload.github.com/piglei/one-python-craftsman/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254069215,"owners_count":22009510,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["articles","book","python","python3"],"created_at":"2024-07-31T08:01:15.625Z","updated_at":"2025-05-14T04:07:32.995Z","avatar_url":"https://github.com/piglei.png","language":null,"readme":"《Python 工匠》图书首页上线啦！共有 3 章在线内容，欢迎阅读。\n\n- [图书首页](https://www.piglei.com/book/)\n- [第 1 章 变量与注释](https://www.piglei.com/book/ch01_variables.html)\n- [第 6 章 循环与可迭代对象](https://www.piglei.com/book/ch06_loop.html)\n- [第 10 章 面向对象设计原则](https://www.piglei.com/book/ch10_solid_p1.html)\n\n图书《Python 工匠：案例、技巧与工程实践》现已正式上市。同开源文章相比，图书的知识结构更为流畅，增加了“函数”“面向对象编程”等核心章节，**总内容量几乎翻倍**，欢迎购买。\n\n\u003cimg height=\"300px\" src=\"https://github.com/piglei/one-python-craftsman/assets/731266/256a6af5-2eab-4f32-ad8e-aff590836bc2\" /\u003e\n\n[点击购买](https://item.jd.com/13068111.html) | [豆瓣书评](https://book.douban.com/subject/35723705/) | [图灵社区](https://www.ituring.com.cn/book/3007)\n\n---\n\n## 『Python 工匠』是什么？\n\n我一直觉得编程某种意义上是一门『手艺』，因为优雅而高效的代码，就如同完美的手工艺品一样让人赏心悦目。\n\n在雕琢代码的过程中，有大工程：比如应该用什么架构、哪种设计模式。也有更多的小细节，比如何时使用异常（Exceptions）、或怎么给变量起名。那些真正优秀的代码，正是由无数优秀的细节造就的。\n\n『Python 工匠』这个系列文章，是我的一次小小尝试。它专注于分享 Python 编程中的一些偏 **『小』** 的东西。希望能够帮到每一位编程路上的匠人。\n\n## 文章列表\n\n- 1\\. \u003cdel\u003e善用变量改善代码质量\u003c/del\u003e [[图书版：变量与注释](https://www.piglei.com/book/ch01_variables.html)]\n- [2. 编写条件分支代码的技巧](zh_CN/2-if-else-block-secrets.md)\n- [3. 使用数字与字符串的技巧](zh_CN/3-tips-on-numbers-and-strings.md)\n- [4. 容器的门道](zh_CN/4-mastering-container-types.md)\n- [5. 让函数返回结果的技巧](zh_CN/5-function-returning-tips.md)\n- [6. 异常处理的三个好习惯](zh_CN/6-three-rituals-of-exceptions-handling.md)\n- 7\\. \u003cdel\u003e编写地道循环的两个建议\u003c/del\u003e [[图书版：循环与可迭代对象](https://www.piglei.com/book/ch06_loop.html)]\n- [8. 使用装饰器的技巧](zh_CN/8-tips-on-decorators.md)\n- [9. 一个关于模块的小故事](zh_CN/9-a-story-on-cyclic-imports.md)\n- [10. 做一个精通规则的玩家](zh_CN/10-a-good-player-know-the-rules.md)\n- [11. 高效操作文件的三个建议](zh_CN/11-three-tips-on-writing-file-related-codes.md)\n- 12\\. \u003cdel\u003e写好面向对象代码的原则（上）\u003c/del\u003e [[图书版：面向对象设计原则（上）](https://www.piglei.com/book/ch10_solid_p1.html)]\n- [13. 写好面向对象代码的原则（中）](zh_CN/13-write-solid-python-codes-part-2.md)\n- [14. 写好面向对象代码的原则（下）](zh_CN/14-write-solid-python-codes-part-3.md)\n- [15. 在边界处思考](zh_CN/15-thinking-in-edge-cases.md)\n- [16. 语句、表达式和海象操作符](zh_CN/16-stmt-expr-and-walrus-operator.md)\n\n如果你觉得读 GitHub 文件不太方便，也可以访问[这个镜像站点](https://pengzhangzhi.github.io/one-python-craftsman/)阅读所有文章（由 [@pengzhangzhi](https://github.com/pengzhangzhi) 搭建）。\n\n也欢迎你关注我的微信公众号：piglei，在第一时间阅读最新文章：\n\n\u003cimg src=\"https://user-images.githubusercontent.com/731266/54093209-2edced80-43d0-11e9-8e69-764f5da8b275.png\" /\u003e\n\n所有文章禁止转载，如需转载请通过微信公众号联系我。\n\n## 详细内容\n\n### 1. [善用变量改善代码质量](zh_CN/1-using-variables-well.md)\n\n- 如何为变量起名\n    - 1 - 变量名要有描述性，不能太宽泛\n    - 2 - 变量名最好让人能猜出类型\n        - 『什么样的名字会被当成 bool 类型？』\n        - 『什么样的名字会被当成 int/float 类型？』\n        - 其他类型\n    - 3 - 适当使用『匈牙利命名法』\n    - 4 - 变量名尽量短，但是绝对不要太短\n        - 使用短名字的例外情况\n    - 5 - 其他注意事项\n- 更好的使用变量\n    - 1 - 保持一致性\n    - 2 - 尽量不要用 globals()/locals()\n    - 3 - 变量定义尽量靠近使用\n    - 4 - 合理使用 namedtuple/dict 来让函数返回多个值\n    - 5 - 控制单个函数内的变量数量\n    - 6 - 及时删掉那些没用的变量\n    - 7 - 能不定义变量就不定义\n- 结语\n\n### 2. [编写条件分支代码的技巧](zh_CN/2-if-else-block-secrets.md)\n\n- 最佳实践\n    - 1 - 避免多层分支嵌套\n    - 2 - 封装那些过于复杂的逻辑判断\n    - 3 - 留意不同分支下的重复代码\n    - 4 - 谨慎使用三元表达式\n- 常见技巧\n    - 1 - 使用“德摩根定律”\n    - 2 - 自定义对象的“布尔真假”\n    - 3 - 在条件判断中使用 all() / any()\n    - 4 - 使用 try/while/for 中 else 分支\n- 常见陷阱\n    - 1 - 与 None 值的比较\n    - 2 - 留意 and 和 or 的运算优先级\n- 结语\n- 注解\n\n### 3. [使用数字与字符串的技巧](zh_CN/3-tips-on-numbers-and-strings.md)\n\n- 最佳实践\n    - 1 - 少写数字字面量\n        - 使用 enum 枚举类型改善代码\n    - 2 - 别在裸字符串处理上走太远\n    - 3 - 不必预计算字面量表达式\n- 实用技巧\n    - 1 - 布尔值其实也是“数字”\n    - 2 - 改善超长字符串的可读性\n        - 当多级缩进里出现多行字符串时\n    - 3 - 别忘了那些 “r” 开头的内建字符串函数\n    - 4 - 使用“无穷大” float(\"inf\")\n- 常见误区\n    - 1 - “value += 1” 并非线程安全\n    - 2 - 字符串拼接并不慢\n- 结语\n\n### 4. [容器的门道](zh_CN/4-mastering-container-types.md)\n\n- 底层看容器\n    - 写更快的代码\n        - 1 - 避免频繁扩充列表/创建新列表\n        - 2 - 在列表头部操作多的场景使用 deque 模块\n        - 3 - 使用集合/字典来判断成员是否存在\n- 高层看容器\n    - 写扩展性更好的代码\n        - 面向容器接口编程\n- 常用技巧\n    - 1 - 使用元组改善分支代码\n    - 2 - 在更多地方使用动态解包\n    - 3 - 使用 next() 函数\n    - 4 - 使用有序字典来去重\n- 常见误区\n    - 1 - 当心那些已经枯竭的迭代器\n    - 2 - 别在循环体内修改被迭代对象\n- 总结\n- 系列其他文章\n- 注解\n\n### 5. [让函数返回结果的技巧](zh_CN/5-function-returning-tips.md)\n\n- 编程建议\n    - 1 - 单个函数不要返回多种类型\n    - 2 - 使用 partial 构造新函数\n    - 3 - 抛出异常，而不是返回结果与错误\n    - 4 - 谨慎使用 None 返回值\n        - 1 - 作为操作类函数的默认返回值\n        - 2 - 作为某些“意料之中”的可能没有的值\n        - 3 - 作为调用失败时代表“错误结果”的值\n    - 5 - 合理使用“空对象模式”\n    - 6 - 使用生成器函数代替返回列表\n    - 7 - 限制递归的使用\n- 总结\n- 附录\n\n### 6. [异常处理的三个好习惯](zh_CN/6-three-rituals-of-exceptions-handling.md)\n\n- 前言\n- 三个好习惯\n    - 1 - 只做最精确的异常捕获\n    - 2 - 别让异常破坏抽象一致性\n    - 3 - 异常处理不应该喧宾夺主\n- 总结\n- 附录\n\n### 7. [编写地道循环的两个建议](zh_CN/7-two-tips-on-loop-writing.md)\n\n- 前言\n- 什么是“地道”的循环？\n    - enumerate() 所代表的编程思路\n- 建议1：使用函数修饰被迭代对象来优化循环\n    - 1 - 使用 product 扁平化多层嵌套循环\n    - 2 - 使用 islice 实现循环内隔行处理\n    - 3 - 使用 takewhile 替代 break 语句\n    - 4 - 使用生成器编写自己的修饰函数\n- 建议2：按职责拆解循环体内复杂代码块\n    - 复杂循环体如何应对新需求\n    - 使用生成器函数解耦循环体\n- 总结\n- 附录\n\n### 8. [使用装饰器的技巧](zh_CN/8-tips-on-decorators.md)\n\n- 前言\n- 最佳实践\n    - 1 - 尝试用类来实现装饰器\n    - 2 - 使用 wrapt 模块编写更扁平的装饰器\n- 常见错误\n    - 1 - “装饰器”并不是“装饰器模式”\n    - 2 - 记得用 functools.wraps() 装饰内层函数\n    - 3 - 修改外层变量时记得使用 nonlocal\n- 总结\n- 附录\n\n### 9. [一个关于模块的小故事](zh_CN/9-a-story-on-cyclic-imports.md)\n\n- 前言\n- 一个关于模块的小故事\n    - 需求变更\n    - 解决环形依赖问题\n    - 小 C 的疑问\n- 总结\n- 附录\n\n### 10. [做一个精通规则的玩家](zh_CN/10-a-good-player-know-the-rules.md)\n\n- 前言\n    - Python 里的规则\n- 案例：从两份旅游数据中获取人员名单\n    - 第一次蛮力尝试\n    - 尝试使用集合优化函数\n    - 对问题的重新思考\n    - 利用集合的游戏规则\n    - 使用 dataclass 简化代码\n    - 案例总结\n- 其他规则如何影响我们\n    - 使用 `__format__` 做对象字符串格式化\n    - 使用 `__getitem__` 定义对象切片操作\n- 总结\n- 附录\n\n### 11. [高效操作文件的三个建议](zh_CN/11-three-tips-on-writing-file-related-codes.md)\n\n- 前言\n- 建议一：使用 pathlib 模块\n    - 使用 pathlib 模块改写代码\n    - 其他用法\n- 建议二：掌握如何流式读取大文件\n    - 标准做法的缺点\n    - 使用 read 方法分块读取\n    - 利用生成器解耦代码\n- 建议三：设计接受文件对象的函数\n    - 如何编写兼容二者的函数\n- 总结\n- 附录\n- 注解\n\n### 12. [写好面向对象代码的原则（上）](zh_CN/12-write-solid-python-codes-part-1.md)\n\n- 前言\n    - Python 对 OOP 的支持\n    - SOLID 设计原则\n- SOLID 原则与 Python\n- S：单一职责原则\n    - 违反“单一职责原则”的坏处\n    - 拆分大类为多个小类\n    - 另一种方案：使用函数\n- O：开放-关闭原则\n    - 如何违反“开放-关闭原则”\n    - 使用类继承来改造代码\n    - 使用组合与依赖注入来改造代码\n    - 使用数据驱动思想来改造代码\n- 总结\n- 附录\n\n### 13. [写好面向对象代码的原则（中）](zh_CN/13-write-solid-python-codes-part-2.md)\n\n- 前言\n- 里氏替换原则与继承\n- L：里氏替换原则\n- 一个违反 L 原则的样例\n    - 不当继承关系如何违反 L 原则\n    - 一个简单但错误的解决办法\n    - 正确的修改办法\n- 另一种违反方式：子类修改方法返回值法返回值)\n    - 分析类方法返回结果\n    - 如何修改代码\n    - 方法参数与 L 原则\n- 总结\n- 附录\n\n### 14. [写好面向对象代码的原则（下）](zh_CN/14-write-solid-python-codes-part-3.md)\n\n- 前言\n- D：依赖倒置原则\n    - 需求：按域名分组统计 HN 新闻数量\n    - 为 SiteSourceGrouper 编写单元测试\n        - 使用 mock 模块\n    - 实现依赖倒置原则\n    - 依赖倒置后的单元测试\n    - 问题：一定要使用抽象类 abc 吗？\n    - 问题：抽象一定是好东西吗？\n- I：接口隔离原则\n    - 例子：开发页面归档功能\n    - 问题：实体类不符合 HNWebPage 接口规范\n    - 成功违反 I 协议\n    - 如何分拆接口\n    - 一些不容易发现的违反情况\n    - 现实世界中的接口隔离\n- 总结\n- 附录\n\n### 15. [在边界处思考](zh_CN/15-thinking-in-edge-cases.md)\n\n- 前言\n- 第一课：使用分支还是异常？\n    - 获取原谅比许可简单(EAFP)\n- 当容器内容不存在时\n    - 使用 defaultdict 改写示例\n    - 使用 setdefault 取值并修改\n    - 使用 dict.pop 删除不存在的键\n    - 当列表切片越界时\n- 好用又危险的 “or” 操作符\n- 不要手动去做数据校验\n- 不要忘记做数学计算\n- 总结\n- 附录\n\n### 16. [语句、表达式和海象操作符](zh_CN/16-stmt-expr-and-walrus-operator.md)\n\n- 表达式的特点\n- 海象操作符\n    - 1. 用于分支语句\n    - 2. 消除推导式中的重复\n    - 3. 捕获推导式的中间结果\n    - 4. 赋值表达式的限制\n- 其他建议\n    - 1. “更紧凑”不等于“更好”\n    - 2. 宜少不宜多\n","funding_links":[],"categories":["Others","Others (1002)"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpiglei%2Fone-python-craftsman","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpiglei%2Fone-python-craftsman","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpiglei%2Fone-python-craftsman/lists"}