python代碼中的縮進規(guī)則詳細解釋(史上最全)
一、什么是代碼的縮進
大家在學習編程時,是愿意看到下面范例中的A范例代碼還是B范例代碼呢?
答案應該是一致的,大家肯定都喜歡閱讀B范例的代碼,因為它看上去更加規(guī)整,這是一種最基本的代碼編寫規(guī)范。
A、縮進格式不好的范例 public class HelloWorld { public static void main(String []args) { System.out.println("Adversity Awake!"); } }
B、縮進好的范例 public class HelloWorld { public static void main(String []args) { System.out.println("Adversity Awake!"); } }
B范例的代碼使用了較好的代碼縮進規(guī)范,層次清楚,可讀性強,所以我們會喜歡這種代碼編寫風格。
我們再來看看其他編程語言的縮進例子:
例如我想輸出下面這幾行內(nèi)容:
It has nothing to do with how hard you've been hit,
It's all about whether you can push on after the blow.
這與你受到的打擊有多大無關,
這一切都取決于你是否能在打擊后繼續(xù)前進。
---------逆境清醒
用C語言實現(xiàn):
C語言: #include <stdio.h> int main() { printf("It has nothing to do with how hard you've been hit,\n"); printf("It's all about whether you can push on after the blow.\n"); printf("這與你受到的打擊有多大無關,\n"); printf("這一切都取決于你是否能在打擊后繼續(xù)前進。\n"); printf("---------逆境清醒\n"); return 0; }
用c#語言實現(xiàn):
using System; namespace njqxSayApplication { class njqx { static void Main(string[] args) { Console.WriteLine("It has nothing to do with how hard you've been hit,"); Console.WriteLine("It's all about whether you can push on after the blow."); Console.WriteLine("這與你受到的打擊有多大無關,"); Console.WriteLine("這一切都取決于你是否能在打擊后繼續(xù)前進。"); Console.WriteLine("---------逆境清醒"); Console.ReadKey(); } } }
用Java語言實現(xiàn)
public class njqx { public static void main(String []args) { System.out.println("It has nothing to do with how hard you've been hit,"); System.out.println("It's all about whether you can push on after the blow."); System.out.println("這與你受到的打擊有多大無關,"); System.out.println("這一切都取決于你是否能在打擊后繼續(xù)前進。"); System.out.println("---------逆境清醒"); } }
由此,我們可以總結(jié)出什么是代碼的縮進:
代碼縮進:
縮進指的是代碼行開縮進頭處的空格,縮進(indent)是用來表示邏輯上的從屬關系的,它有助于讀者更好地理解文章、代碼。在有些編程語言中,使用縮進僅僅是為了提高可讀性。
我們可以通過縮進,表示邏輯上的從屬關系;還可以通過保持統(tǒng)一的縮進風格,避免寫出歪歪扭扭的垃圾代碼,提高代碼的整潔性和可讀性。
public class Njqxexam { public static void main(String[] args) { boolean condition = true; System.out.println("逆境清醒希望你們無論條件真假都能做到:"); if (condition) { System.out.println("眼里有光,可以照亮自己,也能溫暖他人;"); } else { System.out.println("心中有愛,可以溫柔歲月,也可不負相遇。"); } } }
常用的統(tǒng)一進方法是:
如果語句B從屬于語句A, 那么語句B的開頭,就跟語句A的開頭保持某個固定距離L(如1個TAB距離或4個空格的距離或某個規(guī)定好的距離);
如果語句C從屬于語句B, 那么語句C的開頭,就跟語句B的開頭保持某個固定距離L(如1個TAB距離或4個空格的距離或某個規(guī)定好的距離);那么語句C就跟A的開頭就會保持距離2 * L(即2*1個TAB或者2*4=8個空格的距離或2*某個規(guī)定好的距離);
二、Python語言的縮進規(guī)則
Python不像其他程序設計語言采用大括號“{}”分隔代碼塊,而是采用代碼縮進和冒號“:”區(qū)分代碼之間的層次。
Python對代碼的縮進要求非常嚴格,同一個python程序文件中,同一個級別的代碼塊的縮進量必須相同。如果不采用合理的代碼縮進,系統(tǒng)編譯時將拋出SyntaxError異常。例,代碼中有的縮進量是4個空格,有的縮進量是3個空格,系統(tǒng)就會出現(xiàn)SyntaxError錯誤。
python 中這個縮進卻是非常重要的,它決定了你的語法是否正確。縮進量不同導致的SyntaxError錯誤。
2.1、縮進的實現(xiàn)方式
遵循一定的代碼編寫規(guī)則和命名規(guī)范可以使代碼更加規(guī)范化,對代碼的理解與維護起到至關重要的作用。
Python 在語法上使用縮進來確定代碼塊的開始和結(jié)束,對于每一級縮進,都應該是 4個空格。在 Pycharm等python編輯工具中,我們可以設置使用 tab 鍵來進行縮進。
Python語言的縮進的實現(xiàn)方式:
♦ 縮進可以使用空格或者Tab鍵實現(xiàn)。
♦ 縮進本身是強制性的,但是空格數(shù)量實際上語法并沒有做限制。只不過同級代碼縮進空格一致即可。
♦ 一般我們都是以 4個空格(即一個tab鍵) 來進行使用。
♦ Python 3中不允許混合使用Tab和空格縮進。
空格和tab符通常都以空白形式顯示。如果混用,代碼容易意混淆,增加維護及調(diào)試的困難、降低代碼易讀性,因此 Python PEP8 編碼規(guī)范,指導使用4個空格作為縮進。
在Python中,對于類定義、函數(shù)定義、流程控制語句,以及異常處理語句等,行尾的冒號和下一行的縮進表示一個代碼塊的開始,而縮進結(jié)束,則表示一個代碼塊的結(jié)束。
邏輯行開頭的空白符(空格符和制表符)用于計算該行的縮進層級,決定語句組塊。
制表符(從左至右)被替換為一至八個空格,縮進空格的總數(shù)是八的倍數(shù)(與 Unix 的規(guī)則保持一致)。
首個非空字符前的空格數(shù)決定了該行的縮進層次。
縮進不能用反斜杠進行多行拼接;
首個反斜杠之前的空白符決定了縮進的層次。
源文件混用制表符和空格符縮進時,因空格數(shù)量與制表符相關,由此產(chǎn)生的不一致將導致不能正常識別縮 進層次,從而觸發(fā) TabError。
跨平臺兼容性說明: 鑒于非 UNIX 平臺文本編輯器本身的特性,請勿在源文件中混用制表符和空格符。另外也請注意,不同平臺有可能會顯式限制最大縮進層級。
2.1、Python行的縮進
Python行的縮進是針對邏輯行的。
所以,判斷縮進是否正確,首先要區(qū)分物理行和邏輯行。
2.1.1、物理行
物理行:代碼編輯器中顯示的代碼,每一行內(nèi)容是一個物理行。包括空行。
以下代碼代碼一共有7行,即有7個物理行。
#!/usr/bin/python njstr1="人的一生會遇到兩個人," njstr2="一個驚艷了時光," njstr3="一個溫柔了歲月。" print(njstr1,njstr2,njstr3)
代碼運行后輸出結(jié)果:
人的一生會遇到兩個人, 一個驚艷了時光, 一個溫柔了歲月。
2.1.2、邏輯行
代碼:
jiang={ "njstr1":"人的一生會遇到兩個人", "njstr2":"一個驚艷了時光", "njstr3":"一個溫柔了歲月"} print(jiang)
無論是寫成怎樣的縮進格式,例如下圖:
邏輯行:這個語句,雖然書寫為多行,但解釋器進行解釋時,只當成一個語句處理,即一個邏輯行。所以,無論分開的其他行怎么縮進,都不會影響程序運行結(jié)果。
最后代碼運行后輸出的結(jié)果都是同樣的:
{'njstr1': '人的一生會遇到兩個人', 'njstr2': '一個驚艷了時光', 'njstr3': '一個溫柔了歲月'}
2.1.3、物理行邏輯行縮進方法總結(jié)
python代碼中
1、可以使用";"號將兩個或多個邏輯行合并成一個物理行。
2、兩個物理行可以通過使用"\"號連接。
3、字典、列表等變量賦值語句,是可以直接書寫為多個物理行的。
4、導入模塊的邏輯行的“首行”需要頂格書寫,即無任何縮進
5、相同邏輯層應該保持相同的縮進
6、":"標記代表一個新的邏輯層, 這時增加縮進的:代表進入下一個級別的代碼層,減少縮進:代表返回上一個級別的代碼層7、多行結(jié)構(gòu)上的右大括號/方括號/括號可以在列表最后一行的第一個非空白字符下對齊,或者它可能排在開始 Multiline 結(jié)構(gòu)的行的第一個字符下
The closing brace/bracket/parenthesis on multiline constructs may either line up under the first non-whitespace character of the last line of list, as in: 多行結(jié)構(gòu)上的右大括號/方括號/括號可以在列表最后一行的第一個非空白字符下對齊,如下所示 my_list = [ 1, 2, 3, 4, 5, 6, ] result = some_function_that_takes_arguments( 'a', 'b', 'c', 'd', 'e', 'f', ) or it may be lined up under the first character of the line that starts the multiline construct, as in: 或者它可能排在開始 Multiline 結(jié)構(gòu)的行的第一個字符下,(右括號回退),如下所示: my_list = [ 1, 2, 3, 4, 5, 6, ] result = some_function_that_takes_arguments( 'a', 'b', 'c', 'd', 'e', 'f', )
行首含換頁符時,縮進計算將忽略該換頁符。
換頁符在行首空白符內(nèi)其他位置的效果未定義(例如,可能導致空格計數(shù)重置為零)。
連續(xù)行的縮進層級以堆棧形式生成 INDENT 和 DEDENT 形符,說明如下:
讀取文件第一行前,先向棧推入一個零值,該零值不會被移除。
推入棧的層級值從底至頂持續(xù)增加。
每個邏輯行開頭的行縮進層級將與棧頂行比較。如果相等,則不做處理。如果新行層級較高,則會被推入棧頂,并生成一個 INDENT 形符。如果新行層級較低,則 應當 是棧中的層級數(shù)值之一;棧中高于該層級的所有數(shù)值都將被移除,每移除一級數(shù)值生成一個 DEDENT 形符。文件末尾,棧中剩余的每個大于零的數(shù)值生成一個 DEDENT 形符。
python使用縮進來表示代碼塊 。縮進的空格數(shù)是可變的,但是同一個代碼塊的語句必須包含相同的縮進空格數(shù)。
當語句的條件部分足夠長,需要跨多行書寫時,值得注意的是,兩個字符的關鍵字(即 )加上一個空格和一個左括號的組合會為多行條件語句的后續(xù)行創(chuàng)建一個自然的 4 個空格縮進。這可能會與嵌套在語句內(nèi)的縮進代碼套件產(chǎn)生視覺沖突,該代碼也會自然縮進到 4 個空格。此 PEP 對于如何(或是否)進一步在視覺上將此類條件行與語句內(nèi)的嵌套套件區(qū)分開來,沒有明確立場。在這種情況下,可接受的選項包括但不限于:ifififif
2.2、使用垂直對齊
使用垂直對齊縮進的正確使用方法:
# “垂直對齊” # Aligned with opening delimiter. # 和開頭的分隔符對齊。 # 與左括號對齊 foo = long_function_name(var_one, var_two, var_three, var_four)
2.3、使用額外的縮進級別
使用額外的縮進級別形式,
方法:添加 4 個空格(額外的縮進級別)以區(qū)分參數(shù)和其他參數(shù)。
# Add 4 spaces (an extra level of indentation) to distinguish arguments from the rest. # 添加 4 個空格(額外的縮進級別)以區(qū)分參數(shù)和其他參數(shù)。 def long_function_name( var_one, var_two, var_three, var_four): print(var_one)
2.4、使用懸掛縮進
每個縮進級別使用 4 個空格。
連續(xù)行應使用 Python 的括號、方括號和大括號內(nèi)的隱式行連接垂直對齊包裝的元素,或使用懸掛縮進。
使用懸掛縮進時,應考慮以下因素:
- 第一行不應有參數(shù),
- 并且應使用進一步的縮進以清楚地區(qū)分自己作為連續(xù)行:
# Hanging indents should add a level. # 懸掛縮進應增加一個級別。 foo = long_function_name( var_one, var_two, var_three, var_four)
2.5、不推薦的錯誤縮進寫法
# Wrong: # 不好的寫法: # Arguments on first line forbidden when not using vertical alignment. # 如果不用垂直對齊(上面推薦的寫法的第一種),就不要在第一行放參數(shù)。 foo = long_function_name(var_one, var_two, var_three, var_four) # Wrong: # 不好的寫法: # Further indentation required as indentation is not distinguishable. # 縮進不夠就不容易清晰地看出來函數(shù)名和參數(shù)的區(qū)別。 def long_function_name( var_one, var_two, var_three, var_four): print(var_one)
2.6、掛行縮進不一定要用4個空格
四空格的規(guī)則對于續(xù)行是可選的。
可選:
# 掛行縮進不一定要用4個空格 foo = long_function_name( var_one, var_two, var_three, var_four)
2.7、if、for等循環(huán)語句的縮進
#正確的使用方式: if True: print ("今天天晴很好,陽光明媚!") else: print ("今天陰天。。。")
下面的例子縮進不一致,會導致運行錯誤:
#代碼最后一行語句縮進數(shù)的空格數(shù)不一致,會導致運行錯誤: if True: print ("今天天晴很好,陽光明媚!") else: print ("今天陰天。。。") # 縮進不一致,會導致運行錯誤
下面的 Python 代碼縮進示例雖然正確,但含混不清:
#下面的 Python 代碼縮進示例雖然正確,但含混不清: def perm(l): # Compute the list of all permutations of l if len(l) <= 1: return [l] r = [] for i in range(len(l)): s = l[:i] + l[i+1:] p = perm(s) for x in p: r.append(l[i:i+1] + x) return r
下例展示了多種縮進錯誤:
#下例展示了多種縮進錯誤: def perm(l): # error: first line indented for i in range(len(l)): # error: not indented s = l[:i] + l[i+1:] p = perm(l[:i] + l[i+1:]) # error: unexpected indent for x in p: r.append(l[i:i+1] + x) return r # error: inconsistent dedent
當if語句的條件部分長到需要換行寫的時候,注意可以在兩個字符關鍵字的連接處(比如if),增加一個空格,再增加一個左括號來創(chuàng)造一個4空格縮進的多行條件。這會與if語句內(nèi)同樣使用4空格縮進的代碼產(chǎn)生視覺沖突。PEP沒有明確指明要如何區(qū)分i發(fā)的條件代碼和內(nèi)嵌代碼??墒褂玫倪x項包括但不限于下面幾種情況:
#下例展示了if語句縮進使用方法: # No extra indentation. # 沒有額外的縮進 if (this_is_one_thing and that_is_another_thing): do_something() # Add a comment, which will provide some distinction in editors # supporting syntax highlighting. # 增加一個注釋,在能提供語法高亮的編輯器中可以有一些區(qū)分 if (this_is_one_thing and that_is_another_thing): # Since both conditions are true, we can frobnicate. do_something() # Add some extra indentation on the conditional continuation line. # 在條件判斷的語句添加額外的縮進 if (this_is_one_thing and that_is_another_thing): do_something()
三、參考資料:
https://peps.python.org/pep-0008/
總結(jié)
到此這篇關于python代碼中的縮進規(guī)則詳細解釋的文章就介紹到這了,更多相關python代碼縮進規(guī)則內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python 數(shù)據(jù)提取及拆分的實現(xiàn)代碼
這篇文章主要介紹了python 數(shù)據(jù)提取及拆分的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08Python3.7 pyodbc完美配置訪問access數(shù)據(jù)庫
最近小編需要學習python連接access數(shù)據(jù)庫,發(fā)現(xiàn)很多朋友推薦pyodbc,那么這篇文章就先為大家介紹一下Python3.7下pyodbc的配置方法2019-10-10