最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python縮進(jìn)規(guī)則與代碼塊規(guī)范的實(shí)現(xiàn)

 更新時(shí)間:2026年06月22日 09:55:38   作者:星河耀銀海  
本文介紹了Python中獨(dú)特的縮進(jìn)規(guī)則與代碼塊規(guī)范,Python通過縮進(jìn)而非花括號劃分代碼塊,強(qiáng)制代碼風(fēng)格統(tǒng)一,文章還列舉了常見的縮進(jìn)錯(cuò)誤,感興趣的可以了解一下

一、開篇:Python最獨(dú)特的設(shè)計(jì)

如果你問我Python和其他編程語言最明顯的區(qū)別是什么,我會毫不猶豫地說:縮進(jìn)。

在C、Java、JavaScript等大多數(shù)語言中,縮進(jìn)只是"看起來好看"的可選格式,實(shí)際的代碼塊靠花括號 {} 來劃分。這些語言中,你把代碼全寫在一行也是合法的(只是沒人這么寫)。

但在Python中,縮進(jìn)就是語法本身。代碼塊的劃分、語句的歸屬關(guān)系,全靠縮進(jìn)來決定。這個(gè)設(shè)計(jì)非常大膽,問世之初爭議很大,但事實(shí)證明它是Python成功的關(guān)鍵原因之一。

?? 縮進(jìn)強(qiáng)制代碼看起來整潔。你在任何地方看到的Python代碼,都有著高度一致的視覺風(fēng)格。這是一種"代碼可讀性"的制度性保障。

二、縮進(jìn)的基本規(guī)則

2.1 用空格還是Tab

這是Python社區(qū)最經(jīng)典的"圣戰(zhàn)"話題之一。答案是:

? PEP 8(Python官方代碼風(fēng)格指南)推薦使用4個(gè)空格

# 推薦:4個(gè)空格
if True:
    print('縮進(jìn)了4個(gè)空格')

# 不推薦:Tab
if True:
	print('縮進(jìn)了1個(gè)Tab')

?? 關(guān)鍵規(guī)則:不要混用空格和Tab! 在一個(gè)文件中,要么全用空格,要么全用Tab?;煊脮?dǎo)致 TabError: inconsistent use of tabs and spaces in indentation。

所有現(xiàn)代Python IDE(PyCharm、VS Code)在你按Tab鍵時(shí)默認(rèn)插入4個(gè)空格而不是Tab字符。這個(gè)設(shè)置一般在IDE的"縮進(jìn)"選項(xiàng)中可以看到。

2.2 縮進(jìn)層級

同一個(gè)代碼塊中的所有語句必須使用相同數(shù)量的縮進(jìn)

# ? 正確:同一代碼塊使用相同的縮進(jìn)(4個(gè)空格)
if True:
    print('第一條語句')
    print('第二條語句')
    print('第三條語句')

# ? 錯(cuò)誤:同一個(gè)代碼塊縮進(jìn)不一致
if True:
    print('第一條語句')
      print('第二條語句')  # 縮進(jìn)多了2個(gè)空格,報(bào)錯(cuò)!
    print('第三條語句')

2.3 什么情況下需要縮進(jìn)

以下Python語句后面需要縮進(jìn),因?yàn)樗鼈兌紩胍粋€(gè)新的代碼塊:

關(guān)鍵字場景示例
if/elif/else條件判斷if x > 0:
for/while循環(huán)for i in range(10):
def函數(shù)定義def my_function():
class類定義class MyClass:
try/except/finally異常處理try:
with上下文管理器with open('file'):
match/case模式匹配match value:

這些關(guān)鍵字后面都有一個(gè)冒號 :,冒號就是"接下來要縮進(jìn)"的信號。

# 冒號后面必須縮進(jìn)
if score >= 60:         # 冒號
    print('及格')       # 縮進(jìn)4個(gè)空格,屬于if代碼塊

print('判斷結(jié)束')       # 沒有縮進(jìn),不屬于if代碼塊

