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