前些天,我写了《Python为什么使用缩进来划分代码块?》,文中详细梳理了 Python 采用缩进语法的 8 大原因。我极其喜欢这种简洁优雅的风格,所以对它赞美有加。

然而文章发出去后,非常意外,竟收到了大量的反对意见!!(以往文章的互动不多,此次创下了记录)

我就不截图了,先摘录几则最刺眼的评论:

> 最大的缺陷就是这个缩进机制 > > 去掉花括号是最愚蠢的设计 > > 绝对是过度设计了,缺陷很大 > > 最大的缺点就是缩进,太反人类了 > > ……

对于这一类的评论,我认为他们是“睁着眼睛说瞎话”,颠倒是非黑白。Python 的缩进语法如此简洁好用,怎么就“过度设计/愚蠢/缺陷/反人类”了?

常言道众口难调,有人爱甜粽子有人爱咸粽子,但是对于咸甜味道,大家是有所共识的,不至于感官紊乱,大放厥词。

还有比较多的评论,认为缩进容易造成混乱:

> 代码多了,自己看着累,别人更难懂 > > 眼花了,还是括号好些 > > 还是{}或end更清晰 > > 没有花括号老觉得没有安全感 > > 缩进层次看不清楚 > > 没有大括号不便于阅读 > > 层次一多看起来很乱,不知哪层是哪层,要缩多少。到底退出循环没有。 > > 看着明明缩进是对的,但运行时总是报错 > > 用python写上十万行试试,到时候你就知道,什么叫混乱看不下去 > > ……

现在主流的 IDE 工具都很强大,应该善于使用其基本功能,例如:设置显示空格字符、设置 tab 自动转化为空格、设置 tab 键为 4 个空格……同一层级的缩进还会有浅浅的竖线,在视觉上辅助阅读。

至于说层次过多、代码很长的情况,这本身就是一种代码坏味道!当出现过长的函数或者类时,优秀的程序员 第一时间该考虑的就是重构。推荐一本书《重构:改善既有代码的设计》,里面有正道的价值观和详尽的方法论。

还有说点击右括号,可以看到匹配的左括号,会清晰。有这东西确实不错,但没有,我并不诉求。本身紧凑简洁的代码,缩进阅读会很快。

除了以上两大类的评论,我还收到以下几种比较有代表性的评论:

有人说“取消花括号会大大降低运行速度”、“这个特性鲁棒性太低了”。——这纯粹是臆想,让他们给出论证和例子,无果。别以为在哪里看到有人说 Python 慢,就想当然把锅扣到缩进的头上。

有人说“多人协同编辑时,有人用tab,有人用空格”。——我说开发团队应该统一规范,然后用 autopep8 之类的辅助工具。他说规范要不停花精力维护,要花成本。拜托!这年头还有人不重视代码规范,直接开除“猿籍”。

有人说“缩进没办法自动格式化代码”。——这在复制移动代码,或者要改变代码层级时,有此诉求。我一直用比较笨的方法调节(tab、shift+tab、加减空格),确实是比较笨,但是会比较有把握。刚在 PyCharm 里研究了一下,我发现它是支持自动格式化的,只是有个小小的问题要注意!

关于缩进的自动格式化,这里有两个例子,给大家演示一下:

上述例子,删除掉那行 if 条件语句,然后直接”ctrl+alt+l“作全局格式化,格式会出错。我们希望两句 print 向左缩进 4 格,但是 return 那句也会向左缩进。

在删除 if 那行后,如果我们只选中两行 print,作局部”ctrl+alt+l“格式化,那只有这两行会缩进,就没问题。

再看第二个例子,我们复制了一段新代码,但是它的缩进不对:

这时候,若直接“ctrl+alt+l”全局格式化,或者选中那三行再格式化,结果都不对!原因是第二个 if 的缩进格数小于 4 个,所以 PyCharm 认为它属于一级缩进(即不该有空格),所以自动格式化时就把它左移了。

如果选中它们,先按 tab 键右移(即新代码变成缩进大于 4 格,小于 8 格):

此时再作格式化的话,它们的缩进就跟第一层的 if 一致了(两层 if 是兄弟关系)。

同理,如果你想把新代码缩进到第一层 if 的内部(变为父子关系),那只需选中上图三行代码再 tab 键右移 4 格,之后格式化就可以了!

建议大家在编辑器里实操一下。等空了我会录制一期小视频(B 站搜“Python猫”),敬请留意。