三、縮進(jìn)的嵌套

3.1 多層縮進(jìn)

當(dāng)代碼邏輯嵌套時(shí),每嵌套一層就增加一級縮進(jìn):

def analyze_score(name, score):
    """分析學(xué)生成績"""
    if score >= 60:                          # 0級縮進(jìn)(函數(shù)內(nèi)第1層)
        print(f'{name} 及格了')               # 1級縮進(jìn)(if內(nèi))
        if score >= 90:                      # 1級縮進(jìn)(if內(nèi),另一個(gè)if)
            print('太棒了,成績優(yōu)秀!')        # 2級縮進(jìn)(內(nèi)層if內(nèi))
            if score == 100:                 # 2級縮進(jìn)(內(nèi)層if內(nèi))
                print('滿分!你是傳奇!')       # 3級縮進(jìn)
        elif score >= 80:                    # 1級縮進(jìn)
            print('成績良好,繼續(xù)加油!')       # 2級縮進(jìn)
        else:                                # 1級縮進(jìn)
            print('成績及格,還有提升空間')     # 2級縮進(jìn)
    else:                                    # 0級縮進(jìn)
        print(f'{name} 不及格,需要努力!')    # 1級縮進(jìn)
        if score < 30:                       # 1級縮進(jìn)
            print('成績太低,建議找老師輔導(dǎo)')   # 2級縮進(jìn)

    # 0級縮進(jìn)——回到函數(shù)體層級
    print(f'{name} 的成績分析完畢')           # 1級縮進(jìn)


# 調(diào)用函數(shù)
analyze_score('小明', 95)

?? 縮進(jìn)就像俄羅斯套娃。外層套內(nèi)層,內(nèi)層再套內(nèi)層。縮進(jìn)級別告訴你"當(dāng)前代碼屬于哪一層"。

3.2 縮進(jìn)的可視化理解

把上面的代碼用方括號標(biāo)注一下代碼塊的邊界:

def analyze_score(name, score):
│   如果 score >= 60:
│   │   print('及格')
│   │   如果 score >= 90:
│   │   │   print('優(yōu)秀')
│   │   │   如果 score == 100:
│   │   │   │   print('滿分')
│   │   否則如果 score >= 80:
│   │   │   print('良好')
│   │   否則:
│   │   │   print('及格')
│   否則:
│   │   print('不及格')
│   │   如果 score < 30:
│   │   │   print('太低')
│   print('分析完畢')

每個(gè) 代表一級縮進(jìn)。同一豎線上的代碼屬于同一代碼塊。

四、常見的縮進(jìn)錯(cuò)誤

4.1 IndentationError: expected an indented block

這個(gè)錯(cuò)誤發(fā)生在:寫了冒號,但下一行沒有縮進(jìn)。

>>> if True:
>>> print('hello')
# IndentationError: expected an indented block

? 解決方法:在冒號后面按回車,然后加上縮進(jìn):

if True:
    print('hello')

4.2 IndentationError: unexpected indent

這個(gè)錯(cuò)誤發(fā)生在:不該縮進(jìn)的地方縮進(jìn)了。

>>> print('hello')
>>>     print('world')
# IndentationError: unexpected indent

通常出現(xiàn)在縮進(jìn)層級搞混的時(shí)候:

# ? 錯(cuò)誤:第二個(gè)print不應(yīng)該縮進(jìn)
def greet():
    print('hello')
        print('world')  # 這一行多縮進(jìn)了!

# ? 正確:同級代碼使用相同的縮進(jìn)
def greet():
    print('hello')
    print('world')

4.3 TabError: inconsistent use of tabs and spaces

混用了Tab和空格:

# ? 第2行用了Tab,第3行用了空格——混用了!
if True:
	print('用Tab縮進(jìn)')   # Tab
    print('用空格縮進(jìn)')   # 4個(gè)空格

? 現(xiàn)代的IDE通常會自動(dòng)統(tǒng)一縮進(jìn)方式。如果你手動(dòng)用文本編輯器寫代碼,建議設(shè)置編輯器"將Tab轉(zhuǎn)換為空格"。

