本篇文章适合python初学者食用。
相信很多刚开始入手python的新人,都跟我一样,习惯了C/C++采用分号来结束语句和花括号来标明代码块的方式,导致在用python写个简简单单的“hello world”都能Error半天 。(哈哈,又是无中生有系列!)所以,我只能痛定思痛,写下这惨痛的经历并总结经验。
在python中,代码块是通过冒号+缩进来实现的,语句末尾的冒号表示创建一个子代码块,有C/C++花括号那味了。同一级别的代码必须有相同的缩进,也就是所有同一级别的代码都必须左对齐,多一个空格少一个空格都不行!!!(不得不说python就是一头倔驴!)所以对于习惯了C/C++的python新手来说,下次程序报错时,不妨先看一下是不是缩进的问题,当然更多时候是忘记写冒号了(我是不会告诉你我就是那个经常忘记写冒号的憨憨的! )。
无图无真相,下面我们来CC编程实操:
>>> x = "错误演示"
>>> print(x) #print前留有空格
SyntaxError: unexpected indent #存在不必要空格
>>> for i in range(5) #句尾忘记打上冒号
SyntaxError: invalid syntax #提示非法语法
>>> for i in range(5): #子代码块的缩进错误
print(x)
SyntaxError: expected an indented block #提示句首缺少空格
>>> x = "正确演示"
>>> for i in range(5):
print(x)
正确演示
正确演示
正确演示
正确演示
正确演示
>>> x, y = "第二级","第三级"
>>> for i in range(3):
print(x)
for j in range(2): #与print(x)同级,缩进相同
print(y)
print("同是第三级") #与print(y)同级,缩进相同
print("同是第二级") #与print(x)同级,缩进相同
第二级
第三级
同是第三级
第三级
同是第三级
同是第二级
第二级
第三级
同是第三级
第三级
同是第三级
同是第二级
第二级
第三级
同是第三级
第三级
同是第三级
同是第二级
>>> for i in range(3):
print(x)
for j in range(2):
print(y)
print("同是第三级") #与第三级错位
print("同是第二级") #与第二级错位
SyntaxError: unexpected indent #存在不必要空格
是不是感觉python没有C/C++那么人性化呢?但相反这确是python的一大优点。其他语言没有强制缩进,导致一些程序员不追求代码的美观,一通乱写,当你看到这些代码时,你就会发现你的眼睛废了(这次真的是我的一个朋友了!!! 我说了他几次了,还是不听,因为他们老师没强制要求缩进,他个人也不注重美化,他拿他的代码来问我题,我都宁愿自己重新打一遍。)无图无真相,就问你难不难受?
所以,python 的这种强制性缩进,既能让代码简化(少打了许多花括号和分号),又能让代码美观(zzqq,专治各种强迫症。)虽然刚开始会比较难适应,但慢慢习惯了你就会发现世界如此美妙。
这么说python缩进没有缺点?那也不是,相信很多同仁都喜欢ctrl+c和ctrl+v吧,有时你就会发现你别人能运行的代码你不能运行,这就是在复制粘贴缩进错乱的结果。
既然讲到了ctrl+c和crtl+v,那就顺便讲讲为啥会在复制粘贴的过程中出现缩进错乱。
假设你的小伙伴给了你一段代码,他又喜欢使坏,故意将“Tap”键和空格键混用。假设他的电脑设定了“Tab = 4个空格”,而你的电脑设定了“Tap = 8个空格”,(又找到了一个防止抄袭的方法,只不过只能玩一次,一次之后人还在不在我就不知道了 )这时,你就会发现这份代码无法运行。
这就是前面提到的缩进错乱引起的严重结果。
测验如下:(CSDN博客代码片段中的Tap = 4个空格,而我使用的python IDLE中的Tap = 8个空格,代码从CSDN复制到IDLE)
>>> for i in range(2):
print("1") #使用Tap
for i in range(2):
print("2") #使用Tap
1
2
2
1
2
2
#程序在IDLE中可以正常运行
>>> for i in range(2):
print("1") #使用4个空格
for i in range(2):
print("2") #使用4个空格
1
2
2
1
2
2
#程序在IDLE中可以正常运行
>>> for i in range(2):
print("1") #使用Tap
for i in range(2):
print("2") #使用4个空格
SyntaxError: unindent does not match any outer indentation level
#程序在IDLE中报错
既然存在这个问题,那我们就要解决这个问题。
方式1:手动将Tap换成空格或将空格换成Tap。(你行你上啊!!! )
方式2:利用函数expandtabs()预处理代码,将代码中的Tap设定为指定空格数。
使用方法:先将代码存放为字符串code,可以选择程序输入、文件导入、手动添加三引号号等方式。然后new_code = code.expandtabs(空格数),这时new_code中所有的Tap都会被换成指定数量的空格,实现了大一统。(简直就是秦始皇再世 )
>>> code = """for i in range(2):
print("1") #使用Tap
for i in range(2):
print("2") #使用4个空格"""
>>> new_code = code.expandtabs(4) #注意空格数要保持一致,否则就是做无用功
>>> print(new_code)
for i in range(2):
print("1") #Tap变成4个空格
for i in range(2):
print("2") #使用4个空格
>>> for i in range(2): #处理过的代码,可以正常运行
print("1") #Tap变成4个空格
for i in range(2):
print("2") #使用4个空格
1
2
2
1
2
2
方式3:修改所用软件中Tap的值。具体方式自行参考不同软件的使用手册。
敲黑板!!!python是采用冒号+缩进来标示代码块,谨防忘记缩进,避免不必要的缩进,并且同级代码的缩进必须相同,不能多也不能少。谨记Tab和空格不要混用,否则性命难保!