Python語法及語義

Python語法及語義。Python語言與Perl、C，以及Java有許多相似之處，不過在這些語言之間仍存在著一些明確的差異。設計理念.Python被設計為一種高度可讀的程式語言。它具有相對排列有致的視覺佈局，並且在其他程式語言使用標點符號的情況下經常使用英文關鍵字。Python的目標是在其語法設計中保持簡單與一致性，在「Python之禪」一書中的「宣示」也提到「應該有一種——最好只有一種——明顯的方法來達成Python簡單與一致性的目標」。如上述、Python的「宣示」即「應該有一種——最好只有一種——明顯的方法來達成Python簡單與一致性的目標」；而這個宣示故意跟「Perl」及「Ruby」的宣示「不止只有一種方法可以達成目標」唱反調。關鍵字.Python有35個關鍵字或保留字；這些關鍵字或保留字不能用作。首行縮排.Python 使用空白字元來分隔控制流程區塊。 Python 借鑒了其前身ABC 的這一特性：它使用首行縮排來表示程式碼塊的運作，而不是標點符號或關鍵字。在所謂的"自由格式"(free-format)的程式語言中——使用源自ALGOL的區塊結構——程式碼區塊會使用大括號(codice_36)或關鍵字來區分隔開。在這些程式語言的大多數程式碼約定中，程式師通常會在區塊內縮排程式碼，使其在視覺上能與周圍的程式碼區明白的區分開來。一個名為codice_37的遞迴函式，它傳遞一個引數codice_38，如果引數為codice_39，僅呼叫codice_40這個函式；否則將呼叫不同的名為codice_41的函式，傳遞引數codice_38，並遞迴呼叫自身，傳遞 codice_43為引數 , 這都可以在 Python 中實現的演算：def foo(x):if x == 0:bar()else:baz(x)foo(x - 1)並且可以在C中用K&amp;R縮排樣式寫成如下程式：void foo(int x)if (x == 0) {bar();} else {baz(x);foo(x - 1);不正確的縮排程式碼可能會被人誤讀，而不是被編譯器或直譯器解譯。 比如，如果上例中最後一行的函式呼叫 codice_44會被錯誤地縮排到codice_19/codice_12區塊之外：def foo(x):if x == 0:bar()else:baz(x)foo(x - 1)造成上例程式設計無論如何最後一行都會被執行，即使codice_38為codice_39亦是如此，結果會導致無限遞迴的現象。雖然空格和製表鍵都被接受作為縮排的形式，並且可以使用任意倍數的空格，也建議使用空格作為不同的架構區分；並且在標準上建議區分不同的巢狀結構使用 4 個空格的形式，這也是迄今為止最常用的空格佈局形態。從 Python 3開始，不允許在同一原始碼檔案中的連續行上混合空格和製表符，這會導致產生難以發現的錯誤；因為有許多工具無法在視覺上區分空格與製表鍵。資料結構.由於 Python 是一種動態型別的程式語言，因此 Python 值不是一種變數攜帶資料型別資訊。 Python 中的所有變數都持有對物件的參照，這些參照被傳遞給函式； 函式不能在其呼叫函式中更改變數參照的值將這種引數傳遞方案稱為"依物件參照呼叫"。"物件參照"意味著一個名稱，"傳遞參照"是一個"別名"，即是對同一物件的參照副本，就像在 C/C++ 中一樣。物件的值可以在被呼叫的函式中用“別名”改變，比如：»&gt; alist = ['a', 'b', 'c']»&gt; def my_func(al):... al.append('x')... print(al)»&gt; my_func(alist)['a', 'b', 'c', 'x']»&gt; alist['a', 'b', 'c', 'x']函式codice_49用形式引數codice_50改變codice_51的值，它即是codice_51的別名。然而、任何對別名本身進行操作的嘗試都不會對原始物件產生影響。在Python中，非最內部區域性(non-innermost-local)以及未宣告全面(not-declared-global)可攫取的名稱都是別名。在動態型別語言中，Python 進行了適度的型別檢查。 隱式轉換是為數字型別而沒有顯式轉換。 但是，例如數字和字串之間沒有隱式轉換； 字串是需要數字之數學函式的無效引數。基本型別.Python 具有廣泛的基本資料型別。 除了傳統的整數以及浮點數算術外，它透明地支援高精度計算、複數，及。集合型別.Python非常有用的方面之的是集合型別的概念。 一般來說，集合是一個以易於引用、或則索引的方式包含其他物件的物件。 集合有兩種基本形式：序列與對映。物件系統.在Python中，一切都是物件，甚至是類屬。類屬，作為物件，有一個類屬，稱為它們的元類。Python亦支援多重繼承以及Mixin。Python語言支援對型別以及類屬的廣泛自檢。 可以讀取與比較型別——而所謂的型別是指型別的例項。 物件的屬性可以提取為字典。文字.字串.Python有各種。普通字串文字.單引號或雙引號均可用於引用字串。 與Unix shell語言、Perl，或受Perl影響的語言、使用格式方法或者舊的%字串格式的運算子。比如，所有這些 Python 的宣告語句：print(f"I 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 {1}".format(num, printer))print("I just printed {num} pages to the printer {printer}".format(num=num, printer=printer))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 $printer\n"語句使用變數codice_53以及codice_54構建一個字串。多行字串文字.還有多行字串，它們以一系列三個單引號或雙引號開頭及結尾，而其功能類似於Perl與Ruby中的Here文件。的一個簡單示例比如：print("""Dear {recipient},I wish you to leave Sunnydale and never return.Not Quite Love,""".format(sender="Buffy the Vampire Slayer", recipient="Spike"))原始字串.範例包括：»&gt; # A Windows path, even raw strings cannot end in a backslash»&gt; r"C:\Foo\Bar\Baz\"File "", line 1r"C:\Foo\Bar\Baz\"SyntaxError: EOL while scanning string literal»&gt; dos_path = r"C:\Foo\Bar\Baz\ " # avoids the error by adding»&gt; dos_path.rstrip() # and removing trailing space'C:\\Foo\\Bar\\Baz\\'»&gt; quoted_dos_path = r'"{}"'.format(dos_path)»&gt; quoted_dos_path'"C:\\Foo\\Bar\\Baz\\ "'»&gt; # A regular expression matching a quoted string with possible backslash quoting»&gt; re.match(r'"(([^"\\]|\\.)*)"', quoted_dos_path).group(1).rstrip()'C:\\Foo\\Bar\\Baz\\'»&gt; code = 'foo(2, bar)'»&gt; # Reverse the arguments in a two-arg function call»&gt; re.sub(r'\(([^,]*?),([^ ,]*?)\)', r'(\2, \1)', code)'foo(2, bar)'»&gt; # Note that this won't 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 3.0開始，原始碼與直譯器的預設字符集都是UTF-8。在UTF-8中，Unicode字串的處理方式及傳統的位元組字串類似。這個例子將起如下作用：s = "Γειά" # Hello in Greekprint(s)數字.Python中的數字文字是屬於普通型別，例如：codice_39，codice_56，codice_57，codice_58。列表、多元組、集合、字典.Python具有支援建立容器型別的語法。列表是任意型別專案的可變序列，可以使用特殊語法來建立。a_list = [1, 2, 3, "a dog"]或使用普通物件來建立a_second_list = list()a_second_list.append(4)a_second_list.append(5)多元組是任意型別專案的不可變序列。還有一個特殊的語法來建立多元組a_tuple = 1, 2, 3, "four"a_tuple = (1, 2, 3, "four")運算子.算術.在算術上Python包括codice_59、codice_60、codice_61、codice_62("真值除法")、codice_63(下限除法)、codice_64(模數)以及codice_65(取冪)運算子，以及它們通常的數學優先順序別。在Python 3中，codice_66執行"真值除法"(true division)，這表示它總是會回返一個浮點數，即使x與y都是整除的整數。»&gt; 4 / 22.0接著codice_63執行整數除法、或"下限除法"，將商數的下限作為整數回返。在Python 2(及大多數其他程式語言)中，除非明確要求，否則codice_66在執行整數除法時，僅當任一輸入值為浮點數時才回返浮點數。但是，因為Python是一種動態型別的語言；並不總是能夠分辨出正在執行的是哪一個操作，這往往會導致細微的錯誤。從而促使Python 3引入codice_63運算子，並改變codice_62運算子的語義。比較運算子.比較運算子(comparison operator)，比如：codice_71, codice_72, codice_73, codice_74, codice_75, codice_76, codice_22, codice_78, codice_21 及 codice_80可用於各種運算值的使用上。數字、字串、序列，以及對映都可以進行比較。在Python 3中，不同的型別(比如codice_81和codice_82)沒有一致的相對順序。雖然在Python 2中可以比較某個字串是大於、還是小於某個整數；但這被認為是歷史上的"設計怪癖"，最終在Python 3中被刪除。諸如codice_83之類的"鍊式比較表示式"(chained comparison expressions)大致具有它們在數學中的含義，而不是在C與類似語言中發現的不尋常含義。這些程式術語是依據順序進行評估與比較。這個操作具有短路求值語義，這表示著一旦判斷明確，就保證評估停止：如果codice_84為假，則永遠不會評估到codice_85，因為表示式不可能再為真。對於沒有副作用的表示式，codice_83為等價於codice_87。然而，當表示式具有副作用時，也是存在很大差異。codice_88將只計算codice_89一次，而codice_90；如果codice_91的值小於codice_89將計算兩次，否則只計算一次。邏輯運算子.在所有版本的Python裡面，布林運算子處理零值或空值、諸如codice_93、codice_39、codice_24、codice_96、codice_97，以及codice_98將被視為”假“；而通常則將非空(non-empty)、非零值(non-zero value)視為"真"。布林值codice_99與codice_100在Python 2.2.1中是作為常數(從codice_101及codice_39產生的子類化)新增到程式語言裡，並在Python 3中變成為完整的關鍵字。二進位制"比較運算子"、諸如codice_71以及codice_74則回返codice_99或codice_100的資訊。布林運算子(boolean operator)codice_1及codice_27使用最小化求值。例如，codice_109永遠不會引發被零除之異常錯誤資訊。這些"運算子"回返最後操作元評估之值，而不是codice_99或是codice_100的情形。因此，表示式codice_112的計算結果為 codice_113，而codice_114的計算結果為 4。因此，表示式codice_112的計算結果為 codice_113，而codice_114的計算結果為codice_118。函數語言程式設計.如上所述，Python的另一個優勢是函數語言程式設計風格的可用性。正如所料，這使得使用列表及其他集合更加簡單。理解.L = [mapping_expression for element in source_list if filter_expression]第一級函式.在Python中，函式是可以動態建立以及傳遞的第一級物件。Python對匿名函式的有限支援是codice_23建構式。下列範例是對輸入值求平方的匿名函式，使用引數5來呼叫(呼叫)的：f = lambda x: x**2f(5)Lambda僅限於包含而不是語句陳述式，儘管"控制流"(control flow)仍可以透過使用短路在lambda中不太優雅地實現程式設計，並且更習慣地使用"條件表示式"(conditional expression)。閉包.def derivative(f, dx):"""Return a function that approximates the derivative of fusing an interval of dx, which should be appropriately small.def function(x):return (f(x + dx) - f(x)) / dxreturn function生成器.from itertools import countdef generate_primes(stop_at=None):primes = []for n in count(start=2):if stop_at is not None and n &gt; stop_at:return # raises the StopIteration exceptioncomposite = Falsefor p in primes:if not n % p:composite = Truebreakelif p ** 2 &gt; n:breakif not composite:primes.append(n)yield n生成器表示式.在Python 2.4中引入的生成器表示式是列表推導式的惰性求值等價式。使用上一節中提供的質數生成器，我們可以定義一個惰性求值方式但不是無限的集合。from itertools import isliceprimes_under_million = (i for i in generate_primes() if i  Distance修飾子.修飾子(裝飾器；修飾符)是用於修改函式、方法，或則類定義的任何可呼叫的 Python 物件。修飾子傳遞正被定義的原始物件、並返回修改後的物件；然後將其繫結到定義中的名稱之上。Python 修飾子部分受到 Java 註釋運用的啟發，並且具有類似 Java 的語法；修飾子語法是純粹的語法糖，使用 @ 作為修飾子的關鍵字：@viking_chorusdef menu_item():print("spam")相當於def menu_item():print("spam")menu_item = viking_chorus(menu_item)修飾子是超程式設計的一種形式； 它們增強了它們修飾的函式或方法的作用。 比如，在下面的示例中，viking_chorus 可能會導致 menu_item 每次被呼叫時執行 8 次：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():passblack_knight = invincible(favourite_colour("Blue")(black_knight))或者，使用中介架構的變數、如下程式所示：def black_knight():passblue_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 wrapperreturn decorator復活節彩蛋.一個隱藏資訊，Python之禪，在嘗試codice_128(匯入this) 時會顯示出來。