Python 解析Python的縮排規則

2022-05-02 23:24:13 字數 1923 閱讀 3510

python中的縮排(indentation)決定了**的作用域範圍。這一點和傳統的c/c++有很大的不同(傳統的c/c++使用花括號花括號{}符決定作用域的範圍;python使用縮排空格來表示作用域的範圍,相同縮進行的**是處於同一範圍)。

每行**中開頭的空格數(whitespace)用於計算該行**的縮排級別(indentation level),注意乙個tab會被替換為1~8個space(具體的空格數量,不同的編譯器有不同的數量),縮排級別為0表示無縮排空格。

在乙個原始檔不建議同時使用空格和製表縮排符,當使用別人**的時候幾乎是不可能知道別人使用的是空格還是製表符,這時最好統一縮排,在idel編輯器中可以使用 edit > untabify region 將任何製表符轉化為空格。

python中的每一條語句都有乙個縮排級別,並且縮排級別會使用棧的資料結構進行儲存。在開始讀取檔案之前,0(表示縮排級別為0,無縮排)會被首先壓入棧中。然後從檔案開頭到末尾,依次讀取每行邏輯**,每行邏輯**的縮排級別都會和棧頂值進行比較,如果相等,那麼什麼都不會發生;如果比棧頂值大的話,那麼該行邏輯**的縮排級別就會被壓入棧中,同時會生成乙個縮排標記(indent token);如果比棧頂值小的話,那麼棧中所有比該行邏輯**縮排級別大的值都會從棧中移除,並且還會生成乙個擴充套件標記(dedent token)。

下面是乙個正確的縮排案例:

def perm(l):#0#

compute the list of all permutations of l

if len(l) <= 1:#

1return [l]#

2 r = #

3for i in range(len(l)):#

4 s = l[:i] + l[i+1:]#

5 p = perm(s)#

6for x in p:#78

return r#

9

上面的#0行,縮排0個字元,由於檔案讀取之前0已經被壓入棧中了,所以棧中的資料不會發生改變。#1縮排4個字元,4被壓入棧中。#2縮排18個字元,18被壓入棧中。#3縮排4個字元,18被彈出棧,棧頂值又為4了。#4和#3縮排一樣,所以不更新棧資料。#5縮排13個字元,所以13被壓入棧中。#5、#6和#7的縮排一樣,不更新棧資料。#8縮排14個字元,14被壓入棧中。#9的縮排4個字元,所以棧中的13和14都會彈出,棧頂值又恢復為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 inp:4

return r #

5 error: inconsistent dedent

#1、#2和#3處的錯誤解釋的很清楚了。#5的縮排級別在棧中找不到所以出錯,#5處的縮排級別是14,比它的上面一行縮排級別18,所以在#5處應該進行出棧處理,但是在棧中找不到14這個級別,所以出錯。

又比如:

if

true:

print("

hello girl")

else

:

print("

hello boy")

print("

end")

最後一行**的縮排級別是1,而且比上一行**的縮排級別小,所以應該出棧處理,但是在出站的時候找不到棧中以前有1的級別,所以報錯。修改這個錯誤,只需要將最後一行的空格去掉就可以。

python 郵件解析 解析python傳送郵件

獲取郵件伺服器 email host smtp.163.com send user 163.com password x123456 定義傳送郵件主體 def send mail self,user list,sub,content user message mimetext content,sub...

python的解析語法

乙個很常見的變成任務是基於另乙個序列的處理來產生一系列的值。通常,這個任務在python中使用所謂的解析語法後實現很簡單。一般形式如下 expression for value in iterable if condition if子句是可選的。解析計算與下面的傳統控制結構計算結果列表在邏輯上是等價...

Python的容器解析

什麼是容器?容器 儲存大量資料的一種資料型別。容器是一種可以包含其他型別物件 如列表 元組 字典等 作為元素的物件。在python中容器有很多,今天我們主要學習其中我們最常用的四種 列表 list 集合 set 元組 tuple 字典 dict 一 列表 list python提供的列表這種容器,是...