除了上面的评论/观点之外,我们在微信交流群里也讨论了这个话题。@樱雨楼(https://github.com/yingyulou) 小姐姐的观点对我挺有启发。

缩进使得代码失去了形式语言里所谓的“上下文无关文法”,从而使得空格+数量的组合变得不再是可有可无的。

block 作为一个“语法组分”,需要一个定界符,而空格一般不作为语法组分,所以就觉得少了些什么。

三言两语没法转述清楚,但她谈论缩进话题的视角确实令人耳目一新!

上次的文章发出后,有不少小伙伴表示很喜欢 Python 的缩进。我本以为会听到很多这类的声音,没想到却是负面的评论更多。(也许更多认同的声音没有表现出来)

本文对几类典型的评论作出了回应,再次表达了我在这个话题上的关注和理解(以及情绪的抒发),希望也能给读者们带来一些思考和收获吧。

python的缩进机制是其缺点之一_Python 的缩进是不是反人类的设计?相关推荐

  1. 以下关于python缩进_Python 的缩进是不是反人类的设计?

    Python 的缩进是不是反人类的设计? 前些天,我写了<Python为什么使用缩进来划分代码块?>,文中详细梳理了 Python 采用缩进语法的 8 大原因.我极其喜欢这种简洁优雅的风格 ...

  2. python中意外缩进是什么意思_Python 的缩进是不是反人类的设计?

    前些天,我写了<Python为什么使用缩进来划分代码块?>,文中详细梳理了 Python 采用缩进语法的 8 大原因.我极其喜欢这种简洁优雅的风格,所以对它赞美有加. 然而文章发出去后,非 ...

  3. 怎么自动缩进_Python 的缩进是不是反人类的设计?

    前些天,我写了<Python为什么使用缩进来划分代码块?>,文中详细梳理了 Python 采用缩进语法的 8 大原因.我极其喜欢这种简洁优雅的风格,所以对它赞美有加. 然而文章发出去后,非 ...

  4. python 通过什么来判断是否存在分支结构_python通过缩进来判断操作是否在分支结构的方法...

    python通过缩进来判断操作是否在分支结构的方法 发布时间:2020-05-23 11:40:46

  5. python缩进设计_Python 的缩进是不是反人类的设计?

  6. python中一般使用几个空格表示缩进_为什么Python pep-8强烈建议使用标签上的空格来缩进?...

    为什么Python pep-8强烈建议使用标签上的空格来缩进? 我在Stack Overflow和PEP 8上看到,建议仅在Python程序中使用空格进行缩进. 我能理解一致压痕的必要性,我感到痛苦. ...

  7. python是不是特别垃圾-python垃圾回收机制

    python中有自动内存回收机制,一般情况不需要程序员来处理,面试时被大佬问到了,记录一下.没有画图,推荐读参考的第一篇博文 gc方式1:引用计数 若此对象无其他对象引用,则立马回收掉 优点:简单.实 ...

  8. python是不是特别垃圾-谈谈python垃圾回收机制

    什么是垃圾回收机制? 首先,咱先来解释名词,垃圾回收是不是就是将没用的,废弃的东西回收起来. 在坐的各位都没有女朋友对吧,那难以想象你们的房间会是一个什么样子,可能会有很多垃圾,很凌乱,自己也不收拾. ...

  9. python垃圾回收离职_谈谈python垃圾回收机制

    什么是垃圾回收机制? 首先,咱先来解释名词,垃圾回收是不是就是将没用的,废弃的东西回收起来. 在坐的各位都没有女朋友对吧,那难以想象你们的房间会是一个什么样子,可能会有很多垃圾,很凌乱,自己也不收拾. ...

最新文章

  1. php 检测网络,PHP+Ajax 检测网络是否正常实例详解
  2. SQL基础【十五、join、Inner join、Left join、Right join、Full join】
  3. 手机移动防卫盾安全需求分析文档
  4. SAP CRM product category search - hidden search attribute
  5. 年仅26岁!这位双一流大学的特任教授,攻克世界数学难题
  6. mysql 查看trige_mysql查看所有存储过程,函数,视图,触发器,表
  7. 漫步数理统计十八——相关系数
  8. 如果手里有20万是放银行吃利息还是投资比较合适?
  9. Unix domain socket IPC
  10. python指定返回类型_如何在python中指定方法返回类型列表 - python
  11. 首个应用到大规模真实工业场景的神经网络控制系统在谷歌上线了
  12. 2018年10月软件工程自考时间安排
  13. 学习云计算就业方向有哪些 一般薪资能拿多少
  14. 详解 n 维向量、n 维数组 和 矩阵的维度(转载)
  15. H5动画实现---过渡
  16. 游戏技能一:激光扫射的实现【CocosCreator 2D】【TypeScript】
  17. 以后给孩子起名字不用发愁了
  18. 电商全平台订单管理OMS系统
  19. WPF中使用Winform控件
  20. 计算机组成原理:VHDL设计微程序控制器(代码通俗易懂)

热门文章

  1. 【 .NET Core 3.0 】框架之十 || AOP 切面思想
  2. 不好意思,这么久没有更新《从零开始掌握ASP.NET Core 》
  3. 中国.NET:东莞+长沙.NET俱乐部现场花絮及合肥、苏州、上海等地活动预
  4. .NET的一点历史故事:招兵买马和聚义山林
  5. ASP.NET Core开发-Docker部署运行
  6. HoloLens开发手记-凝视 Gaze
  7. rest_framework05:GenericAPIView用法/扩展类5个/子类9个/ViewSetMixin 自定义方法名字
  8. 使用layui的layer组件做弹出层
  9. 【QGIS入门实战精品教程】4.6:QGIS实现栅格(影像、DEM)的拼接与掩膜提取
  10. C语言试题三之计算并输出 s=1+(1+2^(0.5))+(1+2^(0.5)+3^(0.5))+…+(1+2^(0.5)+3^(0.5)+…+n^(0.5))