解析Python的縮進(jìn)規(guī)則的使用
Python中的縮進(jìn)(Indentation)決定了代碼的作用域范圍。這一點(diǎn)和傳統(tǒng)的c/c++有很大的不同(傳統(tǒng)的c/c++使用花括號{}符,python使用縮進(jìn)空格)。
每行代碼中開頭的空格數(shù)(whitespace)用于計(jì)算該行代碼的縮進(jìn)級別(Indentation level),注意一個Tab等于8個空格(Space),縮進(jìn)級別為0表示無縮進(jìn)空格。
Python中的每一條語句都有一個縮進(jìn)級別,并且縮進(jìn)級別會使用棧的數(shù)據(jù)結(jié)構(gòu)進(jìn)行存儲。在開始讀取文件之前,0(表示縮進(jìn)級別為0,無縮進(jìn))會被首先壓入棧中。然后從文件開頭到末尾,依次讀取每行邏輯代碼,每行邏輯代碼的縮進(jìn)級別都會和棧頂值進(jìn)行比較,如果相等,那么什么都不會發(fā)生;如果比棧頂值大的話,那么該行邏輯代碼的縮進(jìn)級別就會被壓入棧中,同時(shí)會生成一個縮進(jìn)標(biāo)記(INDENT LEVEL);如果比棧頂值小的話,那么棧中所有比該行邏輯代碼縮進(jìn)級別大的值都會從棧中移除,并且還會生成一個擴(kuò)展標(biāo)記(DEDENT LEVEL)。
下面是一個正確的縮進(jìn)案例:
def perm(l):#0 # Compute the list of all permutations of l if len(l) <= 1:# 1 return [l]# 2 r = []# 3 for i in range(len(l)):# 4 s = l[:i] + l[i+1:]# 5 p = perm(s)# 6 for x in p:# 7 r.append(l[i:i+1] + x)# 8 return r# 9
上面的#0行,縮進(jìn)0個字符,由于文件讀取之前0已經(jīng)被壓入棧中了,所以棧中的數(shù)據(jù)不會發(fā)生改變。#1縮進(jìn)4個字符,4被壓入棧中。#2縮進(jìn)18個字符,18被壓入棧中。#3縮進(jìn)4個字符,18被彈出棧,棧頂值又為4了。#4和#3縮進(jìn)一樣,所以不更新棧數(shù)據(jù)。#5縮進(jìn)13個字符,所以13被壓入棧中。#5、#6和#7的縮進(jìn)一樣,不更新棧數(shù)據(jù)。#8縮進(jìn)14個字符,14被壓入棧中。#9的縮進(jìn)4個字符,所以棧中的13和14都會彈出,棧頂值又恢復(fù)為4。
下面是一個錯誤的案例
def perm(l): #1 error: first line indented for i in range(len(l)): #2 error: not indented s = l[:i] + l[i+1:] p = perm(l[:i] + l[i+1:]) #3 error: unexpected indent for x in p: r.append(l[i:i+1] + x)#4 return r #5 error: inconsistent dedent
#1、#2和#3處的錯誤解釋的很清楚了。#5的縮進(jìn)級別在棧中找不到所以出錯,#5處的縮進(jìn)級別是14,比它的上面一行縮進(jìn)級別18,所以在#5處應(yīng)該進(jìn)行出棧處理,但是在棧中找不到14這個級別,所以出錯。
又比如:
if True: print("hello girl") else: print("hello boy") print("end")
最后一行代碼的縮進(jìn)級別是1,而且比上一行代碼的縮進(jìn)級別小,所以應(yīng)該出棧處理,但是在出站的時(shí)候找不到棧中以前有1的級別,所以報(bào)錯。
要修改的話,只需要將最后一行的空格去掉就可以。
參考文章:https://docs.python.org/2.0/ref/indentation.html
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決python將xml格式文件轉(zhuǎn)換成txt文件的問題(xml.etree方法)
從數(shù)據(jù)分析的角度去看xml格式的數(shù)據(jù)集,具有簡單性,結(jié)構(gòu)和內(nèi)容分離、可擴(kuò)展性的特征,今天通過本文給大家分享python將xml格式文件轉(zhuǎn)換成txt文件的問題及解決方法(xml.etree方法),感興趣的朋友一起看看吧2021-09-09python3實(shí)現(xiàn)二叉樹的遍歷與遞歸算法解析(小結(jié))
這篇文章主要介紹了python3實(shí)現(xiàn)二叉樹的遍歷與遞歸算法解析(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python首次安裝后運(yùn)行報(bào)錯(0xc000007b)的解決方法
最近在安裝完P(guān)ython后運(yùn)行發(fā)現(xiàn)居然報(bào)錯了,錯誤代碼是0xc000007b,于是通過往上查找發(fā)現(xiàn)是因?yàn)槭状伟惭bPython缺乏VC++庫的原因,下面通過這篇文章看看如何解決這個問題吧。2016-10-10Python中zip()函數(shù)用法實(shí)例教程
這篇文章主要介紹了Python中zip()函數(shù)用法實(shí)例教程,對Python初學(xué)者有一定的借鑒價(jià)值,需要的朋友可以參考下2014-07-07Python+Tableau廣東省人口普查可視化的實(shí)現(xiàn)
本文將結(jié)合實(shí)例代碼,介紹Python+Tableau廣東省人口普查可視化,第七次人口普查數(shù)據(jù)分析,繪制歷次人口普查人口數(shù)量變化圖,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06詳解Python GUI編程之PyQt5入門到實(shí)戰(zhàn)
這篇文章主要介紹了詳解Python GUI編程之PyQt5入門到實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12