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)格。
我們?cè)賮?lái)看看其他編程語(yǔ)言的縮進(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.
這與你受到的打擊有多大無(wú)關(guān),
這一切都取決于你是否能在打擊后繼續(xù)前進(jìn)。
---------逆境清醒
用C語(yǔ)言實(shí)現(xiàn):
C語(yǔ)言:
#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("這與你受到的打擊有多大無(wú)關(guān),\n");
printf("這一切都取決于你是否能在打擊后繼續(xù)前進(jìn)。\n");
printf("---------逆境清醒\n");
return 0;
}用c#語(yǔ)言實(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("這與你受到的打擊有多大無(wú)關(guān),");
Console.WriteLine("這一切都取決于你是否能在打擊后繼續(xù)前進(jìn)。");
Console.WriteLine("---------逆境清醒");
Console.ReadKey();
}
}
}用Java語(yǔ)言實(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("這與你受到的打擊有多大無(wú)關(guān),");
System.out.println("這一切都取決于你是否能在打擊后繼續(xù)前進(jìn)。");
System.out.println("---------逆境清醒");
}
}
由此,我們可以總結(jié)出什么是代碼的縮進(jìn):
代碼縮進(jìn):
縮進(jìn)指的是代碼行開(kāi)縮進(jìn)頭處的空格,縮進(jìn)(indent)是用來(lái)表示邏輯上的從屬關(guān)系的,它有助于讀者更好地理解文章、代碼。在有些編程語(yǔ)言中,使用縮進(jìn)僅僅是為了提高可讀性。
我們可以通過(guò)縮進(jìn),表示邏輯上的從屬關(guān)系;還可以通過(guò)保持統(tǒng)一的縮進(jìn)風(fēng)格,避免寫出歪歪扭扭的垃圾代碼,提高代碼的整潔性和可讀性。
public class Njqxexam {
public static void main(String[] args) {
boolean condition = true;
System.out.println("逆境清醒希望你們無(wú)論條件真假都能做到:");
if (condition) {
System.out.println("眼里有光,可以照亮自己,也能溫暖他人;");
} else {
System.out.println("心中有愛(ài),可以溫柔歲月,也可不負(fù)相遇。");
}
}
}常用的統(tǒng)一進(jìn)方法是:
如果語(yǔ)句B從屬于語(yǔ)句A, 那么語(yǔ)句B的開(kāi)頭,就跟語(yǔ)句A的開(kāi)頭保持某個(gè)固定距離L(如1個(gè)TAB距離或4個(gè)空格的距離或某個(gè)規(guī)定好的距離);
如果語(yǔ)句C從屬于語(yǔ)句B, 那么語(yǔ)句C的開(kāi)頭,就跟語(yǔ)句B的開(kāi)頭保持某個(gè)固定距離L(如1個(gè)TAB距離或4個(gè)空格的距離或某個(gè)規(guī)定好的距離);那么語(yǔ)句C就跟A的開(kāi)頭就會(huì)保持距離2 * L(即2*1個(gè)TAB或者2*4=8個(gè)空格的距離或2*某個(gè)規(guī)定好的距離);

