python中意外缩进是什么意思_Python 的缩进是不是反人类的设计?
前些天,我写了《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) 小姐姐的观点对我挺有启发。
群聊截图已记录在“Python知识星球”里(https://t.zsxq.com/jeM33bQ),其中她提到了编程语言在设计上的“比较抽象和哲学”的两点:缩进使得代码失去了形式语言里所谓的“上下文无关文法”,从而使得空格+数量的组合变得不再是可有可无的。
block 作为一个“语法组分”,需要一个定界符,而空格一般不作为语法组分,所以就觉得少了些什么。
三言两语没法转述清楚,但她谈论缩进话题的视角确实令人耳目一新!
上次的文章发出后,有不少小伙伴表示很喜欢 Python 的缩进。我本以为会听到很多这类的声音,没想到却是负面的评论更多。(也许更多认同的声音没有表现出来)
本文对几类典型的评论作出了回应,再次表达了我在这个话题上的关注和理解(以及情绪的抒发),希望也能给读者们带来一些思考和收获吧。
相关文章:

netstat命令
使用netstat -nap可以查看当前发送和接收队列,Send-Q 很高时表示发送队列太长,可能网络阻塞 转载于:https://www.cnblogs.com/wx170119/p/11606909.html

mysql操作数字名称的schema时字符的逃逸问题
一个简单的问题折腾了好大一会儿,mysql不支持直接操作数字名称的schema,在sql操作时必须做字符逃逸,如: char sql_str[1000]; memset(sql_str, 0x0, 1000); sprintf(sql_str, "CREATE TABLE IF NOT EXIST %s.%s(data_id INT(…

使用XMLSpyDocEditPlugIn2.dll,页面加载失败
维护项目中遇到问题,项目用到XMLSpyDocEditPlugIn2.dll的acticex控件,客户换了其他pc后,不能下载安装acticex控件,所以不能使用此功能。解决方法: 1 下载 XMLSpyDocEditPlugIn2.dll, 路径 http://download.…

[bzoj4562][Haoi2016]食物链_记忆化搜索_动态规划
食物链 bzoj-4562 Haoi-2016 题目大意:给你n个点,m条边的DAG,求所有的满足条件的链,使得每条链的起点是一个入度为0的点,中点是一条出度为0的点。 注释:$1\le n\le 10^5$,$1\le m\le 2*10^5$。 …

Apache源码包在LINUX(CENTOS6.8)中的安装(出现问题及解决)
任务:在CENT6.8系统中安装Apache(版本为:httpd-2.4.41) 前提:由于源码包必须先编译后安装,所以必须先安装编译器:gcc 理论步骤: 1.检测gcc软件包,如果不存在则进行安装。…

append函数_连载|想用Python做自动化测试?函数的参数传递机制及变量作用域
“ 这一节有点难。看不懂没关系。继续往后学,回头再来看。”10.6 函数参数传递的机制10.6.1 值传递与引用传递编程语言的参数传递机制通常有两种:值传递拷贝参数的值,然后传递给函数里的新变量。这样,原变量和新变量之间互相独立&…

PowerDesigner生成数据库
此文中图片不小心被删除了,特重写了PowerDesigner生成数据库修改 一、 用POWERDESIGNER生成数据库 FILE-》NEW 在MODEL NAME中输入模版名 在DBMS中选择要连接的数据库类型 点击确定 确定后出现如下页面 选中工具条面版上的 表按钮 在…

随想_8_Windows_XP_Explorer_错误
最近发现微软的系统的稳定性,还是有待提高啊,这不XP SP3的资源管理器,就犯毛病了,俗话说有图 有真相,各位请看: 大家看,资源管理器左边的导航栏, 就可以发现,里面很多东西…

webpack笔记(6)调试模式
在配置devtool时,webpack给我们提供了四种选项。 source-map:在一个单独文件中产生一个完整且功能完全的文件。这个文件具有最好的source map,但是它会减慢打包速度;cheap-module-source-map:在一个单独的文件中产生一个不带列映射的map,不带…

nicstat命令安装与分析
nicstat安装包下载与安装: wget https://downloads.sourceforge.net/project/nicstat/nicstat-1.95.tar.gz tar -zxvf nicstat-1.95.tar.gz cd nicstat-1.95 cp Makefile.Linux Makefile vi Makefile 后修改 CFLAGS $(COPT) make && make install //…

component是什么接口_【Android每日一题】从Activity创建到View呈现中间发生了什么?...
前言前段时间公司招人,作为面试官,我经常让面试者简述View的绘制流程。他们基本都能讲明白View的测量(measure)、布局(layout)、绘制(draw)等过程。还有少数人会提到DecorView和ViewRootImp的作用。但是,当我继续追问关于Window的内容时&…

wp 删除独立存储空间文件(多级非空文件夹删除)
void DelFile(string unZipFilePath)//unZipFilePath第一次传递的是根目录名 { using (var store IsolatedStorageFile.GetUserStoreForApplication()) { if (store.DirectoryExists(unZipFilePath)) { …

重拾博客小序与杂思
寒假期间,条件所限,不能上网,也不能更新博客。寒假结束,懈怠了两个星期,打算重拾博客,继续更新。这学期(2012年2月到2012年8月)在专业学习上将突出几个集中研究的领域,在…

Ubuntu iso镜像文件写入U盘
Ubuntu iso镜像文件写入U盘 Ubuntu iso镜像文件写入U盘方法 分步指南 命令行输入 usb-creator-gtk如下:3、Device 选择插入的U盘 4、image 选择镜像文件 5、make startup disk

页面布局让footer居页面底部_网站各页面该如何布局关键词优化提升排名?
在网站优化中,最值得关注的一个事情就是关键词的布局,因为关键词的布局直接影响着网站的排名。那么怎样布局关键词才能提高页面和关键词的相关性,并提高网站排名呢?下面一起来看看。一、利用HTML标签布局关键词众所周知࿰…

Linux中如何配置IP
与网络相关的文件:1) /etc/sysconfig/network 设置主机名称及能否启动Network2) /etc/sysconfig/network-scripts/ifcfg-eth0设置网卡参数的文件3) /etc/modprobe.conf 开机时用来设置加载内核模块的文件4) /etc/resolv.conf 设置DNS IP(解析服务器&…

《DSP using MATLAB》Problem 5.7
代码: %% %% Output Info about this m-file fprintf(\n***********************************************************\n); fprintf( <DSP using MATLAB> Problem 5.7 \n\n);banner(); %% % -------------------------------------------…

一般将来时语法课教案_「英语语法」一般过去时用法技巧全解
大家好,我是教课蚪英语的张老师,今天我们来学习英语语法100讲的第一课,一般过去时!一、首先我们了解一下什么是一般过去时?英语语法1. 概念:描述过去的状态或过去的动作。 在英语中,非现在的以前…

修改Ubuntu的启动logo
修改Ubuntu的启动logo 原文链接: https://my.oschina.net/jmjoy/blog/380262 内容: Plymouth splash screen is the initial splash screen at boot-up.Ubuntu 10.04 uses Plymouth instead of xsplash to manage the fancy boot graphics.If you want something different,y…

每周四十小时,你有多少是在为自己干活?
努力工作为什么?普通人不外乎希望加薪、升职,过的更好。 但是,要想达到这个目标,靠什么? 普通人当然要靠提升自己的能力和经验。 可是,你是不是已经发现,工作最踏实的,却未必取得最好…

在Linux下查看共享文件夹
一般情况,我们用到smbclient,常用方法所如下:#smbclient -L //IP地址或计算机名smbclient是samba的Linux客户端,在Linux机器上用来查看服务器上的共享资源,也可以向ftp一样,用户可以等里samba服务器&#x…

算法复杂度的定义
算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。(算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间…

C#操作OFFICE一(EXCEL)
C#操作Excel! publicclassImportExportToExcel { private string strConn ; private System.Windows.Forms.OpenFileDialog openFileDlgnew System.Windows.Forms.OpenFileDialog(); private System.Windows.Forms.SaveFileDialog saveFileDlg…

c语言最小费用流_策略算法工程师之路-图优化算法(一)(二分图amp;最小费用最大流)...
目录1.图的基本定义2.双边匹配问题2.1 二分图基本概念2.2 二分图最大匹配求解2.3 二分图最优匹配求解2.4 二分图最优匹配建模实例2.4.1 二分图最优匹配在师生匹配中的应用2.4.2 二分图最优匹配在多对多拼车算法中的应用3.网络最大流3.1 网络流基本定义3.2 最大流的问题线性规划…

linux 查看库的安装信息
ldconfig -p | grep 库名(例如:lib***) 比如: ldconfig -p | grep libcrypto

Asp.net无刷新调用后台实体类数据并以Json格式返回
新建一般处理程序public class Temp {public int Index { get; set; }public string Description { get; set; }public string ImagePath { get; set; }public DateTime MyDate { get; set; } }//数据源 List<Temp> listTemp new List<Temp>(){new Temp(){ Index1…

HDU 排名(简单题)
好久没在oj上做题了,刚开始第二天做一道简单题的心得记录。 1 #include <cstdio>2 #include <cstring>3 #include <string>4 #include <iostream>5 #include <algorithm>6 using namespace std;7 8 /*9 超级无语的错误,#d…

linux系统操作常见问题(ubuntu和opensuse)
在玩linux的过程中,会遇到各种看似奇怪的问题,这些问题往往让那些刚刚接触linux没多久的人不知所措,心中烦躁,这里把我曾经遇到对各种问题列出来,供喜欢linux对人参考: linux下以root身份成功运行chromium…

java iso8583 socket 服务_JAVA客户端amp;服务器的socket通信
JAVA客户端&服务器的socket通信socket是两台主机之间的一个连接通道,它可以完成七个基本操作:发送远程机器发送数据接收数据关闭连接绑定端口监听入站数据再绑定端口上接收来自远程机器的连接在客户端上使用socket程序用构造函数创建一个新的sockets…
linux 扩容
如何在linux系统中增加一块硬盘,并且格式化它呢: 我是使用VMware-workstation-full-7.1.0-261024.exe来做实验的。(1)使用VMware-workstation 给虚拟机增加一块硬盘,如下图所示:(2)然…