第2章:控制流程:深入探究 Python 條件語句

點擊上方“ Python學(xué)習(xí)開發(fā) ”,選擇“ 加為星標(biāo) ”
第一時間關(guān)注Python技術(shù)干貨!
Python 3 是一種動態(tài)、解釋型的高級編程語言,以其簡潔明了的語法和強大的功能而廣受歡迎。上一節(jié)介紹 Python 3 中的標(biāo)準(zhǔn)輸入和輸出,以及它們在 CPython 實現(xiàn)中的工作方式。本文將進入第二章節(jié),深入探討Python中的條件語句。
基本概念與用法
在Python中,if、elif和else關(guān)鍵字用于基于條件表達式的結(jié)果來執(zhí)行不同的代碼塊。這是最基本的決策結(jié)構(gòu),允許程序根據(jù)不同的輸入做出決策。
if語句
if語句的基本語法如下:
if condition:
# 代碼塊1
如果condition(條件)為真(True),則執(zhí)行冒號后縮進的代碼塊(代碼塊1)。條件可以是任何表達式,其結(jié)果被評估為True或False。
elif語句
elif是else if的縮寫,用于在if語句之后添加多個條件分支。它的語法如下:
if condition1:
# 代碼塊1
elif condition2:
# 代碼塊2
如果condition1為真,執(zhí)行第一個代碼塊;否則,如果condition2為真,執(zhí)行第二個代碼塊。elif可以有多個,按順序評估,直到找到第一個為真的條件。
else語句
else語句用于當(dāng)所有if和elif條件都不滿足時執(zhí)行代碼塊。它的語法如下:
if condition1:
# 代碼塊1
elif condition2:
# 代碼塊2
else:
# 默認(rèn)代碼塊
如果所有前面的條件都不為真,則執(zhí)行else后面的代碼塊。
高級部分:字節(jié)碼分析
Python的字節(jié)碼是解釋器執(zhí)行的低級指令集。對于條件語句,相關(guān)的字節(jié)碼指令包括FOR_ITER、JUMP_IF_FALSE、JUMP_IF_TRUE和POP_JUMP_IF_FALSE等。
FOR_ITER: 用于循環(huán)結(jié)構(gòu),如for和while循環(huán)。JUMP_IF_FALSE: 如果棧頂?shù)闹凳羌伲‵alse),則跳轉(zhuǎn)到指定的地址。JUMP_IF_TRUE: 如果棧頂?shù)闹凳钦妫═rue),則跳轉(zhuǎn)到指定的地址。POP_JUMP_IF_FALSE: 彈出棧頂?shù)闹?,如果為假,則跳轉(zhuǎn)到指定的地址。
if語句的實現(xiàn)
當(dāng)解釋器遇到if語句時,它會生成一個字節(jié)碼序列來執(zhí)行條件檢查。例如:
if condition:
do_something()
這將轉(zhuǎn)換為類似下面的字節(jié)碼:
LOAD_CONST 1 (condition)
CALL_FUNCTION 0
JUMP_IF_FALSE label1
LOAD_CONST 2 (<code object for do_something>)
CALL_FUNCTION 0
如果condition為假,控制流將跳轉(zhuǎn)到label1,跳過do_something()的執(zhí)行。
elif和else的實現(xiàn)
elif和else的實現(xiàn)與if類似,但會涉及到更多的跳轉(zhuǎn)指令。例如:
if condition1:
do_something1()
elif condition2:
do_something2()
else:
do_something3()
對應(yīng)的字節(jié)碼可能如下:
LOAD_CONST 1 (condition1)
CALL_FUNCTION 0
JUMP_IF_FALSE label2
LOAD_CONST 3 (<code object for do_something1>)
CALL_FUNCTION 0
JUMP label3
label2:
LOAD_CONST 4 (condition2)
CALL_FUNCTION 0
JUMP_IF_FALSE label4
LOAD_CONST 5 (<code object for do_something2>)
CALL_FUNCTION 0
JUMP label3
label4:
LOAD_CONST 6 (<code object for do_something3>)
CALL_FUNCTION 0
label3:
在這個例子中,如果condition1為真,執(zhí)行do_something1();如果為假,檢查condition2;如果condition2為真,執(zhí)行do_something2();否則執(zhí)行do_something3()。
高級部分:在Cpython中的實現(xiàn)方式
在CPython中負(fù)責(zé)編譯的代碼通常位于Python/compile.c文件中。這里面包含的邏輯會根據(jù)Python代碼的語法如條件語句構(gòu)建對應(yīng)的抽象語法樹(Abstract Syntax Tree,AST),然后將AST轉(zhuǎn)換成相應(yīng)的字節(jié)碼。字節(jié)碼是Python虛擬機執(zhí)行的低級指令集。
以下是C源碼中處理if語句的一個簡化示例
// 這是一個簡化后的實現(xiàn)示例,并非實際源碼
static int
compiler_if(struct compiler *c, stmt_ty s)
{
basicblock *end, *next;
assert(s->kind == If_kind);
end = compiler_new_block(c);
next = compiler_new_block(c);
/* 生成條件表達式的代碼 */
VISIT(c, expr, s->v.If.test);
ADDOP_JREL(c, POP_JUMP_IF_FALSE, next);
/* 生成 if 代碼塊的代碼 */
VISIT_SEQ(c, stmt, s->v.If.body);
ADDOP_JREL(c, JUMP_FORWARD, end);
/* 生成 elif 和 else 代碼塊的代碼 */
compiler_use_next_block(c, next);
for (int i = 0; i < asdl_seq_LEN(s->v.If.orelse); i++)
{
VISIT(c, stmt, asdl_seq_GET(s->v.If.orelse, i));
}
compiler_use_next_block(c, end);
return 1;
}
CPython的實際實現(xiàn)中,當(dāng)編譯器遇到if語句時,它會先評估條件表達式,然后生成一個POP_JUMP_IF_FALSE字節(jié)碼指令。這個指令在運行時會檢查棧頂?shù)脑?,如果為False,虛擬機將會跳至指定的字節(jié)碼標(biāo)簽位置。對于elif和else部分,類似的邏輯適用:elif實際上是后續(xù)的if語句;else部分則是在所有if和elif條件都不滿足時執(zhí)行的代碼塊。
推薦閱讀
第1章:Python基礎(chǔ):標(biāo)準(zhǔn)輸入和輸出
第1章:Python基礎(chǔ)-Python 3 數(shù)據(jù)類型詳解:數(shù)字、字符串、布爾值