4.4 縮進(jìn)導(dǎo)致的邏輯錯(cuò)誤

這是最隱蔽的一類錯(cuò)誤——代碼能正常運(yùn)行,但邏輯和你想的不一樣:

# 你能看出這個(gè)程序的bug嗎?
total = 0
for i in range(1, 11):
    total += i
    print(f'當(dāng)前累加到{i},總和為{total}')
    print('循環(huán)體內(nèi)的最后一行')

print(f'最終結(jié)果:{total}')

上面這段是正確的。但看下面這個(gè):

# 這個(gè)程序的輸出和你想的一樣嗎?
total = 0
for i in range(1, 11):
    total += i
print(f'當(dāng)前累加到{i},總和為{total}')    # 注意:這行在循環(huán)外面!
print('循環(huán)結(jié)束')

第二個(gè)程序中,print 語句沒有縮進(jìn)在循環(huán)內(nèi)部,所以它只會在循環(huán)完全結(jié)束之后執(zhí)行一次,而不是每次循環(huán)都執(zhí)行。但代碼不會報(bào)錯(cuò)——這是個(gè)邏輯bug。

五、代碼塊:Python的組織單元

5.1 什么是一個(gè)代碼塊

代碼塊是一組邏輯相關(guān)的語句,它們有相同的縮進(jìn)級別。每當(dāng)Python遇到一個(gè)冒號,它就期待下面出現(xiàn)一個(gè)縮進(jìn)的代碼塊。

# if語句引入的代碼塊
if condition:
    statement1     # 這兩行有相同的縮進(jìn),
    statement2     # 它們屬于同一個(gè)代碼塊

# for循環(huán)引入的代碼塊
for item in sequence:
    process(item)  # 循環(huán)體代碼塊
    log(item)

# 函數(shù)定義引入的代碼塊
def my_function():
    setup()        # 函數(shù)體代碼塊
    result = calculate()
    return result

5.2 代碼塊可以嵌套

def outer_function():
    """外層函數(shù)"""
    print('進(jìn)入外層函數(shù)')

    def inner_function():
        """內(nèi)層函數(shù)——嵌套在外層函數(shù)內(nèi)部"""
        print('進(jìn)入內(nèi)層函數(shù)')
        for i in range(3):
            print(f'內(nèi)層循環(huán):{i}')
        print('離開內(nèi)層函數(shù)')

    print('調(diào)用內(nèi)層函數(shù)之前')
    inner_function()
    print('離開外層函數(shù)')

outer_function()

輸出:

進(jìn)入外層函數(shù)
調(diào)用內(nèi)層函數(shù)之前
進(jìn)入內(nèi)層函數(shù)
內(nèi)層循環(huán):0
內(nèi)層循環(huán):1
內(nèi)層循環(huán):2
離開內(nèi)層函數(shù)
離開外層函數(shù)

?? 這個(gè)例子展示了幾層嵌套:外層函數(shù)體內(nèi)有內(nèi)層函數(shù)定義,內(nèi)層函數(shù)體內(nèi)有for循環(huán),for循環(huán)體內(nèi)有print語句。每一層都對應(yīng)一級縮進(jìn)。

5.3 空代碼塊:pass語句

有時(shí)你需要一個(gè)代碼塊占位(函數(shù)還沒想好怎么寫),但不能讓它空著。這時(shí)用 pass

# ? 錯(cuò)誤:代碼塊為空
def function_not_ready_yet():
    # 這里什么也沒有——報(bào)錯(cuò)!

# ? 正確:用pass占位
def function_not_ready_yet():
    pass    # 占位符,表示"這里以后會寫代碼"

# pass的其他使用場景
if condition_not_met_yet:
    pass    # 暫時(shí)不知道條件滿足時(shí)該做什么

class FutureClass:
    pass    # 類的骨架,以后再填充