二、Python語(yǔ)言的縮進(jìn)規(guī)則
Python不像其他程序設(shè)計(jì)語(yǔ)言采用大括號(hào)“{}”分隔代碼塊,而是采用代碼縮進(jìn)和冒號(hào)“:”區(qū)分代碼之間的層次。
Python對(duì)代碼的縮進(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)卻是非常重要的,它決定了你的語(yǔ)法是否正確。縮進(jìn)量不同導(dǎo)致的SyntaxError錯(cuò)誤。
2.1、縮進(jìn)的實(shí)現(xiàn)方式
遵循一定的代碼編寫規(guī)則和命名規(guī)范可以使代碼更加規(guī)范化,對(duì)代碼的理解與維護(hù)起到至關(guān)重要的作用。
Python 在語(yǔ)法上使用縮進(jìn)來(lái)確定代碼塊的開(kāi)始和結(jié)束,對(duì)于每一級(jí)縮進(jìn),都應(yīng)該是 4個(gè)空格。在 Pycharm等python編輯工具中,我們可以設(shè)置使用 tab 鍵來(lái)進(jìn)行縮進(jìn)。
Python語(yǔ)言的縮進(jìn)的實(shí)現(xiàn)方式:
♦ 縮進(jìn)可以使用空格或者Tab鍵實(shí)現(xiàn)。
♦ 縮進(jìn)本身是強(qiáng)制性的,但是空格數(shù)量實(shí)際上語(yǔ)法并沒(méi)有做限制。只不過(guò)同級(jí)代碼縮進(jìn)空格一致即可。
♦ 一般我們都是以 4個(gè)空格(即一個(gè)tab鍵) 來(lái)進(jìn)行使用。
♦ Python 3中不允許混合使用Tab和空格縮進(jìn)。
空格和tab符通常都以空白形式顯示。如果混用,代碼容易意混淆,增加維護(hù)及調(diào)試的困難、降低代碼易讀性,因此 Python PEP8 編碼規(guī)范,指導(dǎo)使用4個(gè)空格作為縮進(jìn)。
在Python中,對(duì)于類定義、函數(shù)定義、流程控制語(yǔ)句,以及異常處理語(yǔ)句等,行尾的冒號(hào)和下一行的縮進(jìn)表示一個(gè)代碼塊的開(kāi)始,而縮進(jìn)結(jié)束,則表示一個(gè)代碼塊的結(jié)束。
邏輯行開(kāi)頭的空白符(空格符和制表符)用于計(jì)算該行的縮進(jìn)層級(jí),決定語(yǔ)句組塊。
制表符(從左至右)被替換為一至八個(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)兼容性說(shuō)明: 鑒于非 UNIX 平臺(tái)文本編輯器本身的特性,請(qǐng)勿在源文件中混用制表符和空格符。另外也請(qǐng)注意,不同平臺(tái)有可能會(huì)顯式限制最大縮進(jìn)層級(jí)。
2.1、Python行的縮進(jìn)
Python行的縮進(jìn)是針對(duì)邏輯行的。
所以,判斷縮進(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)無(wú)論是寫成怎樣的縮進(jìn)格式,例如下圖:

