<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 5673字,需瀏覽 12分鐘

           ·

          2024-04-11 18:01

          996f0b27fadd0bbdd832e871099aa903.webp

          點擊上方“ 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、elifelse關(guān)鍵字用于基于條件表達式的結(jié)果來執(zhí)行不同的代碼塊。這是最基本的決策結(jié)構(gòu),允許程序根據(jù)不同的輸入做出決策。

          if語句

          if語句的基本語法如下:

                
                if condition:
              # 代碼塊1

          如果condition(條件)為真(True),則執(zhí)行冒號后縮進的代碼塊(代碼塊1)。條件可以是任何表達式,其結(jié)果被評估為TrueFalse。

          elif語句

          elifelse if的縮寫,用于在if語句之后添加多個條件分支。它的語法如下:

                
                if condition1:
              # 代碼塊1
          elif condition2:
              # 代碼塊2

          如果condition1為真,執(zhí)行第一個代碼塊;否則,如果condition2為真,執(zhí)行第二個代碼塊。elif可以有多個,按順序評估,直到找到第一個為真的條件。

          else語句

          else語句用于當(dāng)所有ifelif條件都不滿足時執(zhí)行代碼塊。它的語法如下:

                
                if condition1:
              # 代碼塊1
          elif condition2:
              # 代碼塊2
          else:
              # 默認(rèn)代碼塊

          如果所有前面的條件都不為真,則執(zhí)行else后面的代碼塊。

          高級部分:字節(jié)碼分析

          Python的字節(jié)碼是解釋器執(zhí)行的低級指令集。對于條件語句,相關(guān)的字節(jié)碼指令包括FOR_ITERJUMP_IF_FALSE、JUMP_IF_TRUEPOP_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)

          elifelse的實現(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ǔ):變量與表達式的深度解析

          第1章:Python基礎(chǔ):標(biāo)準(zhǔn)輸入和輸出

          第1章:Python基礎(chǔ)-Python 3 數(shù)據(jù)類型詳解:數(shù)字、字符串、布爾值


          瀏覽 43
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美三级免费看 | 美女操高潮网站 | 国产免费观看高清完整版亚洲日本 | 蜜桃传媒一区二区亚洲AV动漫 | www久久91 |