for item in large_list:
    if item is None:
        pass    # 跳過None值,不做任何處理
    else:
        process(item)

六、PEP 8縮進(jìn)規(guī)范詳解

PEP 8是Python的官方代碼風(fēng)格指南,它關(guān)于縮進(jìn)有以下規(guī)定:

6.1 基本規(guī)則

  • 每個(gè)縮進(jìn)級別使用4個(gè)空格
  • 不要使用Tab,或者在IDE中設(shè)置Tab自動(dòng)轉(zhuǎn)4個(gè)空格
  • 同一文件中保持縮進(jìn)方式一致

6.2 續(xù)行縮進(jìn)

當(dāng)一行代碼太長需要換行時(shí),續(xù)行有兩種縮進(jìn)方式:

方式一:與開括號對齊

# 續(xù)行與第一個(gè)括號后面的內(nèi)容對齊
result = some_function(param_one, param_two,
                       param_three, param_four)

方式二:懸掛縮進(jìn)

# 續(xù)行額外縮進(jìn)一級(4個(gè)空格)
result = some_function(
    param_one, param_two,
    param_three, param_four
)

兩者都可以,但在同一個(gè)項(xiàng)目中要保持一致。

6.3 長if語句的換行

# 當(dāng)if條件太長時(shí)
if (student_score >= 60
        and student_attendance >= 0.8
        and not student_is_suspended
        and course_is_available):
    print('該學(xué)生可以參加期末考試')

用括號把條件包裹起來,然后在合適的位置換行。注意續(xù)行要額外縮進(jìn)以示區(qū)分。

6.4 空行的使用

PEP 8不僅定義了縮進(jìn),還定義了空行的使用:

import os
import sys
                                # 兩個(gè)空行
class MyClass:
    """類的文檔字符串"""
                                # 一個(gè)空行
    def __init__(self):
        self.data = []
                                # 一個(gè)空行
    def add_data(self, item):
        """添加數(shù)據(jù)"""
        self.data.append(item)
                                # 一個(gè)空行
    def get_data(self):
        """獲取數(shù)據(jù)"""
        return self.data
                                # 兩個(gè)空行
def standalone_function():
    """獨(dú)立的函數(shù)"""
    pass

規(guī)則總結(jié):

  • 頂層函數(shù)和類之間:兩個(gè)空行
  • 類中的方法之間:一個(gè)空行
  • 函數(shù)/方法內(nèi)部邏輯段落之間:一個(gè)空行

七、不同語言縮進(jìn)對比

了解其他語言的做法,能幫助你更好地理解Python為什么選擇縮進(jìn)作為語法:

C語言——花括號,縮進(jìn)可選:

if (x > 0) {
    printf("positive\n");
    printf("this is inside if\n");
}
printf("this is outside if\n");

Java語言——花括號,縮進(jìn)可選:

if (x > 0) {
    System.out.println("positive");
}

Python——縮進(jìn)就是語法:

if x > 0:
    print('positive')

在C/Java中,下面的兩種寫法都是合法的(雖然第二種很難看):

// 寫法一(正常)
if (x > 0) {
    printf("yes");
}

// 寫法二(合法但不推薦)
if (x > 0) { printf("yes"); }

但在Python中,你不能省略縮進(jìn)來壓縮代碼——縮進(jìn)是語法的一部分,不是可選的格式。

?? 這種設(shè)計(jì)帶來的好處是:你看到的代碼結(jié)構(gòu)和代碼的實(shí)際結(jié)構(gòu)永遠(yuǎn)是一致的。不存在"縮進(jìn)看起來在循環(huán)里,但代碼實(shí)際在循環(huán)外"的情況。在C/Java中,這種縮進(jìn)和實(shí)際結(jié)構(gòu)不一致的問題是很多bug的來源。

八、IDE中的縮進(jìn)助手

8.1 VS Code中的縮進(jìn)設(shè)置

在VS Code中,打開 設(shè)置,搜索"縮進(jìn)":