邏輯行:這個(gè)語(yǔ)句,雖然書寫為多行,但解釋器進(jìn)行解釋時(shí),只當(dāng)成一個(gè)語(yǔ)句處理,即一個(gè)邏輯行。所以,無(wú)論分開(kāi)的其他行怎么縮進(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è)物理行可以通過(guò)使用"\"號(hào)連接。
3、字典、列表等變量賦值語(yǔ)句,是可以直接書寫為多個(gè)物理行的。
4、導(dǎo)入模塊的邏輯行的“首行”需要頂格書寫,即無(wú)任何縮進(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è)非空白字符下對(duì)齊,或者它可能排在開(kāi)始 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è)非空白字符下對(duì)齊,如下所示
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:
或者它可能排在開(kāi)始 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',
)行首含換頁(yè)符時(shí),縮進(jìn)計(jì)算將忽略該換頁(yè)符。
換頁(yè)符在行首空白符內(nèi)其他位置的效果未定義(例如,可能導(dǎo)致空格計(jì)數(shù)重置為零)。
連續(xù)行的縮進(jìn)層級(jí)以堆棧形式生成 INDENT 和 DEDENT 形符,說(shuō)明如下:
讀取文件第一行前,先向棧推入一個(gè)零值,該零值不會(huì)被移除。
推入棧的層級(jí)值從底至頂持續(xù)增加。
每個(gè)邏輯行開(kāi)頭的行縮進(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)來(lái)表示代碼塊 ??s進(jìn)的空格數(shù)是可變的,但是同一個(gè)代碼塊的語(yǔ)句必須包含相同的縮進(jìn)空格數(shù)。
當(dāng)語(yǔ)句的條件部分足夠長(zhǎng),需要跨多行書寫時(shí),值得注意的是,兩個(gè)字符的關(guān)鍵字(即 )加上一個(gè)空格和一個(gè)左括號(hào)的組合會(huì)為多行條件語(yǔ)句的后續(xù)行創(chuàng)建一個(gè)自然的 4 個(gè)空格縮進(jìn)。這可能會(huì)與嵌套在語(yǔ)句內(nèi)的縮進(jìn)代碼套件產(chǎn)生視覺(jué)沖突,該代碼也會(huì)自然縮進(jìn)到 4 個(gè)空格。此 PEP 對(duì)于如何(或是否)進(jìn)一步在視覺(jué)上將此類條件行與語(yǔ)句內(nèi)的嵌套套件區(qū)分開(kāi)來(lái),沒(méi)有明確立場(chǎng)。在這種情況下,可接受的選項(xiàng)包括但不限于:ifififif
2.2、使用垂直對(duì)齊
使用垂直對(duì)齊縮進(jìn)的正確使用方法:
# “垂直對(duì)齊”
# Aligned with opening delimiter.
# 和開(kāi)頭的分隔符對(duì)齊。
# 與左括號(hào)對(duì)齊
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)的隱式行連接垂直對(duì)齊包裝的元素,或使用懸掛縮進(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.
# 如果不用垂直對(duì)齊(上面推薦的寫法的第一種),就不要在第一行放參數(shù)。
foo = long_function_name(var_one, var_two,
var_three, var_four)
# Wrong:
# 不好的寫法:
# Further indentation required as indentation is not distinguishable.
# 縮進(jìn)不夠就不容易清晰地看出來(lái)函數(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ī)則對(duì)于續(xù)行是可選的。
可選:
# 掛行縮進(jìn)不一定要用4個(gè)空格 foo = long_function_name( var_one, var_two, var_three, var_four)
2.7、if、for等循環(huán)語(yǔ)句的縮進(jìn)
#正確的使用方式:
if True:
print ("今天天晴很好,陽(yáng)光明媚!")
else:
print ("今天陰天。。。")下面的例子縮進(jìn)不一致,會(huì)導(dǎo)致運(yùn)行錯(cuò)誤:
#代碼最后一行語(yǔ)句縮進(jìn)數(shù)的空格數(shù)不一致,會(huì)導(dǎo)致運(yùn)行錯(cuò)誤:
if True:
print ("今天天晴很好,陽(yáng)光明媚!")
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語(yǔ)句的條件部分長(zhǎng)到需要換行寫的時(shí)候,注意可以在兩個(gè)字符關(guān)鍵字的連接處(比如if),增加一個(gè)空格,再增加一個(gè)左括號(hào)來(lái)創(chuàng)造一個(gè)4空格縮進(jìn)的多行條件。這會(huì)與if語(yǔ)句內(nèi)同樣使用4空格縮進(jìn)的代碼產(chǎn)生視覺(jué)沖突。PEP沒(méi)有明確指明要如何區(qū)分i發(fā)的條件代碼和內(nèi)嵌代碼??墒褂玫倪x項(xiàng)包括但不限于下面幾種情況:
#下例展示了if語(yǔ)句縮進(jìn)使用方法:
# No extra indentation.
# 沒(méi)有額外的縮進(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è)注釋,在能提供語(yǔ)法高亮的編輯器中可以有一些區(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.
# 在條件判斷的語(yǔ)句添加額外的縮進(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 數(shù)據(jù)提取及拆分的實(shí)現(xiàn)代碼
這篇文章主要介紹了python 數(shù)據(jù)提取及拆分的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Tensorflow實(shí)現(xiàn)多GPU并行方式
今天小編就為大家分享一篇Tensorflow實(shí)現(xiàn)多GPU并行方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
python數(shù)學(xué)建模之三大模型與十大常用算法詳情
這篇文章主要介紹了python數(shù)學(xué)建模之三大模型與十大常用算法詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感想取得小伙伴可以參考一下2022-07-07
Python3.7 pyodbc完美配置訪問(wèn)access數(shù)據(jù)庫(kù)
最近小編需要學(xué)習(xí)python連接access數(shù)據(jù)庫(kù),發(fā)現(xiàn)很多朋友推薦pyodbc,那么這篇文章就先為大家介紹一下Python3.7下pyodbc的配置方法2019-10-10

