Python 核心技术与实战
景霄
Facebook 资深工程师
78765 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
开篇词 (1讲)
Python 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

27 | 学会合理分解代码,提高代码可读性

你好,我是景霄。今天我们不讲任何技术知识点,继续来一起聊聊代码哲学。
有句话说得好,好的代码本身就是一份文档。同样功能的一份程序,一个组件,一套系统,让不同的人来写,写出来的代码却是千差万别。
有些人的设计风格和代码风格犹如热刀切黄油,从顶层到底层的代码看下来酣畅淋漓,注释详尽而又精简;深入到细节代码,无需注释也能理解清清楚楚。
而有些人,代码勉勉强强能跑起来,遇到稍微复杂的情况可能就会出 bug;深入到代码中 debug,则发现处处都是魔术数、函数堆在一起。一个文件上千行,设计模式又是混淆不堪,让人实在很难阅读,更别提修改和迭代开发。
Guido van Rossum(吉多·范罗苏姆,Python 创始人 )说过,代码的阅读频率远高于编写代码的频率。毕竟,即使是在编写代码的时候,你也需要对代码进行反复阅读和调试,来确认代码能够按照期望运行。
话不多说,进入正题。

PEP 8 规范

上节课我们简单提起过 PEP 8 ,今天我们继续来详细解读。
PEP 是 Python Enhancement Proposal 的缩写,翻译过来叫“Python 增强规范”。正如我们写文章,会有句式、标点、段落格式、开头缩进等标准的规范一样,Python 书写自然也有一套较为官方的规范。PEP 8 就是这样一种规范,它存在的意义,就是让 Python 更易阅读,换句话,增强代码可读性。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Python 核心技术与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(34)

  • 最新
  • 精选
  • helloworld
    我的总结 缩进规范: 1. 使用四空格缩进 2. 每行最大长度79个字符 空行规范: 1. 全局的(文件级别的)类和全局的函数上方要有两个空行 2. 类中的函数上方要有一个空行 3. 函数内部不同意群的代码块之前要有一个空行 4. 不要把多行语句合并为一行(即不要使用分号分隔多条语句) 5. 当使用控制语句if/while/for时,即使执行语句只有一行命令,也需要另起一行 6. 代码文件尾部有且只有一个空行 空格规范: 1. 函数的参数之间要有一个空格 2. 列表、元组、字典的元素之间要有一个空格 3. 字典的冒号之后要有一个空格 4. 使用#注释的话,#后要有一个空格 5. 操作符(例如+,-,*,/,&,|,=,==,!=)两边都要有一个空格,不过括号(包括小括号、中括号和大括号)内的两端不需要空格 换行规范: 1. 一般我们通过代码逻辑拆分等手段来控制每行的最大长度不超过79个字符,但有些时候单行代码还是不可避免的会超过这个限制,这个时候就需要通过换行来解决问题了。 2. 两种实现换行的方法: 第一种,通过小括号进行封装,此时虽然跨行,但是仍处于一个逻辑引用之下。比如函数参数列表的场景、过长的运算语句场景 第二种,直接通过换行符(\)实现 文档规范: 1. 所有import尽量放在代码文件的头部位置 2. 每行import只导入一个对象 3. 当我们使用from xxx import xxx时,import后面跟着的对象要是一个package(包对应代码目录)或者module(模块对应代码文件),不要是一个类或者一个函数 注释规范: 1. 代码块注释,在代码块上一行的相同缩进处以 # 开始书写注释 2. 代码行注释,在代码行的尾部跟2个空格,然后以 # 开始书写注释,行注释尽量少写 3. 英文注释开头要大写,结尾要写标点符号,避免语法错误和逻辑错误,中文注释也是相同要求 4. 改动代码逻辑时,一定要及时更新相关的注释 文档描述规范: 三个双引号开始、三个双引号结尾; 首先用一句话简单说明这个函数做什么,然后跟一段话来详细解释; 再往后是参数列表、参数格式、返回值格式的描述。 命名规范: 1. 变量名,要全部小写,多个词通过下划线连接,可以使用单字符变量名的场景,比如for i in range(n)这种变量没有实际意义的情况 2. 类的私有变量名,变量名前需要加2个下划线 3. 常量名,要全部大写,多个词通过下划线连接 4. 函数名,要全部小写,多个词通过下划线连接 5. 类名,要求驼峰形式,即单词首字母大写,多个词的话,每个词首字母大写然后直接拼接 6. 命名需要做到名如其意,不要吝啬名字的长度 代码分解技巧: 1. 不写重复代码,重复代码可以通过使用条件、循环、函数和类来解决 2. 减少迭代层数,让代码扁平化 3. 函数拆分,函数的粒度尽可能细,也就是一个函数不要做太多事情 4. 类的拆分,如果一个类中有多个属性描述的是同一类事物,就可以把这些属性拆分出来新建一个单独的类 5. 模块化,若项目偏大,要为不同功能模块创建独立的目录或文件,通过import互相关联

    作者回复: 很棒

    4
    114
  • lipan
    还记得刚开始写第一个iOS项目的时候,一个文件几千行代码。 业务和逻辑没有分层设计的思想,全部混合在一个文件里,虽然勉强实现了功能,但是后期代码没法改,连我自已都看不懂了,遑论接盘者。 后来在做新浪微博登录授权的时候,看了一下微博oAuth的授权流程,顿时大开眼界。后来又看了一些苹果给的开发例子,才开始有了代码的分层设计和想法,然后才开始学习iOS的MVC和MVVM的设计架构,代码算是勉强看得下去。 所以我觉得如果要提高代码水平,除了动手实战以外,还要多观摹和学习大神的项目代码。 看到老师能够把Python知识给我们讲解深入浅出,举重若轻,完全符合我心目中的大神风范。 因此,希望老师可以给我们分享一些Python的小、中型的项目或Demo(关于爬虫、机器学习、深度学习、自动运营、量化分析或是其它有趣的Python做的小工具都可以)。以供我们观摹学习。谢谢。

    作者回复: 👍

    32
  • 夜路破晓
    听很多程序员讲过,开始他们的关注点大多数是先写出能跑起来的代码,后期当优化成为他们的瓶颈和需求时再来关注代码规范之类的问题。 对于初学者而言,想要实现弯道超车,就需要下大力气把基础夯实,而代码规范正是其中重要的一项。 不可否认,担心学了半天能写漂亮但跑不起来代码的大有人在。如何权衡呢? 分享一个认知:写漂亮代码与写能跑起来的代码之间不存在因果关系,两者都是你需要花费时间精力学习的内容。 越早认识到这一点,越能合理而高效地安排自己的学习计划。

    作者回复: 万事万物都有个度在里面。 在公司写业务逻辑,有规定完成时间的前提下,很容易写出不规范,不优雅的代码,长期以往,能力自然得不到更多的锻炼。自己学习的时候,就一定不要为了贪图快,而是更多地去进行思考,之后再写代码,多花时间在思考上,而不是打字上。

    2
    11
  • new
    如果代码逻辑清晰,加上注释是锦上添花的事,相对写代码和读代码,程序员更愿意自己写代码,而在项目中又必须要读代码,因此代码注释真的很重要,特别是那些逻辑复杂还掺杂部分业务的代码逻辑,如果不加注释几乎不可能有人理解,但是问题来了,如果后来的程序员把最初编写代码的人的代码修改了,但是注释却不更新就会对公司其他人产生重大影响相当于埋了雷,比如你用128个标识位分别表示128个探头启停信号,而在硬件升级过程中探头数量减少了4个探头,原始注释可能是描述128个探头信号启停等信息,而第二个程序员在升级修改时直接修改了循环计数变量为124,常量128未修改,注释也没有改,后又新来的程序员以为程序存在bug,把循环次数重新改回了常量定义128,导致4个探头怎么也读取不到信号,测试n长时间,最后查到硬件才明白是根本没有那4个探头

    作者回复: 👍

    2
    7
  • Leon📷
    大量if else嵌套我接盘过这类代码,我觉得有两个原因造成的,第一就是开发者自己逻辑不清晰,想到哪写到哪 第二 就是懒,赶紧把泥巴墙糊完去结工钱的感觉,这是对项目的极度不负责任,也是对自己的不负责任,坏的习惯养成了就很难改掉了
    3
  • Geek.S.
    python 代码规范中,实践中最难的是变量命名,每次起变量名都花比较长时间,待完成代码编写后,经常需要修改变量名或函数名,使得变量名能够见名知意; 又或者过了一段时间后,发现函数名还是不够精确,于是改了,为了使得使用的代码不会保存,又将旧名字指向新名字。 使用 pycharm 编写代码,我很少会按 ctrl + alt + L,而是根据页面波浪线的提示,手动调整,长年累月,不仅知道了代码规范的具体规则,还可以在脱离 IDE 环境下写出符合代码规范的代码,比如在服务器 vim 里写代码,现在看来这个习惯很受益。 不止对代码规范,连码子都要遵循中文写作规范,哈哈,感觉有点强迫症。
    2
  • Geek_d848f7
    出现过命名和内置模块一样的情况,结果调用内置模块时,报错或者不起作用
    2
  • 吴月月鸟
    写的代码没写注释,当初自己一行一行码的代码,过段时间自己都不认识了。
    1
  • JackLee
    老师,我看之前的文章有个疑问,就是说列表在扩容的时候如果遇上空间被占用,需要重新复制到一块新的地址时。它的id会变么?
    1
  • T_Mer
    文本跟着语音滑动,多好
    归属地:北京
收起评论
显示
设置
留言
34
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部