{
    "[python]": {
        "editor.tabSize": 4,
        "editor.insertSpaces": true,
        "editor.detectIndentation": true
    },
    "editor.renderWhitespace": "boundary"
}
  • tabSize: 4:Tab鍵插入/刪除4個(gè)空格
  • insertSpaces: true:按Tab鍵插入空格而非Tab字符
  • detectIndentation: true:自動(dòng)檢測文件的縮進(jìn)風(fēng)格

8.2 PyCharm中的縮進(jìn)設(shè)置

文件 → 設(shè)置 → 編輯器 → 代碼風(fēng)格 → Python

Tab大?。?
縮進(jìn):4
續(xù)行縮進(jìn):8
使用Tab字符:[取消勾選]

8.3 可視化空格

建議在編輯器中開啟"顯示空白字符"的功能,這樣你就能看到每個(gè)空格和Tab:

  • VS Code:View → Render Whitespace
  • PyCharm:View → Active Editor → Show Whitespaces

開啟后,空格顯示為灰色小點(diǎn)(·),Tab顯示為灰色箭頭()。

九、實(shí)戰(zhàn):重構(gòu)混亂縮進(jìn)的代碼

9.1 原始混亂代碼

def process_students(students):
    passed = []
failed = []
for student in students:
        if student['score'] >= 60:
            passed.append(student)
    else:
        failed.append(student)
    return passed, failed

這段代碼縮進(jìn)混亂,運(yùn)行會報(bào) IndentationError

9.2 修復(fù)后的代碼

def process_students(students):
    """處理學(xué)生列表,分開及格和不及格的學(xué)生"""
    passed = []
    failed = []

    for student in students:
        if student['score'] >= 60:
            passed.append(student)
        else:
            failed.append(student)

    return passed, failed


# 測試
students = [
    {'name': '小明', 'score': 85},
    {'name': '小紅', 'score': 42},
    {'name': '小剛', 'score': 96},
    {'name': '小麗', 'score': 58},
]

passed, failed = process_students(students)
print(f'及格的學(xué)生:{[s["name"] for s in passed]}')
print(f'不及格的學(xué)生:{[s["name"] for s in failed]}')

9.3 使用IDE自動(dòng)格式化

選中所有代碼,按 Ctrl + Alt + L(PyCharm)或 Shift + Alt + F(VS Code),IDE會自動(dòng)修復(fù)縮進(jìn)問題。

?? 養(yǎng)成一個(gè)好習(xí)慣:寫完一段代碼后,按快捷鍵格式化一下。這能自動(dòng)修復(fù)縮進(jìn)和其他格式問題。

十、本篇小結(jié)

? Python的縮進(jìn)規(guī)則是它最獨(dú)特的設(shè)計(jì),也是初學(xué)者最容易踩坑的地方。核心要點(diǎn):

  1. 4個(gè)空格 = 1級縮進(jìn)(PEP 8標(biāo)準(zhǔn))
  2. 冒號 : 后面必須縮進(jìn),開始一個(gè)新的代碼塊
  3. 同級代碼塊必須保持相同縮進(jìn)
  4. 不要混用Tab和空格(IDE中設(shè)置Tab轉(zhuǎn)4空格)
  5. 空代碼塊用 pass 占位
  6. 縮進(jìn)決定邏輯歸屬——不恰當(dāng)?shù)目s進(jìn)可能導(dǎo)致代碼能運(yùn)行但邏輯不對

?? 縮進(jìn)規(guī)則是Python的"第一道門檻",一旦掌握了,你就會發(fā)現(xiàn)它是一個(gè)非常有價(jià)值的設(shè)計(jì)——讓你的代碼天然整潔、統(tǒng)一、可讀。

