復合語句
復合語句包含其他語句(組),它們以某種方式影響或控制那些其他語句的執行。一般來說,復合語句跨越多個邏輯行,雖然在簡單形式中,整個復合語句可能包含在一行中。
復合語句由一個或多個 “子句” 組成,子句由 header 和 suite 組成。每一個 header 子句以一個唯一的標識關鍵字開始并以冒號結束。Suite 子句是由一條 header 子句控制的一組語句。一個 suite 子句可以是語句首冒號之后的同一行上緊跟一個或多個分號分隔的簡單語句,也可以是后續行上一個或多個縮進的語句。只有后一種形式的 suite 子句可以包含嵌套復合語句。
復合語句主要包含:流程控制語句(if、while和for語句),異常處理語句(try語句),with語句和協程語句等。函數定義和類定義也是復合語句。這里我們主要介紹流程控制語句,其他復合語句會在后續的單獨章節重點介紹。
流程控制語句:
Python 一般都會按照順序從頭到尾的執行文件中代碼塊中的語句,但是像 if、while
、for這樣的語句會使得解釋器的執行過程在程序內跳躍。這類會對正常執行順序產生影響的語句,通常叫做流程控制語句。
一、if 語句
if 語句用于判斷條件執行。它由三部分組成:關鍵字本身,用于判斷結果真假的條件表達式,以及當表達式為真或者非零時執行的代碼塊。其形式是 if 測試語句后面跟著一個或多個可選的 elif 測試代碼塊,以及一個最終可選的 else 代碼塊。當 if 語句執行時,Python會執行第一個測試結果為真的語句下面的嵌套語句,如果所有測試都為假,就執行 else 部分,如果沒有 else 部分,所有嵌套語句都不執行。1、多重條件表達式
單個 if 語句可以通過使用布爾操作符 and , or 和 not 實現多重判斷條件的組合。2、單一語句的代碼塊
如果一個復合語句(例如 if 子句,while 或 for 循環)的代碼塊僅僅包含一行代碼,那么它可以和前面的語句寫在同一行上。上邊這樣的單行語句是合法的,盡管它可能方便,但這樣會使得代碼更難閱讀,所以我們推薦將這行代碼移到下一行并合理地縮進。另外一個原因就是如果你需要添加新的代碼,你還是得把它移到下一行。
3、else 語句
和其他語言一樣, Python 提供了與 if 語句搭配使用的 else 語句。如果 if 語句的條件表達式的結果布爾值為假, 那么程序將執行 else 語句后的代碼。避免“懸掛 else”
Python 使用縮進而不是用大括號標記代碼塊邊界的設計,不僅幫助強化了代碼的正確性,而且還暗中幫助程序員避免了語法上正確的代碼中存在的潛在問題。其中一個問題就是 "懸掛 else (dangling else)" 問題,在 C 語言中,規則是 else 與最近的 if 搭配,所以有時在視覺上會很難判斷 else 語句所屬的 if 語句。
Python 使用強制縮進使代碼正確對齊,讓程序員來決定 else 屬于哪一個 if 。限制你的選擇從而減少了不確定性,Python 鼓勵你第一次就寫出正確的代碼。在 Python 中制造出“懸掛 else”問題是不可能的,而且,由于大括號不再被使用,Python 代碼更易讀懂。
4、elif 語句
elif 是 Python 的 else-if 語句,它檢查多個表達式是否為真,并執行第一個為真的特定代碼塊中的代碼。和 else 一樣,elif 聲明是可選的,然而不同的是,if 語句后最多只能有一個 else語句,但可以有任意數量的 elif 語句。5、條件表達式(即"三元操作符")
三元運算符只使用一行語句就可以完成條件判斷和賦值操作。
語法如下:
A = Y if X else Z
如果X為真則表達式的結果為Y,否則為Z。二、while 語句
while 語句用于重復執行。它重復測試表達式,如果為真,則執行第一個 suite,直到表達式為假(也可能是第一次測試時),執行 else 子句的 suite(如果存在)并終止循環(也可能不存在else語句,這種情況則直接執行while循環下面的語句)。1、無限循環
你必須小心地使用 while 循環,因為有可能 expression 永遠不會為假。這樣一來循環就永遠不會結束。這些"無限"的循環不一定是壞事,許多通訊服務器的客戶端/服務器系統就是通過它來工作的,這取決于循環是否需要一直執行下去。
2、else語句
如果在 while 循環正常執行完之后(沒有break強制跳出)需要立刻執行某些語句,我們可以把這些語句放到 else語句里。
一般語法:
while expression:
suite_to_repeat
else:
suite_to_repeat
三、for 語句
for 語句是 Python 中的循環語句。它是一個通用的序列迭代器,可以遍歷任何可迭代對象(例如序列或是迭代器)中的所有元素,并在所有條目都處理過后結束循環。不可能為死循環。
Python 的 for 循環的首行定義了一個賦值目標(或一些目標),以及你想遍歷的可迭代對象。首行后面是你想重復執行的代碼塊(一般都有縮進)。for 循環首先會對 expression_list 進行一次計算,產生一個可迭代的對象。然后為expression_list 的結果創建一個迭代器。for 循環會按照迭代器返回的順序依次將每個項賦值給 target_list,然后為每個元素(target_list)執行 suite 子句。當元素用盡(當序列為空或迭代器引發StopIteration異常時,立即生效),執行 else 子句中的 suite 子句(如果存在且沒有break跳出)并且循環終止。
for 循環首行中用作賦值目標的變量通常是 for 語句所在作用域中的變量(可能是新的)。1、else 語句
for 語句也支持一個可選的 else 語句,他的工作就像是在 while 循環中一樣:如果循環離開時沒有碰到 break 語句,就會執行(也就是說序列中所有元素都訪問過了)。
在第一個 suite 中執行的 break 語句會終止循環,而不執行 else 子句的 suite 。在第一個 suite 中執行的 continue 語句跳過這個 suite 的其余部分,并繼續下一個項目,如果沒有下一個項目,則繼續使用 else 子句。
這里 for 循環會按照文件迭代器來自動在每次循環迭代的時候讀入一行。
2、for 循環中的序列賦值
如果迭代序列類型,循環目標本身可以是目標元祖。for循環把序列對象元素賦值給目標,而賦值運算在任何地方工作起來都是相同的。3、內置函數 range()、zip() 和 enumerate()
一般而言,for 比 while 容易寫,執行時也比較快。所以每當你需要遍歷序列時,都應該把他作為首選的工具。同時,Python還內置了函數可以在 for 循環中定制迭代。
3.1 range() 內建函數
我們前面介紹 Python 的 for 循環的時候提到過它是一種迭代的循環機制。Python 同樣提供一個工具讓我們在傳統的偽條件設置下使用 for 聲明,例如從一個數字開始計數到另外個數字,一旦到達最后的數字或者某個條件不再滿足就立刻退出循環。
內建函數 range() 是一個迭代器,會根據需要產生元素,可以把類似 foreach 的 for 循環變成你更加熟悉的語句。例如從 0 到10 計數,或者從 10 到 100 一次遞增 5 。
Python 提供了兩種不同的方法來調用 range() 。完整語法要求提供兩個或三個整數參數:
range(start, end, step =1)
range() 會返回一個包含所有 k 的列表,這里 start <= k < end ,從 start 到 end , k 每次遞增
rang還有一種簡略的語法格式,使用一個參數時,range會產生從零算起的整數列表,但其中不包括改參數的值。:
range(end)
除非你有特殊的索引需求,不然在可能的情況下,最好使用 Python 中的簡單的 for 循環,不要使用 while,并且不要在 for 循環中使用 range() 調用,只將其視為最后的手段。
3.2 zip() 內建函數
內置的 zip() 函數可以讓我們使用 for 循環來并行使用多個序列。在基本運算中,zip() 函數會取得一個或多個序列為參數,然后返回元祖的列表,將這些序列中的并排的元素配成對。3.3 enumerate() 內建函數
在有些過程中我們會同時需要序列對象的元素和元素的偏移值,for循環支持一個記錄當前偏移值的計數器 enumerate()。enumerate() 函數返回一個生成器對象,這個對象有一個next方法,由下一個內置函數調用它,并且循環中每次迭代的時候它都會返回一個(index, value)的元組。
四、用在復合語句中的簡單語句
1、break語句
Python 中的 break 語句可以結束當前循環(包括循環后面的else語句)然后跳轉到下條語句,break 語句用在 while 和 for 循環中。2、continue語句
Python 里的 continue 語句可以用在 while 和 for 循環里。當遇到 continue 語句時, 程序會終止當前循環,并忽略剩余的語句,然后回到循環的頂端。在開始下一次迭代開始前,如果是條件循環,我們將驗證條件表達式。如果是迭代循環,我們將驗證是否還有元素可以迭代。只有在驗證成功的情況下,我們才會開始下一次迭代。3、pass語句
由于Python 沒有使用傳統的大括號來標記代碼塊,所以沒有對應的空大括號或是分號( ; )來表示 C 語言中的 "不做任何事" 。如果你在需要子語句塊的地方不寫任何語句,解釋器會提示你語法錯誤。因此, Python 提供了 pass 語句,它不做任何事情 - 即NOP ,只是一個無運算的空的占位語句。當語法需要語句并且還沒有任何使用的語句可寫時,就可以使用它。它通常用于為復合語句編寫一個空的主體。這樣的代碼結構在開發和調試時很有用,因為編寫代碼的時候你可能要先把結構定下來,但你不希望它干擾其他已經完成的代碼。在不需要它做任何事情地方,放一個 pass 將是一個很好的主意。
另外它在異常處理中也被經常用到:比如你跟蹤到了一個非致命的錯誤,不想采取任何措施(你只是想記錄一下事件或是在內部進行處理。
《Python基礎手冊》系列:
Python基礎手冊 1 —— Python語言介紹
Python基礎手冊 2 —— Python 環境搭建(Linux)
Python基礎手冊 3 —— Python解釋器
Python基礎手冊 4 —— 文本結構
Python基礎手冊 5 —— 標識符和關鍵字
Python基礎手冊 6 —— 操作符
Python基礎手冊 7 —— 內建函數
Python基礎手冊 8 —— Python對象
Python基礎手冊 9 —— 數字類型
Python基礎手冊10 —— 序列(字符串)
Python基礎手冊11 —— 序列(元組&列表)
Python基礎手冊12 —— 序列(類型操作)
Python基礎手冊13 —— 映射(字典)
Python基礎手冊14 —— 集合
Python基礎手冊15 —— 解析
Python基礎手冊16 —— 文件
Python基礎手冊17 —— 簡單語句
Python基礎手冊18 —— 復合語句(流程控制語句)
Python基礎手冊19 —— 迭代器
Python基礎手冊20 —— 生成器
Python基礎手冊21 —— 函數的定義
Python基礎手冊22 —— 函數的參數
Python基礎手冊23 —— 函數的調用
Python基礎手冊24 —— 函數中變量的作用域
Python基礎手冊25 —— 裝飾器
Python基礎手冊26 —— 錯誤 & 異常
Python基礎手冊27 —— 模塊
Python基礎手冊28 —— 模塊的高級概念
Python基礎手冊29 —— 包