Python 坑爹之 代码缩进

Python代码缩进

这两天python-cn邮件列表有一条thread发展的特别长,题目是《python的代码缩进真是坑爹》(地址),楼主在一台电脑上用KOMODO写的代码到另一台电脑上就不能运行了,调试后才发现是代码缩进的问题,为此楼主表示“真是火大”!而之后的回复,可想而知,批判楼主、教育楼主、鄙视楼主等的人绝不是少数(毕竟是python邮件列表,都是python开发者、爱好者嘛)。

要求严格的代码缩进是python语法的一大特色,就像C语言家族(C、C++、Java、C#等等)中的花括号一样重要,在大多数场合还有必要。在很多代码规范里面也都有要求代码书写按照一定的规则进行换行和代码缩进,但是这些要求只是纯粹是方便人(程序员)来阅读、使用或修改的,对于编译器或者解释器而言,完全是视而不见的。但是对Python解释器而言,每行代码前的缩进都有语法和逻辑上的意义。Python的这个特性,也经常在Python使用者和非Python使用者中引起争论。

Python的代码缩进之起源,有人说事继承于ABC(没听过但感觉很古老的语言),有人说是避免花括号,我猜可能是python发明者一时心血来潮的决定,大概也只有他能解释这个问题。不管怎样,作为发展了十余年的一名语言,这条语法规则已经不大可能改变了。

实际上,严格要求(强制)的代码缩进,就像一把双刃剑,有好处也有坏处。好处显而易见,在严格要求的代码缩进之下,代码非常整齐规范,赏心悦目,提高了可读性,在一定程度上也提高了可维护性。有人说,这种约束,对团队开发非常有利,当然,也不见得,这就要看强制代码缩进的坏处。Python严格的代码缩进,对于从其他语言转过来的人(现在计算机和相关专业第一门语言一般都是C/C++或Java吧,他们的语法风格基本是一直的),可能要适应一段时间。代码缩进十分严格,如果不按规律办事,不小心的话就会出现语法错误,比如unexpected indent之类的。甚至有时也会出现逻辑错误。

在实际情况中,由于代码缩进而出现语法错误或逻辑错误,在我看来有这两种主要情况,一是混用tab和空格缩进,二是编辑器对缩进的处理各异。这里给出一个例子,代码是这样的:

图中使用的Notepad++编辑器,箭头代表一个tab,点表示一个空格,默认情况下不会显示箭头和点,需要专门在视图-显示符号-显示空格和制表符 中启用这个功能。如果没有箭头和点,一般认为执行结果应该是显示a,实际是显示a、c,原因很简单,1个tab,python会认为是8个空格。如果换成其他编辑器,可能print ‘c‘就不会和print ‘b‘同列显示了。对于同一个文本,简单的修改,不同编辑器做保存,也可能导致缩进出现不同。

我觉得为了避免因代码缩进而产生不必要的麻烦,写python代码应该,使用唯一的缩进方式(要么tab,要么空格),使用固定和统一的编辑器,此外,还应该利用好编辑器的一些特性。对于notepad++而言,除了上面所说的显示空格和制表符外,还有两个特性可以使用:一是,编辑菜单下的blank operation有两个选项tab to spacespace to tab,如果对上图的那段代码做tab to space,代码列对齐基本不变,箭头都变成点,但是执行结果是a;二是,在 设置-首选项-语言下可以选上“以空格代替”,这样以后每次按tab键都会自动转换为空格。

其他的编辑器,也有对应的一些处理技巧,比如,列表中有人提出,对VIM可以这样设置:

set listset listchars=tab:\|\ ,trail:-,nbsp:_

更多的编辑器特性,google上面应该还有很多,这里就不赘述了。

处理好代码缩进的问题,应该算是python的基本功吧。

Python脚本运行出现语法错误:IndentationError: unindent does not match any outer indentation level

【问题】 
一个python脚本,本来都运行好好的,然后写了几行代码,而且也都确保每行都对齐了,但是运行的时候,却出现语法错误: 
IndentationError: unindent does not match any outer indentation level

【解决过程】 
1.对于此错误,最常见的原因是,的确没有对齐。但是我根据错误提示的行数,去代码中看了下,没啥问题啊。 
都是用TAB键,对齐好了的,没有不对齐的行数啊。 
2.以为是前面的注释的内容影响后面的语句的语法了,所以把前面的注释也删除了。 
结果还是此语法错误。 
3.后来折腾了半天,突然想到了,把当前python脚本的所有字符都显示出来看看有没有啥特殊的字符。

当前用的文本编辑器Notepad++,好像有个设置,可以显示所有的字符的。 
找到了,在: 
视图 -> 显示符号 -> 显示空格与制表符

然后就看出问题来了: 
原来错误的行数是1580行:

但是源码的1580行的对齐用的是点点点的空格,是和前面的几行的对齐所用的箭头表示的TAB键,是不匹配的,即代码的对齐,混用了TAB键和空格:


而新的Python语法,是不支持的代码对齐中,混用TAB和空格的。所以出现上述错误提示了。

知道原因了,解决起来就简单了: 
去把对应的TAB,都改为空格,统一一下对齐的风格,即可。 
在Notepad++中,去: 
设置->首选项:

语言->以空格取代(TAB键):

即可实现,对于以后每次的TAB输入,都自动转换为4个空格。

【总结】

Python中遇到IndentationError,以后第一时间就要想到,是不是由于TAB键和空格混搭使用了。

估计很多人也都是此类原因导致的。记得统一一下就好。

时间: 2024-10-12 19:09:56

Python 坑爹之 代码缩进的相关文章

python代码缩进和循环语句2

我们接着讲for函数. range()函数和len()函数常常一起用于字符串索引,这里我们要显示每一个的元素及其索引值. #小插曲,在cmd中,清除屏幕的方法是输入cls,即 clean screen. 让我们分析一下这个语句. foo='abc' for i in range(len(foo)): print foo[i],'%d'%i    #值得注意的地方是,这个%d,的后面,要加个%i,意思是,%d要从i里面取值. [称作格式化输出.] a '0' b '1' c '2' 先输出a,我们

python学习笔记之-代码缩进

Python最具特色的是用缩进来标明成块的代码.我下面以if选择结构来举例.if后面跟随条件,如果条件成立,则执行归属于if的一个代码块. 先看C语言的表达方式(注意,这是C,不是Python!) if ( i > 0 ) { x = 1; y = 2; } 如果i > 0的话,我们将进行括号中所包括的两个赋值操作.括号中包含的就是块操作,它隶属于if. 在Python中,同样的目的,这段话是这样的 if i > 0: x = 1 y = 2 在Python中, 去掉了i > 0周

Python语法特点之代码缩进

Python不像其他程序设计语言(如Java或者C语言)采用大括号{}分隔代码块,而是采用代码缩进和冒号":"区分代码之间的层次.缩进可以使用空格或者<Tab>键实现.其中,使用空格时候,通常情况下采用4个空格作为一个缩进量,而使用Tab键时,则采用一个Tab键作为一个缩进量.通常情况下建议采用空格进行缩进. 附中文编程视频资料资料来源:http://edu.51cto.com/course/14476.html资料导航:http://edu.51cto.com/lectu

python读书笔记之缩进和选择

缩进 Python最具特色的是用缩进来标明成块的代码.我下面以if选择结构来举例.if后面跟随条件,如果条件成立,则执行归属于if的一个代码块. if i > 0: x = 1 y = 2 四个空格的缩进 总结 if语句之后的冒号 以四个空格的缩进来表示隶属关系, Python中不能随意缩进

第四章 Python外壳:代码结构

Python的独特语法: 不使用分号结束语句,而是回车: 通过代码缩进来区分代码块: if.while.for等,都不用括号,但不能没有冒号(:). 如何将一行命令分为多行? >>> myNameIs = "LiZhiXin." >>> myNameIs 'LiZhiXin.' 4.1 条件语句和循环语句 如何使用if.elif和else进行比较? >>> a = 1 >>> if a < 2: print

机器学习系列(9)_机器学习算法一览(附Python和R代码)

本文资源翻译@酒酒Angie:伊利诺伊大学香槟分校统计学同学,大四在读,即将开始计算机的研究生学习.希望认识更多喜欢大数据和机器学习的朋友,互相交流学习. 内容校正调整:寒小阳 && 龙心尘 时间:2016年4月 出处:http://blog.csdn.net/han_xiaoyang/article/details/51191386 http://blog.csdn.net/longxinchen_ml/article/details/51192086 声明:版权所有,转载请联系作者并注

代码缩进问题

最近修改别人的代码就出现一个问题,别人写的代码保持换行,而我添加的代码就直接压缩成一行.如图: 开始我就觉得很奇怪,从来没有遇到这个bug,之后使用sublime text 才发现这个问题是怎么来的,原来别人代码缩进使用tab键,而我就使用空格,结果浏览器没有区别出来,就莫名奇妙的压缩了我写的代码.没有起换行作用. PS:团队开发的时候,一定要统一代码缩进方式,千万不要混合使用tab缩进与空格缩进代码.(偏偏被这个小问题折腾了很久)         习惯使用tab键的朋友建议设置tab键等于多少

&lt;转&gt;机器学习系列(9)_机器学习算法一览(附Python和R代码)

转自http://blog.csdn.net/han_xiaoyang/article/details/51191386 – 谷歌的无人车和机器人得到了很多关注,但我们真正的未来却在于能够使电脑变得更聪明,更人性化的技术,机器学习. – 埃里克 施密特(谷歌首席执行官) 当计算从大型计算机转移至个人电脑再转移到云的今天,我们可能正处于人类历史上最关键的时期.之所以关键,并不是因为已经取得的成就,而是未来几年里我们即将要获得的进步和成就. 对我来说,如今最令我激动的就是计算技术和工具的普及,从而带

python+spark程序代码片段

处理如此的字符串: time^B1493534543940^Aid^B02CD^Aasr^B叫爸爸^Anlp^B{"domain":"com.abc.system.chat","intent":"chat","slots":{"tts":"爸爸","asr":"叫爸爸"},"voice":"叫爸爸&