到此這篇關(guān)于Python縮進(jìn)規(guī)則與代碼塊規(guī)范的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python縮進(jìn)規(guī)則與代碼塊規(guī)范內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解python?flask是如何預(yù)防CSRF攻擊

    詳解python?flask是如何預(yù)防CSRF攻擊

    CSRF(Cross-site?request?forgery)攻擊是一種常見的網(wǎng)絡(luò)安全漏洞,它可以通過欺騙用戶執(zhí)行惡意請求來攻擊?Web?應(yīng)用程序,本篇文章將介紹python?flask是如何預(yù)防CSRF攻擊,需要的朋友可以參考下
    2024-04-04
  • Python虛擬機(jī)棧幀對象及獲取源碼學(xué)習(xí)

    Python虛擬機(jī)棧幀對象及獲取源碼學(xué)習(xí)

    這篇文章主要為大家介紹了Python虛擬機(jī)棧幀對象及獲取源碼學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Python3日期與時(shí)間戳轉(zhuǎn)換的幾種方法詳解

    Python3日期與時(shí)間戳轉(zhuǎn)換的幾種方法詳解

    我們可以利用內(nèi)置模塊 datetime 獲取當(dāng)前時(shí)間,然后將其轉(zhuǎn)換為對應(yīng)的時(shí)間戳。這篇文章主要介紹了Python3日期與時(shí)間戳轉(zhuǎn)換的幾種方法,需要的朋友可以參考下
    2019-06-06
  • Python實(shí)現(xiàn)屏幕截圖的兩種方式

    Python實(shí)現(xiàn)屏幕截圖的兩種方式

    這篇文章主要介紹了Python實(shí)現(xiàn)屏幕截圖的兩種方式及對這兩者的特點(diǎn)和用法進(jìn)行詳細(xì)解釋,感興趣的朋友一起看看
    2018-02-02
  • Python選擇排序、冒泡排序、合并排序代碼實(shí)例

    Python選擇排序、冒泡排序、合并排序代碼實(shí)例

    這篇文章主要介紹了Python選擇排序、冒泡排序、合并排序代碼實(shí)例,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-04-04
  • python?中的?return?解析

    python?中的?return?解析

    這篇文章主要介紹了python?中的?return?解析,return?語句用于退出函數(shù),向調(diào)用方返回一個(gè)表達(dá)式。執(zhí)行到?return?語句時(shí),會退出函數(shù),return?之后的語句不再執(zhí),下文下邊就利用舉例給大家講解該內(nèi)容得相關(guān)資料,需要的小伙伴可以參考一下
    2022-02-02
  • django model object序列化實(shí)例

    django model object序列化實(shí)例

    這篇文章主要介紹了django model object序列化實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • python中Django文件上傳方法詳解

    python中Django文件上傳方法詳解

    在本篇文章里小編給大家整理了一篇關(guān)于python中Django文件上傳方法,有興趣的朋友們可以學(xué)習(xí)下。
    2020-08-08
  • Python實(shí)現(xiàn)賬號密碼輸錯(cuò)三次即鎖定功能簡單示例

    Python實(shí)現(xiàn)賬號密碼輸錯(cuò)三次即鎖定功能簡單示例

    這篇文章主要介紹了Python實(shí)現(xiàn)賬號密碼輸錯(cuò)三次即鎖定功能,結(jié)合實(shí)例形式分析了Python文件讀取、流程控制、數(shù)據(jù)判斷等相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • Python引用類型和值類型的區(qū)別與使用解析

    Python引用類型和值類型的區(qū)別與使用解析

    這篇文章主要介紹了Python引用類型和值類型的區(qū)別與使用解析,需要的朋友可以參考下
    2017-10-10

最新評論

辰溪县| 南充市| 体育| 临澧县| 栾川县| 古蔺县| 巴彦县| 屏南县| 宁陕县| 敦化市| 勐海县| 通化县| 上饶市| 汝城县| 吴旗县| 曲周县| 商河县| 永兴县| 海安县| 岳西县| 电白县| 婺源县| 潞城市| 门头沟区| 海兴县| 务川| 古浪县| 宜君县| 广安市| 德州市| 屏南县| 尖扎县| 神农架林区| 云林县| 民乐县| 宜章县| 曲水县| 思南县| 南安市| 南木林县| 武清区|