Python 語法及語義（Python syntax and semantics），Python 程式語言之語法是一組 Python 的運作程式設計規則，用於定義 Python 程式如何來編寫與編譯（由執行時系統與程式師來操作）。Python 語言與 Perl、C，以及 Java 有許多相似之處，不過在這些語言之間仍存在著一些明確的差異。 設計理念 Python 被設計為一種高度可讀的程式語言。它具有相對排列有致的視覺佈局，並且在其他程式語言使用標點符號的情況下經常使用英文關鍵字。Python 的目標是在其語法設計中保持簡單與一致性，在「Python 之禪」一書中的「宣示」也提到「應該有一種 最好只有一種 明顯的方法來達成 Python 簡單與一致性的目標」。 如上述、Python 的「宣示」即「應該有一種 最好只有一種 明顯的方法來達成 Python 簡單與一致性的目標」；而這個宣示故意跟「Perl」及「Ruby」的宣示「不止只有一種方法可以達成目標」唱反調。 關鍵字 Python 有 35 個關鍵字或保留字；這些關鍵字或保留字不能用作識別符號。 and as assert async await break class continue def del elif else except False finally for from global if import in is lambda None nonlocal not or pass raise return True try while with yield 註解 首行縮排 Python 使用空白字元來分隔控制流程區塊（遵循越位規則）。 Python 借鑒了其前身 ABC 的這一特性：它使用首行縮排來表示程式碼塊的運作，而不是標點符號或關鍵字。 在所謂的 自由格式freeformat 的程式語言中 使用源自 ALGOL 的區塊結構 程式碼區塊會使用大括號 或關鍵字來區分隔開。在這些程式語言的大多數程式碼約定中，程式師通常會在區塊內縮排程式碼，使其在視覺上能與周圍的程式碼區明白的區分開來。 一個名為 foo 的遞迴函式，它傳遞一個引數 x，如果引數為 0，僅呼叫 bar 這個函式；否則將呼叫不同的名為 baz 的函式，傳遞引數 x，並遞迴呼叫自身，傳遞 x1 為引數，這都可以在 Python 中實現的演算： def foo x if x 0 bar else baz x foo x 1 並且可以在 C 中用 KR 縮排樣式寫成如下程式： void foo int x if x 0 bar else baz x foo x 1 不正確的縮排程式碼可能會被人誤讀，而不是被編譯器或直譯器解譯。 比如，如果上例中最後一行的函式呼叫 foo x 1 會被錯誤地縮排到 ifelse 區塊之外： def foo x if x 0 bar else baz x foo x 1 造成上例程式設計無論如何最後一行都會被執行，即使 x 為 0 亦是如此，結果會導致無限遞迴的現象。 雖然空格和製表鍵都被接受作為縮排的形式，並且可以使用任意倍數的空格，也建議使用空格作為不同的架構區分；並且在標準上建議區分不同的巢狀結構使用 4 個空格的形式（如上例所示），這也是迄今為止最常用的空格佈局形態。從 Python 3 開始，不允許在同一原始碼檔案中的連續行上混合空格和製表符，這會導致產生難以發現的錯誤；因為有許多工具無法在視覺上區分空格與製表鍵。 資料結構 由於 Python 是一種動態型別的程式語言，因此 Python 值不是一種變數攜帶資料型別資訊。 Python 中的所有變數都持有對物件的參照，這些參照被傳遞給函式； 函式不能在其呼叫函式中更改變數參照的值（但請參閱下面的例外情況）。有些人（包括吉多範羅蘇姆本人）將這種引數傳遞方案稱為 依物件參照呼叫。物件參照 意味著一個名稱，傳遞參照 是一個 別名，即是對同一物件的參照副本，就像在 CC 中一樣。物件的值可以在被呼叫的函式中用 別名 改變，比如： alist a b c def my_func al alappend x print al my_func alist a b c x alist a b c x 函式 my_func 用形式引數 al 改變 alist 的值，它即是 alist 的別名。然而、任何對別名本身進行操作的嘗試都不會對原始物件產生影響。在 Python 中，非最內部區域性 noninnermostlocal 以及未宣告全面 notdeclaredglobal 可攫取的名稱都是別名。 在動態型別語言中，Python 進行了適度的型別檢查。 隱式轉換是為數字型別（以及布林值）定義的，因此可以有效地將複數乘以整數（例如）而沒有顯式轉換。 但是，例如數字和字串之間沒有隱式轉換； 字串是需要數字之數學函式的無效引數。 基本型別 Python 具有廣泛的基本資料型別。 除了傳統的整數以及浮點數算術外，它透明地支援高精度計算、複數，及。 集合型別 Python 非常有用的方面之的是集合（或容器）型別的概念。 一般來說，集合是一個以易於引用、或則索引的方式包含其他物件的物件。 集合有兩種基本形式：序列與對映。 物件系統 在 Python 中，一切都是物件，甚至是類屬。類屬，作為物件，有一個類屬，稱為它們的元類。Python 亦支援多重繼承以及 Mixin。 Python 語言支援對型別以及類屬的廣泛自檢。 可以讀取與比較型別 而所謂的型別是指型別的例項。 物件的屬性可以提取為字典。 文字 字串 Python 有各種。 普通字串文字 單引號或雙引號均可用於引用字串。 與 Unix shell 語言、Perl，或受 Perl 影響的語言（諸如 Ruby 或 Groovy）不同，單引號和雙引號的功能相同，即 foo 表示式沒有字串插值。然而，可以透過多種方式進行插值：使用 fstrings（自 Python 36 開始）、使用格式方法或者舊的 字串格式的運算子。 比如，所有這些 Python 的宣告語句： print fI just printed num pages to the printer printer print I just printed pages to the printer format num printer print I just printed 0 pages to the printer 1format num printer print I just printed num pages to the printer printerformat numnum printerprinter print I just printed s pages to the printer s num printer print I just printed num s pages to the printer printer s num num printer printer 等價於 Perl 的宣告語句： print I just printed num pages to the printer printern 語句使用變數 num 以及 printer 構建一個字串。 多行字串文字 還有多行字串，它們以一系列三個單引號或雙引號開頭及結尾，而其功能類似於 Perl 與 Ruby 中的 Here 文件。 的一個簡單示例（使用格式的方法）比如： print Dear recipient I wish you to leave Sunnydale and never return Not Quite Love sender format senderBuffy the Vampire Slayer recipientSpike 原始字串 範例包括： A Windows path even raw strings cannot end in a backslash rCFooBarBaz File stdin line 1 rCFooBarBaz SyntaxError EOL while scanning string literal dos_path rCFooBarBaz avoids the error by adding dos_pathrstrip and removing trailing space CFooBarBaz quoted_dos_path rformat dos_path quoted_dos_path CFooBarBaz A regular expression matching a quoted string with possible backslash quoting rematch r quoted_dos_pathgroup 1rstrip CFooBarBaz code foo 2 bar Reverse the arguments in a twoarg function call resub r r2 1 code foo 2 bar Note that this wont work if either argument has parens or commas in it 相鄰字串文字的串聯 因此 title One Good Turn A Natural History of the Screwdriver and the Screw 相當於 title One Good Turn A Natural History of the Screwdriver and the Screw Unicode 從 Python 30 開始，原始碼與直譯器的預設字元集都是 UTF8。在 UTF8 中，Unicode 字串的處理方式及傳統的位元組字串類似。這個例子將起如下作用： s Γειά Hello in Greek print s 數字 Python 中的數字文字是屬於普通型別，例如：0，1，34，35e8。 列表、多元組、集合、字典 Python 具有支援建立容器型別的語法。 列表（類屬列表）是任意型別專案的可變序列，可以使用特殊語法來建立。 a_list 1 2 3 a dog 或使用普通物件來建立 a_second_list list a_second_listappend 4 a_second_listappend 5 多元組（類屬元組）是任意型別專案的不可變序列。還有一個特殊的語法來建立多元組 a_tuple 1 2 3 four a_tuple 1 2 3 four 運算子 算術 在算術上 Python 包括 、、、真值除法、下限除法、模數 以及 取冪 運算子，以及它們通常的數學優先順序別。在 Python 3 中，xy 執行 真值除法true division，這表示它總是會回返一個浮點數，即使 x 與 y 都是整除的整數。 4 2 20 接著 執行整數除法、或下限除法，將商數的下限作為整數回返。 在 Python 2 及大多數其他程式語言 中，除非明確要求，否則 xy 在執行整數除法時，僅當任一輸入值為浮點數時才回返浮點數。但是，因為 Python 是一種動態型別的語言；並不總是能夠分辨出正在執行的是哪一個操作，這往往會導致細微的錯誤。從而促使 Python 3 引入 運算子，並改變 運算子的語義。 比較運算子 比較運算子 comparison operator，比如： is is not in 及 not in 可用於各種運算值的使用上。數字、字串、序列，以及對映都可以進行比較。在 Python 3 中，不同的型別 比如 str 和 int 沒有一致的相對順序。雖然在 Python 2 中可以比較某個字串是大於、還是小於某個整數；但這被認為是歷史上的 設計怪癖，最終在 Python 3 中被刪除。 諸如 a b c 之類的 鍊式比較表示式chained comparison expressions 大致具有它們在數學中的含義，而不是在 C 與類似語言中發現的不尋常含義。這些程式術語是依據順序進行評估與比較。這個操作具有短路求值語義，這表示著一旦判斷明確，就保證評估停止：如果 a b 為假，則永遠不會評估到 c，因為表示式不可能再為真。 對於沒有副作用的表示式，a b c 為等價於 a b 與 b c。然而，當表示式具有副作用時，也是存在很大差異。a f x b 將只計算 f x 一次，而 a f x 以及 f x b；如果 a 的值小於 f x 將計算兩次，否則只計算一次。 邏輯運算子 在所有版本的 Python 裡面，布林運算子處理零值或空值、諸如 、0、None、00、，以及 將被視為 假 ；而通常則將非空 nonempty、非零值 nonzero value 視為 真 。布林值真與假在 Python 221 中是作為常數 從 1 及 0 產生的子類化 新增到程式語言裡，並在 Python 3 中變成為完整的關鍵字。二進位制 比較運算子 、諸如 以及 則回返真或假的資訊。 布林運算子 boolean operator and 及 or 使用最小化求值。例如，y 0 或則 xy 100 永遠不會引發被零除之異常錯誤資訊。這些 運算子 回返最後操作元評估之值，而不是真或是假的情形。因此，表示式 4 及 5 的計算結果為 5，而 4 或 5 的計算結果為 4。因此，表示式 4 及 5 的計算結果為 5，而 4 或 5 的計算結果為 4。 函數語言程式設計 如上所述，Python 的另一個優勢是函數語言程式設計風格的可用性。正如所料，這使得使用列表及其他集合更加簡單。 理解 L mapping_expression for element in source_list if filter_expression 第一級函式 在 Python 中，函式是可以動態建立以及傳遞的第一級物件。 Python 對匿名函式的有限支援是 lambda 建構式。下列範例是對輸入值求平方的匿名函式，使用引數 5 來呼叫 呼叫 的： f lambda x x2 f 5 Lambda 僅限於包含而不是語句陳述式，儘管 控制流control flow 仍可以透過使用短路在 lambda 中不太優雅地實現程式設計，並且更習慣地使用 條件表示式conditional expression。 閉包 def derivative f dx Return a function that approximates the derivative of f using an interval of dx which should be appropriately small def function x return f x dx f x dx return function 生成器 from itertools import count def generate_primes stop_atNone primes for n in count start2 if stop_at is not None and n stop_at return raises the StopIteration exception composite False for p in primes if not n p composite True break elif p 2 n break if not composite primesappend n yield n 生成器表示式 在 Python 24 中引入的生成器表示式是列表推導式的惰性求值等價式。使用上一節中提供的質數生成器，我們可以定義一個惰性求值方式但不是無限的集合。 from itertools import islice primes_under_million i for i in generate_primes if i 1000000 two_thousandth_prime islice primes_under_million 1999 2000next primes_under_million i for i in generate_primes 2000000 if i 1000000 two_thousandth_prime primes_under_million 1999 字典與集合推導式 dict n nn for n in range 5 0 0 1 1 2 4 3 9 4 16 Python 27 及 30 透過引入字典與集合推導式來統一所有集合型別，類似於列表推導式： nn for n in range 5 regular list comprehension 0 1 4 9 16 nn for n in range 5 set comprehension 0 1 4 9 16 n nn for n in range 5 dict comprehension 0 0 1 1 2 4 3 9 4 16 物件 Python 支援大多數面向物件程式設計 OOP 技術。 With 宣告 關於 with 語句可以處理資源的使用，並允許使用者使用 上下文管理器協議Context Manager protocol。在進入作用域時呼叫一個函式 __enter__，而自離開時呼叫另一個函式 __exit__。如此可以防止忘記釋放資源，而且還可以處理更複雜的情形、比如在資源使用過程中發生異常時可以釋放資源。上下文管理器Context Managers 通常與檔案、資料庫連線、測試用例等情況一起使用。 屬性 屬性允許使用及屬性揭取相同的語法在物件例項上呼叫專門定義的方法。 定義一些屬性的類屬的一個例子是： class MyClass def __init__self self_a None property def a self return self_a asetter makes the property writable def a self value self_a value 描述符 定義三個特殊方法__get__self instance owner，__set__self instance value，__delete__self instance 中的一個，或多個的類屬可以用作描述符。建立描述符的例項作為第二個類的類成員，使該例項成為第二個類之屬性。 類屬與靜態法 Python 允許透過使用 cla classmethod 及 staticmethod 的修飾模式來建立類方法和靜態方法。類方法的第一個引數是類物件，而不是對例項的自引用。靜態方法沒有特殊的第一個引數。例項及類物件都不會傳遞給靜態方法。 異常 在第一個程式碼的示例中，遵循 LBYL 的方法，在揭取之前對屬性進行了外顯的檢查： if hasattr spam eggs ham spameggs else handle_missing_attr 第二個示例遵循 EAFP 正規化 try ham spameggs except AttributeError handle_missing_attr 説明與文件字串 説明一段程式碼： import sys def getline return sysstdinreadline Get one line and return it 用多行説明一段程式碼： def getline return sysstdinreadline this function gets one line and returns it 函式註解 函式註解（型別提示）在 PEP3107 中定義。函式註解允許將資料附加到函式的引數以及返回原址。註釋的特性不是由程式語言所定義的，而是留給第三方框架的來進行的。例如，可以編寫一個資料庫來處理靜態型別的程式語言架構： def haul item Haulable vargs PackAnimal Distance 修飾子 修飾子 裝飾器；修飾符 是用於修改函式、方法，或則類定義的任何可呼叫的 Python 物件。修飾子傳遞正被定義的原始物件、並返回修改後的物件；然後將其繫結到定義中的名稱之上。Python 修飾子部分受到 Java 註釋運用的啟發，並且具有類似 Java 的語法；修飾子語法是純粹的語法糖，使用 作為修飾子的關鍵字： viking_chorus def menu_item print spam 相當於 def menu_item print spam menu_item viking_chorus menu_item 修飾子是超程式設計的一種形式； 它們增強了它們修飾的函式或方法的作用。 比如，在下面的示例中，viking_chorus 可能會導致 menu_item 每次被呼叫時執行 8 次（參見 Spam）： def viking_chorus myfunc def inner_func args kwargs for i in range 8 myfunc args kwargs return inner_func 函式修飾子的典型用途是建立類方法或靜態方法、新增函式屬性、、設定前置及後置條件以及同步，不過可以用於更多方面，包括尾遞迴、記憶化；甚至改進其他修飾子的編寫。 修飾子的作用；即是可以經由在主要程式語言相鄰且相關的行之上置放幾個修飾子、進而來帶動主程式連結修飾子之間的連繫： invincible favourite_colour Blue def black_knight pass 相當於 def black_knight pass black_knight invincible favourite_colour Blueblack_knight 或者，使用中介架構的變數、如下程式所示： def black_knight pass blue_decorator favourite_colour Blue decorated_by_blue blue_decorator black_knight black_knight invincible decorated_by_blue 在上述的例子中，favourite_colour 修飾子工廠接受一個引數。 修飾子工廠必須返回一個修飾子，然後使用要修飾的物件作為引數來呼叫它： def favourite_colour colour def decorator func def wrapper print colour func return wrapper return decorator 復活節彩蛋 一個隱藏資訊，Python 之禪（Python 設計哲學的總結），在嘗試 import this 匯入 this 時會顯示出來。 註釋 參閱 列表推導式 Python 的歷史 （語法導向編輯器） 排列 外部連線 Python tutorial written by the author of Python Guido van Rossum PYTHON LISTS PROGRAMMING REVIEW FrontPage Python Wiki Category 程式設計語言語法 CategoryPython