Python

通用高階程式語言 来自维基百科,自由的百科全书

Python

Python英語發音:/ˈpaɪθən/英語發音:/ˈpaɪθɑːn/),是一種廣泛使用的解釋型高級通用編程語言。Python支持多種編程范型,包括結構化、過程式、反射式、面向對象和函數式編程。它擁有動態類型系統垃圾回收功能,能夠自動管理內存使用,並且其本身擁有一個巨大而廣泛的標準庫。它的語言結構以及面向對象的方法,旨在幫助程序員為小型的和大型的項目編寫邏輯清晰的代碼。

事实速览 編程範型, 設計者 ...
Python
Thumb
編程範型多范型過程式結構化模塊化反射式面向對象函數式
設計者吉多·范羅蘇姆
實作者Python軟件基金會
面市時間1991年,​34年前​(1991[1]
當前版本
  • 3.13.2(2025年2月4日;穩定版本)[2]
  • 3.14.0a6(2025年3月14日;預覽版本)[3]
  • 3.13.3(2025年4月8日;穩定版本)[4]
  • 3.14.0a7(2025年4月8日;預覽版本)[4]
編輯維基數據鏈接
型態系統鴨子類型[5]動態強類型[6]漸進英語gradual typing(自從3.5)[7]
操作系統跨平臺
許可證Python軟件基金會許可證
文件擴展名.py、.pyi、.pyc、.pyd、.pyo(3.5之前)[8]、.pyw、.pyz(自從3.5)[9]
網站www.python.org 編輯維基數據鏈接
主要實作產品
CPythonPyPyStackless PythonMicroPythonCircuitPython英語CircuitPythonIronPythonJython
衍生副語言
CythonRPython
受影響於
ABC[10]ALGOL 68[11]APL[12]C[13]C++[14]CLU[15]Dylan[16]Haskell[17]Icon[18]Java[19]Lisp[20]Modula-3[14]Perl[21]Standard ML[12]
影響語言
BooCobra英語Cobra (programming language)CoffeeScript[22]DF#GDScript[23]Genie[24]Go[25]GroovyJavaScript[26][27]Julia[28]Mojo[29]NimRuby[30]Starlark英語Bazel (software)#Starlark language[31]Swift[32]
关闭

吉多·范羅蘇姆於1980年代後期開始研發Python,作為ABC語言的後繼者[18],它也可以被視為採用了叫做M-表達式英語M-expression中綴表示法的一種LISP方言[33]吉多·范羅蘇姆於1991年首次發布 Python 0.9.0[34]。Python 2.0於2000 年發布並引入了新功能。Python 3.0於2008年發布,它是該語言的主要修訂版,並非完全向後兼容。Python 2於2020年隨2.7.18版停止支持[35]

Python的設計哲學,強調代碼的可讀性和簡潔的語法,尤其是使用空格縮進來劃分代碼塊。相比於C語言Java,Python讓開發者能夠用更少的代碼表達想法。

Python解釋器本身幾乎可以在所有的操作系統中運行,它的官方直譯器CPython是用C語言編寫的。Python是一個由社群驅動的自由軟件,目前由Python軟件基金會管理。Python是最受歡迎的編程語言之一[36][37][38][39]

歷史

Thumb
Python創始人吉多·范羅蘇姆在2024年PyCon的照片

Python的創始人吉多·范羅蘇姆,在1982年至1995年間,參與了荷蘭數學和計算機科學研究學會多個項目的工作[40]。1989年的聖誕節期間,他決心開發一個新的腳本解釋程式,作為ABC語言的繼承者,並且用它替代Unix shellC語言來進行系統管理[18],擔負與Amoeba操作系統英語Amoeba (operating system)[41]之間的交互操作並進行例外處理[10]。他是BBC電視劇《Monty Python的飛行馬戲團》的愛好者,所以選取了Python作為這個編程語言的名字[42]。范羅蘇姆作為Python的主要開發者,獨自擔負這個項目的發展決策者職責,直到2018年7月12日,他宣布從終身仁慈獨裁者(BDFL)的職位上「永久休假」[43][44]。他在2019年1月至11月參與了第一屆五人掌控委員會繼續領導項目發展[45][46]

在1991年2月,范羅蘇姆在alt.sources上發布了最初代碼(標記為版本0.9.0)[1],這時就已經存在了帶繼承的例外處理函數和核心類型listdictstr等。在這個最初發行中就有了從Modula-3引進的模塊系統[47],和例外處理機制[10]。在1994年1月,Python版本1.0發布[48],其主要新特徵是由Amrit Prem提供的函數式編程工具lambdamapfilterreduce[49]。受Modula-3啟發,Python 1.1介入了缺省參數值,Python 1.3介入了關鍵字參數。Python 1.4介入了對複數的內建支持,還包含了採取名字修飾的一種基本形式的數據隱藏英語Information hiding[50]

在2000年10月,Python 2.0發布,它從函數式編程語言Haskell中引進了列表推導式,並且支持了Unicode,還向垃圾回收系統增加了檢測算法[51]。Python 2.1支持了靜態嵌套作用域閉包[52]。Python 2.2進行了重大革新,將Python中用C語言寫成的類型,和用Python語言寫成的,統一成在同一個層級中,使得Python的對象模型成為純粹而一致的對象模型[53];還介入了迭代器[54],受CLUIcon啟發的生成器[55],和描述器協議[56]。Python 2.3介入了從Dylan引進的方法決定次序[16]。Python 2.4介入了集合英語Set (abstract data type)類型,和函數修飾器[57]。Python 2.5介入了with語句[58],並在官方實現中介入了抽象語法樹[59]

在2008年12月,Python 3.0發布,它對語言做了較大修訂而不能完全後向兼容[60],儘管提供了進行自動轉換的2to3實用工具,仍有大量現存代碼不能移植,故而Python 2.7的產品壽命結束延期至2020年元旦。Python 3.4介入了異步I/O模塊[61]。Python 3.5介入了類型提示[62],和採用async/await語法的協程[63]。Python 3.8介入了賦值表達式[64][65]

在2020年10月,Python 3.9介入了內建的針對容器類的泛化別名types.GenericAlias類型[66],並在官方實現中介入了新的語法解析器[67]。Python 3.10介入了結構式模式匹配[68],和內建的聯合類型types.UnionType[69]。Python 3.11對官方實現進行了優化提速[70]。Python 3.12介入了類型參數語法和type語句[71],並廢棄或移除了一些過時的模塊和功能。Python 3.13介入了新的交互式解釋器,並實驗性的支持了在自由線程模態下運行和即時編譯器[72]

每個版本首次發行後,享有2年的完全支持,隨後是3年的安全支持。當前只有Python 3的穩定版本3.12與3.13正在被完全支持,但仍提供對3.9、3.10和3.11版本的安全性修正[73]

在2024年12月,活躍的Python核心開發者,選舉Pablo Galindo Salgado、Barry Warsaw、Emily Morehouse、Gregory P. Smith和Donghee Na,為2025年度「掌控委員會」的五位成員來領導這個項目[74]

特徵與設計哲學

Python是多范型編程語言。它完全支持結構化編程面向對象編程,還有很多特徵支持函數式編程元編程比如元對象協議元類和魔術方法[75])。通過擴展還可以支持很多范型,包括面向方面編程[76]契約式設計[77]邏輯編程[78]

Python使用動態類型,在內存管理上採用的垃圾回收器基於了引用計數[79],並且結合了檢測引用的分代垃圾回收優化[80]。它的特徵還有動態名字解析後期綁定英語late binding),即在程序執行期間綁定方法和變量的名字。

Python對遵循LISP傳統的函數式編程提供了有限的支持[81],它提供了 mapfilterreduce函數[82]列表推導式字典推導式集合英語Set (abstract data type)推導式生成器表達式。標準庫中的模組functoolsitertools,實現了從HaskellStandard ML借鑑來的函數式工具[83]

Python的設計理念是「優雅」、「明確」、「簡單」,它的一些重要準則被合稱為「Python之禪」。在Python解釋器內運行import this可以獲得完整的列表,下面舉出其中首要:

  • 優美優於醜陋。明瞭優於隱晦。
  • 簡單優於複雜。複雜優於凌亂。
  • 扁平優於嵌套。稀疏優於稠密。
  • 可讀性很重要。

Python開發者的方法論是「用一種方法,最好是只有一種方法來做一件事」,顯著不同於以Perl語言為代表的「不止一種方法去做一件事」風格。Python開發者在設計語言時,如果面臨多種選擇,一般會選擇明確沒有或者很少有歧義的語法。

范羅蘇姆認為ABC語言非常優美和強大,它沒有取得成功的原因是不開放造成的[84],故而將Python本身設計為可擴充的[85]。Python並不把所有的特性和功能都集成到語言核心,而是提供了豐富的API和工具,以便程式設計師能夠輕鬆地使用Python、C語言、Cython來編寫擴充模組。Python還可以通過外界函數接口英語Foreign function interface如標準庫中的ctypes等,來提供C語言兼容數據類型,並訪問動態鏈接庫共享庫中的函數[86],從而對用其他語言編寫的程式進行集成和封裝。

在Python的官方實現CPython中,一般避開不成熟的或者對非重要部位的加快運行速度的優化。在某些對運行速度要求很高的情況,可以使用具備JIT技術的Python實現或安裝JIT擴展模塊[87]

語法和語義

Python為了讓程式碼具備高度的可閱讀性,在設計時盡量使用了其它語言常用的符號和英文單字。

行結構

Python支持使用反斜槓作為行接續符,將多個物理行合成為一個邏輯行[88]。在圓括號方括號花括號之中的表達式,可以分裂跨越多於一個物理行而不使用反斜槓,這被稱為「隱式行接續」[88]注釋開始於並非字符串文字英語string literal一部份的一個井號#,並結束於物理行結尾;注釋標示邏輯行的結束,除非已受制於隱式行接續規則;注釋在語法上被忽略[89]

簡單語句包含在一個單一的邏輯行之內,Python支持使用分號作為分隔符,將多個簡單語句合併入語法意義上的一行之中[90]

縮排

Python語法中的複合語句,包含(成組的)其他語句;它們以某種方式影響或控制這些其他語句的執行。Python的複合語句包含一個或多個子句(clause),子句構成自一個頭部(header)和一個套件(suite)。特定複合語句的子句頭部都在同樣的縮排層級上,每個子句頭部開始於一個唯一標識關鍵字,並結束於一個冒號。套件是這個子句所控制的一組語句,套件有兩種形式,可以是與頭部在同一行上的一個或多個由分號分隔的簡單語句,它們跟隨在這個頭部的冒號之後;或者是在後續諸行上的一個或多個縮排的語句,只有這種套件形式可以包含嵌套的複合語句[91]

Python語言遵循越位規則,利用縮排來形成語句套件,即語法意義上的。連續諸行的縮排層級,被用來生成語法解析器才能見到的INDENTDEDENT記號[92],二者的作用相當於C語言家族的花括號,或Pascal語言家族的關鍵字beginend。增加縮排就生成INDENT記號,減少縮排就生成DEDENT記號。根據PEP 8的規定[93],使用4個空格來表示每級縮排[a]

tab字符(從左至右)被替代為1至8個空格,使得直到tab之前的諸字符加上這些替代空格的字符總數,是8的倍數(這意圖同於Unix所用規則)。前導於第一個非空白字符的空格的總數,確定了這一行的縮排層級。縮排所用諸字符,不能使用反斜槓來拆分成多個物理行;直到第一個反斜槓之前的空白確定縮排層級。如果源代碼文件混合了tab和空格,並且在這種方式下縮排的意義依賴於一個tab相當於多少個空格,則這種縮排因不一致性而被報錯並拒絕[94]

關鍵字

Python有如下35個關鍵字;它們不能用作標識符[95]

  • 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

內建常量TrueFalseNone於Python版本3.0中成為關鍵字,關鍵字nonlocal介入於版本3.0[96],關鍵字asyncawait介入於版本3.5[97],並在版本3.7中成為正式關鍵字[98]

在Python中,將只在特定上下文中保留的標識符,稱為「軟關鍵字」[99]

  • matchcase通配符_,介入於版本3.10,它們在與模式匹配語句有關的上下文中,可以在語法上充當關鍵字;但是這種區分只在語法解析器層次進行,並非在詞法分析記號化層次。
  • type,介入於版本3.12,它用在type語句之中。

標識符

標識符就是名字,在ASCII範圍內(U+0001..U+007F),可用於標識符的字符為:大寫字母AZ和小寫字母az,下劃線_以及數字09,但首字不可以用數字。如下命名約定[100],是為「保留標識符類」[101]

  • _spam(單下劃線開頭):弱「內部使用」標識。對於from M import *,將不導入所有以下劃線開頭的對象。
  • spam_(單下劃線結尾):為了避免與python關鍵字的命名衝突。
  • __spam(雙下劃線開頭):在命名一個類特性的時候,採用名字修飾,比如在類SpamEggs內,__spam將變成_SpamEggs__spam[102]
  • __spam__(雙下劃線開頭雙下劃線結尾):指那些包含在用戶控制的命名空間中的「魔術」方法或特性,比如__delattr____dir____doc____getattribute____init____new____repr____setattr____sizeof__等。建議永遠不要將這樣的命名方式應用於自己的變量或函數。

在Python文獻中經常使用的元語法變量英語metasyntactic variablespam和eggs英語Spam (Monty Python)而非傳統的foo和bar[102]

語句

Python的語句包括簡單語句:

  • 賦值語句,採用的中綴記號是等號=。賦值語句被用來將名字綁定(含重新綁定)到值,以及用來修改可變對象特性或項目。
    • Python還支持增廣賦值語句[103],將一個二元運算和一個賦值語句合併成一個單一語句,例如x += 1
    • Python支持「序列解包」(sequence unpacking)[104]:在等號左側可以是一個表達式列表,其中每個表示式都可求值成能被賦值的東西(變量、可寫特性等);在等號右側相應的是一個「可迭代」對象,它在被迭代時產生的值的數量,同於左手側可寫表達式的數量;賦值語句對這個對象進行迭代,將產生的每個值分別賦值給左側對應的可賦值者。在等號右側直接包裝出序列解包所要求的元組,就形成了並行賦值,可以同時給多個變量賦值,還可以交換兩個變量的值。[b]
  • 表達式英語Expression (computer science)語句,用來交互式的計算並寫出一個值,或者用來調用一個過程(即返回無含義結果的函數),在Python中過程返回值None
  • global語句,是在整個當前代碼塊中成立的聲明,它意味着隨後列出的標識符被解釋為全局變量。
  • nonlocal語句,導致隨後列出的標識符,提及在除了全局作用域之外的最近包圍作用域中的先前綁定變量。
  • type語句,介入於版本3.12,聲明作為類型別名類型typing.TypeAliasType)的實例的一個類型別名。
  • pass語句,充當NOP,表示此行為空,不執行任何操作。
  • assert語句,用於程式調適階段時測試執行條件是否滿足。
  • continue語句,越過這次迭代並繼續進行下個項目。
  • break語句,從循環中跳出。
  • return語句,用來從函數返回值。當函數執行到return語句時,它會停止執行並將指定的值返回給調用者。
  • raise語句,拋出一個例外。
  • yield語句,使用它從一個生成器中返回一個值。在版本2.5之前,信息只能單向的從生成器傳遞出來。[c]
    • 自此版本2.5,重定義yield為表達式[105],通過它的返回值將信息傳遞進入生成器函數中[106],從而能夠支持協程功能[106][d]yield語句在語義上等價於加圓括號的yield表達式[107]
    • 自從版本3.3,提供了yield from語句,含有這個語句的「委託生成器」將其部份運算委託給另一個「子生成器」,將傳入信息遞送給它並直接回傳它產生的值[108]。版本3.4在異步I/O框架中擴展了基於生成器的協程[109],這個擴展自從Python 3.8已經被棄用[110]
    • 自從版本3.6,介入了生成async for語句所用的異步迭代器的異步生成器[111]
  • import語句,導入一個模塊或包,它組合了兩種操作,查找指名的模塊,接着將找到的結果綁定到在局部作用域中的名字。導入語句有三種形式(下述語句樣本中的方括號表示其中內容為可選的):
    • import 模块名字 [as 别名],找到一個模塊,裝載它,如果有需要的話初始化它;在這個導入語句出現的作用域的局部名字空間中,定義一個名字或一些名字[112]
    • from 模块名字 import 定义1 [as 别名1], 定义2 [as 别名2], ...,找到、裝載、必需時初始化一個模塊;接着在局部名字空間中,增加到找到指名特性的引用[112]
    • from 模块名字 import *,在導入語句出現的作用域的局部名字空間中,綁定模塊中定義的所有公開的名字[113]
  • del語句,遞歸的進行刪除。

複合語句:

  • if語句,當條件成立時執行語句套件。它經常包含elifelse子句。
  • while語句,當條件為真時,重複執行語句套件。
  • for語句,遍歷列表、字符串、字典、集合等迭代器,依次處理迭代器中的每個元素。
  • match語句,用於模式匹配
  • try英語Exception handling syntax語句,它經常包含exceptelsefinally子句,處理在程式執行中出現的異常情況。Python支持並廣泛使用例外處理,作為檢測錯誤狀況和程序中其他「例外」事件的方式,並提倡在可能出現錯誤狀況的任何時候都使用例外。習慣上訪問一個文件或資源不在使用之前進行測試,而是先行嘗試使用它,再捕獲訪問被拒絕引發的例外。[e]Python 3.11介入了except*子句[114]
  • with語句,把一塊代碼包裹在一個上下文管理器之內。它允許了資源獲取即初始化(RAII)式行為,可替代常見的try/finally慣用法。Python使用with語句處理資源[115],在進入一個作用域的時候調用一個函數,而在離開它的時候調用另一個函數,例如:在一塊代碼執行之前獲取一個,並且在此後釋放這個鎖;或事先打開一個文件,並且事後關閉它。[f]
  • class語句,是定義的可執行語句。類的繼承列表給出基礎類列表,沒有繼承列表的類,缺省繼承基礎類object。類的套件接着在新的執行框架(frame)中執行,它使用新建的局部名字空間和原來的全局名字空間。當這個類套件完成執行之時,丟棄它的執行框架並保存它的局部名字空間。一個類對象接着被創建,其基礎類採用繼承列表,其特性字典採用保存的局部名字空間。類名字接着在原來的局部名字空間中,被綁定到這個類對象。
  • def語句,是定義函數方法的可執行語句。它的執行在當前局部名字空間中,將函數名字綁定到一個函數對象(對函數的可執行代碼的包裝器)。這個函數對象包含到當前全局名字空間的引用,作為調用這個函數時使用的全局名字空間。
  • async def語句,用於協程函數定義。await表達式、async for語句和async with語句,只能用在協程函數的主體中。[g]

塊與模塊

Python程序構造自代碼。塊是作為一個單元執行的Python程序文本,模塊、函數主體和類定義都是塊。交互式鍵入的每個命令、腳本文件和腳本命令都是代碼塊。傳遞給內建函數eval()exec()執行的字符串是代碼塊。

代碼塊在執行框架(frame)中執行。框架包含一些用於調試的管理信息,並確定在這個代碼塊執行完成後,執行在何處以及如何繼續。名字空間是存儲變量的地方,它被實現為字典。有局部名字空間、全局空間即包含此代碼塊的那個模塊的名字空間,和內建名字空間即模塊builtins的名字空間;對象的方法是定義在類主體內的函數,它有着嵌套的名字空間。名字空間通過防止命名衝突而支持了模塊性,還通過明晰了哪個模塊實現了哪個函數而增進可讀性和可維護性。

模塊是包含Python定義和語句的一個文件,這個文件名字是模塊名字附加上後綴.py;在一個模塊中,模塊的名字(作為字符串)可獲得為全局變量__name__的值[113]。包(package)是可以包含子模塊或遞歸性的子包的模塊。包在技術上是具有__path__特性的Python模塊。可以將包視為文件系統上的目錄,而將模塊視為這種目錄中的文件,但是包和模塊不必然源自文件系統[116]

完整的Python程序,在一個極小初始化的環境中執行:所有內建和標準模塊均可獲得,但除了sys(各種系統服務)、builtins(內建函數、例外None)和__main__之外都未被初始化。__main__用來為完整程序的執行提供局部和全局名字。當解釋器被調用在交互模態下的時候,它一次一個的讀取並執行語句;初始環境同於完整程序,每個語句都在__main__的名字空間中執行。

頂層代碼是啟動運行的首個用戶指定Python模塊。__main__是頂層代碼運行所在的環境。從命令行使用-m參數,作為頂層腳本運行的模塊(作為模塊__main__)是代碼塊。此時__name__變量被設置為"__main__",籍此可在這個模塊中增加直接運行時候執行的代碼[113][117]

名字是通用的引用持有者,它不關聯於一個固定的數據類型,但是,一個名字在給定時間,總是被綁定到有一個類型的某個對象上,這就是動態類型的特徵。名字的存儲位置不「包含」所指示的值,一個共同的值可以賦值給多個名字,一個名字在任何時候,都可以重新綁定到各種不同類型的對象上,包括字符串、過程、具有數據和方法的複雜對象等。如果一個名字綁定在一個中,它是這個塊的局部變量,除非被聲明為nonlocalglobal。如果一個名字綁定在模塊層次,它是全局變量。模塊代碼塊的變量,既是局部的也是全局的。如果一個變量使用在一個代碼塊中,卻不定義在這裡,它是自由變量[118]

內建vars()函數,返回一個模塊、類、實例或任何具有字典特性__dict__的對象的字典特性。內建globals()函數,返回實現當前模塊的名字空間的一個字典。內建locals()函數,更新並返回表示當前局部符號表的一個字典。在函數塊中而非類塊中調用locals()之時,它返回自由變量。在模塊層級上,locals()globals()返回同一個字典。內建dir()函數,在無參數時,返回在當前局部作用域內的名字列表;在有一個參數時,嘗試返回這個對象的有效特性的列表。[119]

在Python中賦值所進行的操作,是將一個名字綁定為到一個分立的動態分配的對象的一個引用。除了在塊中出現的每個賦值語句或導入語句之外,下列構造也綁定名字:給函數的形式參數、類定義、函數定義、賦值表達式、在for語句頭部中和各種as關鍵字之後的標識符目標(target),as關鍵字出現在import語句、with語句、except子句、except*子句和結構式模式匹配的as模式之中。

作用域定義一個名字在一個中的可見性。如果一個局部變量被定義在一個塊中,它的作用域包括這個塊。如果這個定義出現在一個函數塊中,作用域擴展到在所界定作用域內包含的任何塊,除非所包含的塊為這個名字介入了不同的綁定。當一個名字在一個代碼塊之中使用,它採用最近包圍作用域來解析。對一個代碼塊可見的所有這種作用域的集合,叫做這個這個塊的「環境」[118]

如果一個名字綁定在一個塊中,並且在其中於綁定之前就被使用,會導致一個錯誤。[h] 如果global語句出現在一個塊之中,在這個語句中指定的所有名字,提及在頂層名字空間中這些名字的綁定。名字在頂層名字空間解析,首先查找全局名字空間,未果查找內建名字空間。global語句與在同一個塊中的名字綁定運算有同樣的作用域。如果一個自由變量的最近包圍作用域包含針對它的global語句,這個自由變量被當作全局的[118][i] 當一個函數或類的定義被嵌套到其他函數的定義之內,它的非局部作用域就是這個包圍函數的局部作用域。nonlocal語句導致其列出的標識符,提及在非局部作用域內先前綁定的名字(即非局部變量英語Non-local variable[118][j]

表達式

Python中很多表達式英語Expression (computer science)C語言和java類似,而另一些則與之不同。

  • 在Python中,算術運算的加法+、減法-、乘法*取模%是與C語言和java相同的,但是除法的行為不同。在Python中有兩種除法,它們是下取整除法(或整數除法)//和浮點除法/。Python增加了指數算符**。自從Python 3.5,介入了矩陣乘法算符@[120],它已經用於了NumPy[121]
  • 在Python中,有如下必須用於整數的運算:&與(AND),|或(OR),~非(NOT),^異或(XOR),>>右移, <<左移。
  • 在Python中,有如下比較運算:大於>,小於<,等於==,不等於!=,小於等於<=,大於等於 >===按值比較。Python的isis not算符可以用來比較對象的同一性(按引用比較),也就是比較兩個變量是否引用了同一個對象。而innot in用於判斷一個對象是否屬於另外一個對象。在Python中,比較是可以鏈接起來的[122],比如a < b < c
  • Python使用andornot表示邏輯運算與、或、非,不採用C語言和Java中所用的符號&&||!
  • 在Python中,由逗號,分隔的一組表達式,叫做表達式列表。Python為構造列表、字典或集合,提供了叫做「展示」(display)的特殊語法,它們每個都有兩種方式:包容內容要麼顯式列舉出來;要麼通過一組循環和過濾指令計算而來,這叫做「推導式」。列表展示是包圍在方括號中的可以為空的一系列表達式,一個例子列表可寫為[1,2,3]。字典展示是包圍在花括號中的可能為空的一系列的鍵/數據項對。集合展示用花括號來指示,與字典展示的區別是缺少分隔鍵與值的分號[123]。自從Python 3.5,增加了在表達式列表中的「可迭代解包」*,和在字典展示中的「字典解包」**[124][k]
  • 在Python中,加圓括號形式(parenthesized form),是包圍在圓括號中的一個可選表達式列表。加圓括號的表達式列表產生的東西,就是這個表達式列表所產生的:如果這個列表包含至少一個逗號,它產生一個元組;否則它產生構成這個表達式列表的那個單一表達式[126]。一個例子元組可寫為(1,2,3)。元組不是圓括號形成的,而是使用逗號形成的,在沒有歧義的情況下,元組的圓括號是可選的。空的圓括號對產生空元組對象。使用序列串接算符+來串接二個元組,產生包含給定元組二者的元素的一個新元組。
  • Python支持在序列對象(比如字符串、元組或列表)上的下標(subscription)表達式:a[索引],和分片英語array slicing表達式:a[开始:停止]a[开始:停止:步长]。下標索引是基於零的,負數是相對於結尾的。分片範圍自從「開始」索引,直到但不包括「停止」索引。分片的第三個參數叫做「步長」(step)或「間隔」(stride),允許元素被跳過和用負數指示反向。分片索引可以省略,例如a[:],這返回整個列表的一個複本。[o]分片的每個元素都是淺層複製英語Object copying的。
  • Python的條件表達式表示為x if c else y。意思是當c為真時,表達式的值為x,否則表達式的值為y。 在運算元的次序上不同於很多其他語言中常見的c ? x : y
  • Python的匿名函數實現為lambda表達式。匿名函數體只能是一個表達式。[p]
  • 自從Python 3.8,介入了賦值表達式,其記號是:=[64]。它將一個表達式賦值給一個標識符,同時還返回這個表達式的值。賦值表達式在用作子表達式,即位於分片表達式、條件表達式、lambda表達式、關鍵字參數中的表達式和推導式中的if表達式之中,以及在assertwith語句之中的時候,必須圍繞着圓括號。在它們可以使用的所有其他地方,包括在ifwhile語句之中,都不要求圓括號[127]

Python中運算符具有優先級,下表中的運算符按照從最高到最低的次序列出。在相同單元格中運算符具有相同的優先級,它們從左至右結合,除了指數表達式和條件表達式從右至左結合之外[128]

更多信息 運算符, 描述 ...
運算符 描述
(表达式...)[表达式...]{: ...}{表达式...} 加圓括號表達式,列表展示,字典展示,集合展示
x[索引]x[索引:索引]x(参数...)x.特性 下標,分片,調用,特性引用
await x await表達式
** 指數
+x-x~x 取原數,相反數,逐位NOT
*@///% 乘法,矩陣乘法,除法,下取整除法,餘數
+- 加法和減法
<<>> 移位
& 逐位AND
^ 逐位XOR
| 逐位OR
innot inisis not<<=>>=!=== 包含成員關係測試,同一測試,各種比較
not x 布爾NOT
and 布爾AND
or 布爾OR
if – else 條件表達式
lambda lambda表達式
:= 賦值表達式
关闭

Python提供了序列串接算符+和序列倍增算符*[129]。自從Python 3.9,介入了字典歸併算符|和字典更新算符|=[130]

Python的文本序列類型,包括字符串str和字節序列bytesbytearray字符串文字英語string literal有多種寫法,字符串對象有一個內建格式算符%

  • 短字符串文字,由單引號'或雙引號"界定。不同於Unix shellPerl和受Perl影響的語言,單引號和雙引號功能相同。這二種字符串都使用反斜槓\作為轉義字符
  • 長字符串文字,是開始並結束於三個單引號'''或三個雙引號"""的序列。它們可以跨越多行,其功能就像shellPerlRuby中的here文檔[q]
  • 字節文字英語Literal (computer programming)總是前綴上一個bB,它產生bytes類型的實例。它們只可以包含ASCII字符,具有128或更大數值的字節必須通過轉義來表達。
  • 字符串文字或字節文字都可選的能前綴上一個rR,這叫做原始字符串英語String literal#Raw strings。轉義序列不被解釋,因此在文字反斜槓常見的地方很有用,比如正則表達式Windows風格的路徑。[r]這種引述可比較於C#中的「@引述」。
  • Python允許多個毗鄰的字符串文字或字節文字(它們以空白分界並可以使用不同的引述約定),在編譯時間於語法層面上串接起來。要在運行時間串接字符串,必須使用序列串接算符+[131][s]
  • Python中的「字符串格式」算符%,在功能上類同於C語言中的printf格式化字符串[132],例如"spam=%s eggs=%04d" % ("blah", 2),求值為'spam=blah eggs=0002'。自從Python 3.0,str類提供了可供替代的format()方法[133],例如"spam={0} eggs={1:04d}".format("blah", 2)。在Python 3.6中,提供了「格式化字符串文字」或稱為「f字符串」,它向字符串文字前綴上fF[134],這是一種字符串插值英語String interpolation[135],例如x="blah"; y=2; f'spam={x} eggs={y:04d}'[t]

在Python中,在表達式和語句之間的區別是嚴格強制性的,這對比於語言如Common LispSchemeRuby。故而Python中個別構造存在功能重複,比如:列表推導式相當for循環;條件表達式相當if語句;內建函數eval()相當exec(),前者用於表達式,後者用於語句。

語句不能成為表達式的一部份,由於列表和其他推導式或lambda表達式,都是表達式,也就不能包含語句。這個限制的一個示例:賦值語句比如a = 1,不能用作條件語句的條件判斷表達式的一部份;這能夠避免C語言編程中的一個常見錯誤,即在條件判斷時把等於算符==誤寫為賦值算符=,這不是預期代碼卻在語法上有效而能通過編譯器檢查,在Python中這會導致一個語法錯誤。

函數

Python的函數支持遞歸閉包[u],及其他頭等函數特徵,但不支持函數重載。Python的函數作為頭等對象,具有和普通對象平等的地位。Python官方實現不提供尾調用優化或頭等續體,吉多·范羅蘇姆曾聲稱永遠都不會加以支持[136],但有第三方庫支持彈跳床英語Trampoline (computing)[137]

Python可以在函數定義時,於形式參數序列中,指定形式參數缺省值,即以param=value樣式進行一次性初始化。形式參數在初始化之後,保持既有綁定;函數的後續調用,可繼續對它進行訪問或變更。[v]為有缺省值的形式參數提供實際參數,在函數調用時是可選的。

Python的函數實際參數與形式參數之間的結合,是傳遞「對象引用」,函數在被調用的時候,給函數調用的實際參數,被介入到一個局部符號表中,實際參數使用傳值調用來傳遞,而這個值總是對象引用,而非這個對象的值[138]。如果形式參數綁定到一個可變的對象,則通過形式參數對此對象內容的修改,在函數外也是可見的。如果形式參數綁定到一個不可變的對象,則通過形式參數是不能修改此對象內容,但可以把形式參數重新綁定到其它對象上,這並不影響函數外的對象的值。[w]

Python支持位置實際參數和關鍵字實際參數。函數調用時,實際參數可以如同C語言那樣,按照位置與形式參數匹配;也可以採用命名參數或稱為關鍵字實際參數,即kwarg=value樣式的實際參數。使用不對應實際參數的特殊形式參數/*,可以將參數序列分為三部份:唯位置參數[139]、可位置可關鍵字參數和唯關鍵字參數。有缺省值的形式參數之後,不能跟隨無缺省值的可位置形式參數。[x]在一個函數調用的實際參數序列中,關鍵字實際參數必須出現在位置實際參數之後。

在位置和關鍵字形式參數序列末尾,可以分別有*args**kwargs這樣的形式參數,它們對應於在函數調用時提供的,超出形式參數序列規定而無所對應的多個實際參數;在形式參數名字前加一個*號,該形式參數argstuple類型,對應可變數目的位置實際參數;在形式參數名字前加**號,該形式參數kwargsdict類型,對應可變數目的關鍵字實際參數。[y]如果位置實際參數已經在一個序列類型如列表或元組的對象中,在引用它的變量前加一個*號傳遞給函數,則其中所有元素解包為多個位置實際參數;如果關鍵字實際參數在字典中,則加**號來傳遞給函數。

修飾器(decorator)可用來修改一個函數、方法或類定義的任何可調用Python對象。將已定義的原來對象傳遞給修飾器,它返回一個修改後的對象,接着把它綁定到在定義中那個名字。Python修飾器部份受到Java註解的影響,而有類似的語法;修飾器語法是純粹的語法糖,使用@作為關鍵字形成修飾符。修飾器是一種形式的元編程,它們增強它們所修飾的函數或方法的行動。[z] 多個修飾器可以鏈接起來,通過在毗連的行上放置多個修飾符,或者使用中間變量。[aa] 函數修飾器的正規用法包括:用來建立類方法靜態方法[57]、設置先決條件後置條件、實現多方法、增加函數特性、跟蹤英語Tracing (software)同步[140];此外更遠大的用法包括:尾調用消除記憶化[141]

為了增強代碼的可讀性,可以在函數後書寫「文檔字符串」(簡稱docstrings),用於解釋函數的作用、參數的類型與意義、返回值類型與取值範圍等。可以使用內置函數help(),打印出函數的使用幫助。[ab]自從Python 3.0,函數可以對參數與返回值增加類型標註[142]。此特性可方便對源代碼進行更深入的分析。[ac]自從Python 3.5,開始支持類型提示[143]

對象及其方法

Python支持大多數面向對象編程技術。在Python中所有東西都是對象,包括、函數、數和模塊。它允許多態性,不只是在類層級英語Class hierarchy之內,而且通過採用鴨子類型的方式[5]。任何對象可以用於任何類型,只要它有適當的方法特性(attribute)就能工作。Python天然支持繼承包括多重繼承,為此採用C3線性化或方法決定次序(MRO)算法,還支持混入。Python支持元類[144],自從Python 3.6,提供了定製類創建的簡單機制[145]

Python使用名字修飾,有限的支持私有變量。對象的(可寫)特性可以被提取為一個字典[146]。在Python中,不強制使用訪問子變異子方法,來訪問數據成員的面向對象編程信條。就像Python提供函數式編程構造,但不嘗試要求參照透明性英語referential transparency一樣,它提供對象系統,但不要求面向對象編程行為。

對象方法,是附屬於這個對象的的函數。對於正常的方法和函數,語法instance.method(arguments),是Class.method(instance, arguments)語法糖。Python的方法有顯式的self英語this (computer programming)形式參數,用來訪問實例數據;這借鑑自Modula-3,對立於隱式的selfthis英語this (computer programming)關鍵字,它們用在其他一些面向對象編程語言,比如C++JavaObjective-CRuby之中[147]。在Python中,self可以被看作是一個習慣用法,它可以被換為任何其它合法的參數名。[ad]

Python提供了super()內建函數,在一個類的方法中調用此函數返回一個代理(proxy)對象,它將其方法調用委託給這個類的父類或兄弟類[148],當一個子類的方法覆蓋超類方法的時候,可通過調用super().method,來調用與子類的self.method方法同名超類方法。[ae] Python支持一些以__開始和結束的特殊方法名,它們用於實現運算符重載,以及實現多種特殊功能[75]。在Python中,可以通過定義特殊方法來重載運算符,比如在一個類上定義__add__(),將允許在這個類的實例上使用+算符。

在Python中,定義了一個或多個特殊方法__get__()__set__()__delete__()的類,可以用作描述器(descriptor)[149]。建立一個描述器的實例,作為另一個類的一個類成員,使得這個實例成為此另一個類的屬性(property)。使用與特性(attribute)訪問相同的語法,訪問一個實例對象中的這個成員屬性。[af]

Python允許通過使用@classmethod@staticmethod修飾符,來分別建立類方法靜態方法[57]。給類方法的第一個實際參數,是對類對象的引用,而非對實例的self引用。靜態方法沒有特定的第一個實際參數,實例或類對象,都不固定的傳遞給靜態方法。[ag] Python的property內建函數,將一個類中特殊定義的訪問一個特性的那些方法,包裝成的這個類的一個屬性[150][ah]

類型

Thumb
Python 3的標準類型層級[151]

Python使用鴨子類型,並擁有有類型的對象,和無類型的變量名字。在編譯期不檢查類型約束,而寧願在一個對象上的操作出現可能的失敗,表現出這個給定對象不具有適合的類型。儘管是動態類型系統,Python卻是強類型的,禁止沒有明確定義的操作(比如加一個數到一個字符串),而不是默默的去嘗試轉換使其有意義。Python支持廣泛的類型和類的內省。類型是type的實例,可以被讀取和比較。

Python有着範圍廣泛的基本數據類型。同時具備常規的整數和浮點算術,它透明的支持任意精度算術複數十進制浮點數英語Decimal floating point。Python支持種類繁多的字符串操作。在Python中,字符串是不可變的,所以在其他編程語言中可能就地改變字符串的字符串操作,比如字符替換,在Python中返回新的字符串。

Python有一個非常有用特徵,就是搜集(或稱容器)類型的概念。一般的說,搜集是以一種易於引用或索引的方式,包含其他對象的對象。搜集有二種基本形式:序列和映射。Python對建立容器類型的對象有着語法上的支持。[ai]Python還提供了廣泛的搜集操縱能力,比如內建的包含元素檢查和通用迭代協議

有次序的序列類型是列表(動態數組英語array data type)、元組和字符串。所有序列類型都是位置索引的(從0长度−1),並且除了字符串,都可以包含任意類型的對象,在同一個序列中包括多種類型的對象。字符串和元組是不可變的,使得它們成為字典的鍵的完美候選者。在另一方面,列表是可變的,元素可以被插入、刪除、修改、添加或就地排序。

在另一方面,映射是以「字典」形式實現的無次序的類型,它將一組不可變的鍵,映射到相應的元素上(非常像數學函數)。在字典中的鍵,必須是不可變的Python類型,比如整數或字符串,因為在底層它們是通過散列函數實現的。字典還是語言內部的中心,因為它們居於所有Python對象和類的核心:在變量名字(字符串)和這個名字所引用的值之間的映射,就存儲為字典,而這些字典可以通過對象的__dict__特性直接訪問。

集合英語Set (abstract data type)搜集類型,在版本2.4中被增加入語言核心。集合是無索引、無次序的搜集,它包含唯一性的不可變對象作為元素,並且實現了集合論運算,比如併集|交集&相對補集-對稱差^,和子集測試<=真子集測試<超集測試>=真超集測試>。有二種類型的集合:可變的set和不可變的frozenset

Python允許編程者使用,定義自己的類型[53],類是在面向對象編程中最經常使用的。類的新實例,是通過調用這個類的構造器而創建的,而類都是元類type的實例,typetype元類自身的實例,這允許了元編程反射[aj]

在版本3.0之前,Python有兩種類:舊式的和新式的[152]。二種樣式的語法是一樣的,不同在於是否直接或間接的繼承自類object,所有新式類都從object繼承,並且是type的實例。在Python 2系列2.2以上,二種類都可以使用[53]。在Python 3.0中淘汰了舊式類。

長期規劃是支持漸進類型英語gradual typing[7],並且自從Python 3.5,語言的語法允許指定靜態類型,但在缺省實現CPython中不檢查它們[143]。有叫做「mypy」的可選的靜態類型檢查器,支持編譯期類型檢查[153]

更多信息 類型, 可變性 ...
Python 3內建類型小結
類型 可變性 描述 語法例子
bool 不可變 布爾值,有表示值FalseTrue的兩個對象。作為整數類型numbers.Integral的子類型,它們在幾乎所有上下文中,表現得如同01,除了在轉換成字符串時轉換為"False""True"之外。 True
False
int 不可變 整數,其大小在理論上無限制,實際上受限於內存[154] 42
float 不可變 雙精度浮點數,確切精度依賴於機器。一般實現為IEEE 754標準binary64浮點數,它有53個二進制有效數位精度[155] 1.414
complex 不可變 複數,即分別表示實部與虛部的兩個雙精度浮點數的有序對 3+2.7j
range 不可變 數的序列,通常用在for循環中指定循環次數[156] range(1, 10)
range(10, -5, -2)
str 不可變 字符串,即Unicode代碼點序列。字符串中的代碼點都在範圍U+0000..U+10FFFF之內。Python沒有char類型,這些代碼點都表示為長度為1的字符串對象。
'Wikipedia'
"Wikipedia"
"""Spanning
multiple lines"""
bytes 不可變 字節序列,其項目是8位字節,用範圍0 <= x < 256的整數表示。 b'Some ASCII'
b"Some ASCII"
bytes([0x53, 0x74, 0x72])
bytearray 可變 bytearray(b'Some ASCII')
bytearray(b"Some ASCII")
bytearray([0x53, 0x74, 0x72])
list 可變 列表,可以包含任意的Python對象。 [4.0, 'string', True]
[]
tuple 不可變 元組,可以包含任意的Python對象。只有一個項目的元組,可以通過向表達式後綴一個逗號來形成。 (4.0, 'string', True)
('single element',)
()
dict 可變 鍵-值關聯數組(常稱為字典),即由任意索引集合來索引的對象的有限集合英語Set (abstract data type)。不可接受為鍵的值,是列表或字典,或按值而非對象同一性比較的其他可變類型的值,其散列值不能保持恆定。 {'key1': 1.0, 3: False}
{}
set 可變 無序有限集合英語Set (abstract data type),包含唯一性的不可變的對象,它們不能用任何下標來索引。 {4.0, 'string', True}
set()
frozenset 不可變 frozenset([4.0, 'string', True])
types.EllipsisType 不可變 這個類型有一個單一對象作為值,它通過文字...或內建名字Ellipsis英語Ellipsis (programming operator)來訪問,它的真值為真。它用於NumPy多維陣列索引[157] ...
Ellipsis
types.NoneType 不可變 這個類型有叫做None的一個單一對象Null作為值[158],它被用來指示值的缺席,比如不返回任何東西的函數返回它,它的真值為假。 None
types.NotImplementedType 不可變 這個類型有一個單一對象NotImplemented作為值。數值方法和細化比較方法,在它們仍未對提供的運算元實現這個運算之時,返回這個值。它不應該在布爾值上下文中求值。 NotImplemented
关闭

除了各種數據類型,Python解釋器還內建了很多其他類型,包括可調用類型:用戶定義函數、實例方法、生成器函數、協程函數、異步生成器函數、內建函數、內建方法、類、類方法;模塊,定製類,類實例,I/O對象(也叫做文件對象),和暴露給用戶的一些內部類型:代碼對象、框架對象、溯回對象、切片對象、靜態方法對象、類方法對象。

算術運算

Python的算術運算,使用平常的符號+-*/模除%。它還有下取整除法算符//指數算符**矩陣乘法算符@[120]。二元運算先將兩運算元轉為共同類型,加法、減法、乘法、下取整除法和指數運算的結果也採用此類型,比如5**3 == 1259**0.5 == 3.0。這些算符就像在傳統數學中一樣運算,具有同樣的優先級規則中綴算符+-,還可以分別表示取原數和取相反數一元算符。

被稱為「真除法」的/的表現,隨着版本不同而有着顯著變化[159]。自Python 3.0以來,/總是產生浮點數結果,包括兩個整數相除,比如5/2 == 2.5;而在下取整除法//中,兩個整數相除產生整數,比如7//3 == 27.5//3 == 2.0

下取整除法//修約是朝向負無窮的。向下取整能增加一致性[160],例如這意味着等式(a + n)//n == a//n + 1總是為真。模除%所得出的餘數的符號同於除數,比如-4%3 == 24%-3 == -2。其它多數編程語言比如C99採用截尾取整規則,餘數的符號同於被除數。模除運算結果餘數的定義,確使等式a == (a//n)*n + a%n對於an分別為正數或負數的情況都是有效的[161]。餘數可以為負數,顯著不同於在數學中的歐幾里得除法規則下,餘數總是非負數的情況。

Python提供了round()內建函數,用於把一個浮點數修約成最近的整數[162],自Python 3.0以來,為了打破平局它採用了IEEE 754約半成偶規則:round(1.5)round(2.5)都產生2

Python允許由比較運算鏈接起來的布爾表達式,表現得如在數學中常用的一樣。比如表達式a < b < c,測試a < b and b < c[122]。C語言將它解析為(a < b) < c:即首先求值a < b,其結果為01,接着把這個結果比較於c[163]

Python對所有整數運算,使用任意精度算術。在decimal模塊中的Decimal[164],提供十進制浮點數英語Decimal floating point,具有用戶可按需要而更改的缺省28個十進制有效數位精度,並有多種修約方式[165]。在fractions模塊中的Fraction類,提供任意精度的有理數[166]。第三方庫gmpy2[167],提供了到任意精度計算GMP/MPIR英語MPIR (mathematics software)MPFR英語GNU MPFR和MPC的接口。

除了求絕對值函數abs()列入內建函數之外,大多數數學函數,處於mathcmath模塊內。前者用於實數運算,而後者用於複數運算。[ak]由於Python有着廣泛的數學庫,特別是第三方庫NumPy進一步擴展了固有能力,Python經常被用作科學腳本語言,來處理如數值數據處理和操縱等問題[168][169]

標準庫

Python擁有一個強大的標準庫[170]。Python標準庫包括了如下功能:

程序代碼實例

一個在標準輸出設備上輸出Hello World的簡單程式,這種程式通常作為開始學習程式語言時的第一個程式,可將如下代碼錄入純文本文件並隨意命名比如program01.py,然後執行這個程序python3 program01.py

print("Hello, world!")

Python也可以單步直譯執行。執行Python直譯器進入互動式命令列的環境,你可以在提示符號>>>旁輸入print("Hello, world!"),按Enter鍵輸出結果:

>>> print('Hello, world!')
Hello, world!

計算正數的階乘的程序代碼:

n = int(input('輸入一個數,就會印出其階乘: '))
if n < 0:
    raise ValueError('錯誤,請輸入一個非負整數')
fact = 1
for i in range(2, n + 1):
    fact *= i
print(fact)

注意,在Python 3.0及以上版本中,print是個函數,需要在要打印的字符串前後加上圓括號;在Python 2.6以下版本中,print是一個關鍵字和命令而不加圓括號。

實現

Python是一門跨平台的腳本語言,Python規定了一個Python語法規則,根據該規則可編寫Python直譯器[171]。Python屬於動態語言,其官方實現將Python程序編譯成中間形式的字節碼[172],並接着在它的虛擬機上執行[173],相較於C/C++和java的等編譯語言而言運行速度較慢[174]

活躍開發的實現
  • CPython:官方的直譯器,需要區別於其他直譯器的時候才以CPython稱呼。CPython默認採用全局解釋器鎖(GIL),以確保在任何時刻只有一個線程執行Python字節碼;一些擴展模塊被設計為在進行計算密集任務時釋放GIL,還有在進行I/O時總是釋放GIL[175]
  • PyPy:用RPython編寫的Python實現,兼容至CPython版本3.10和2.7,它採用了跟蹤JIT英語Tracing just-in-time compilation,缺省支持stackless模態。
  • MicroPython:為微控制器而優化的Python 3變體,它實現了完整的Python 3.4語法,和補充自版本3.5的async/await關鍵字,和後來版本的一些選定特徵;它提供了實現Python標準庫模塊功能子集的內建模塊,和特定於微控制器的一些模塊。CircuitPython英語CircuitPythonAdafruit英語Adafruit Industries開發的MicroPython分叉。
  • Codon:使用了LLVM的高性能Python編譯器[176],它將Python代碼編譯成本機機器代碼,不帶有任何運行時開銷並且支持本機多線程,它的語義在數據類型等方面上與CPython有所不同[177],它由MIT CSAIL的研究人員開發[178]
  • Pyodide:基於WebAssembly/Emscripten的用於瀏覽器Node.js的Python發布[179],支持任何在PyPIwheel形式的純Python包,並且已經移植了很多具有C語言擴展的包。
  • RustPython:用Rust編寫的Python解釋器[180],它可以嵌入到Rust應用程序中從而將Python用作腳本語言,還可以被編譯成WebAssembly從而在瀏覽器中運行Python代碼。
  • Brython:用JavaScript編寫的在瀏覽器中運行的Python實現[181],具有到DOM元素和事件的接口。
到其他語言的交叉編譯器
  • Cython優化靜態編譯器,將Python超集編譯成C語言或C++。Cython補充支持調用C語言函數並且在變量和類特性上聲明C語言類型,還支持以OpenMP為後端的本機多線程並行[182]
  • Numba:使用LLVMJIT編譯器,將包括很多NumPy函數的聚焦數值計算的Python子集,翻譯成快速的機器碼,它為在CPU和GPU上並行化Python代碼提供了大量選項。
  • mypyc:將Python模塊編譯成C擴展的編譯器[183],它使用標準的Python類型提示生成快速代碼。mypyc是mypy發行的可選依賴,它使用mypy進行類型檢查類型推論[153]
  • Pythran:將聚焦於科學計算的Python子集編譯成C++11提前編譯器英語Ahead-of-time compilation[184],它依賴於Boost和xsimd庫,將標註了接口描述的Python模塊編譯為本機共享庫模塊,能利於上多核SIMD指令單元。
  • Nuitka英語Nuitka:用Python編寫的到C11(或替補為C++03)的優化編譯器[185],它依賴於CPython的libpython庫,能完成嵌入所有模塊的程序編譯、擴展模塊及包編譯和獨立模態程序發布。
  • Transcrypt:用Python編寫的Python 3.9到JavaScript編譯器[186],用於在瀏覽器中運行Python代碼,它被預先編譯為高可讀性且高效的JavaScript代碼。
  • MyHDL英語MyHDL:將Python編譯成VerilogVHDL[187]

其他實現舉例:Jython,它是用Java實現的Python 2.7。IronPython,它是建造在DLR之上的Python 2.7和Python 3.4實現。Stackless Python,它是實現微線程英語microthread的CPython 3.8分叉。Pyston,它是具有JIT等性能優化的CPython 3.8.12的分叉[188]。Pyjion,將Python代碼編譯成本機CIL的CPython 3.10的JIT擴展[189]。Cinder,它是Meta孵化器發布的具有包括JIT等很多優化的CPython 3.10分叉[190]

開發環境

通用文本編輯器

很多並非集成開發環境軟件的文本編輯器,也對Python有不同程度的支持,並且加上專門為Python設計的編輯器插件也會有很高的可用性。

專用開發環境

適用於Python的集成開發環境(IDE)軟件,除了標準二進制發布包所附的IDLE之外,還有許多其他選擇。其中有些軟件設計有語法着色、語法檢查、運行調試、自動補全、智能感知等便利功能。由於Python的跨平台出身,這些軟件往往也具備各種操作系統的版本或一定的移植性。

  • IDLE:Python「標準」IDE,一般隨Python而安裝,支持較少的編輯功能,調試功能也比較弱。
  • Eric:基於PyQt的自由的IDE,支持自動補全、智能感知、自動語法檢查、工程管理、svn/mercurial集成、自動單元測試等功能,具有可擴展的插件系統,通過可選插件支持Git集成。調試功能與Visual Studio和Eclipse類似。
  • Spyder:開源的跨平台科學計算IDE。
  • PyScripter英語PyScripter:功能較全的開源IDE,使用Delphi開發。
  • PyCharm:由JetBrains公司出品,具備一般IDE的功能,比如調試、語法高亮、Project管理、代碼跳轉、智能提示、自動完成、單元測試、版本控制等等,另外,它還提供了一些功能用於Django開發,同時支持Google App Engine,還支持IronPython。它是商業軟件,但也具有社區版和教育版。
  • Thonny英語Thonny:適用於編程初學者的IDE。
  • Wing IDE英語Wing IDE:商業軟件,有免費的功能有限的Wing 101。

第三方擴展包

Thumb
Python Powered

Python社群提供了大量的功能覆蓋眾多領域的第三方模組,其使用方式與標準庫類似。第三方模塊可以使用Python/Cython或者C語言編寫。軟件工具SWIGSIP英語SIP (software),通過定義接口文件或規定文件的方式,可以將C/C++編寫的程序庫包裝為Python模塊。Python解釋器本身也可以被集成到其它需要腳本語言的程式內。

Python包索引是公開的軟件包在線倉庫。pip是官網推薦的以安全方式安裝Python應用及其依賴軟件包的最流行工具[191]。要安裝在整個操作系統範圍內共享的Python包,現在需要通過操作系統的軟件包管理系統。要將特定於應用的依賴包隔離於共享的Python安裝,可以使用標準庫的venv[192]或第三方工具virtualenv[193]創建虛擬環境;第三方工具pipenv,能自動為用戶項目建立和管理虛擬環境,並在安裝/卸裝軟件包的時候,向此項目的Pipfile文件增加/移除這個軟件包[194]

網絡服務

Python定義了WSGI標準應用接口,來協調HTTP伺服器與基於Python的Web程式之間的溝通。比如,通過mod_wsgi英語mod_wsgi模組,Apache可以運行用Python編寫的Web程式。Zope是著名的用Python編寫的開源的Web應用服務器Tornado是用Python語言寫成的非阻塞式web服務器,也是輕量級的Web框架。

Python對於各種網路協定的支援很完善,因此適用於編寫伺服器軟體、網路爬蟲等Web開發。用Python編寫的一些Web框架,有助於輕鬆地開發和管理複雜的Web程式。著名的第三方Web框架和函數庫:

  • Django:MTV架構[195]的Web開發框架,注重組件的重用性和「可插拔性」、快速開發DRY法則
  • Pyramid:極簡主義的Web框架,不預定持久化方式。
  • Flask:微Web框架,不要求特定的工具或庫。
  • PyScript:創建在瀏覽器內的Python應用的框架[196],這些應用能使用HTML界面和已編譯成WebAssembly的Pyodide或MicroPython,以及當代Web技術。
  • Twisted事件驅動的網絡編程框架。它支援多數標準的網路協定(包含客戶端和伺服器),並且提供了多種工具,適用於編寫高性能的伺服器軟體。
  • Requests:適合於常人使用的HTTP庫,封裝了許多繁瑣的HTTP功能,極大地簡化了HTTP請求所需要的代碼量。
  • Beautiful Soup:用來解析HTML/XML的一個簡單易用Python包。
  • uvloop:是對內建asyncio事件循環的快速的、直截了當的替代者[197],它用Cython實現並在底層使用了libuv
  • aiohttp:基於asyncio的HTTP客戶端和服務器二者[198]

圖形用戶界面

Python本身包含了Tkinter庫,它是Python的業界標準GUI並被集成進入了IDLE。Tkinter基於了Tcl命令工具,能夠支持簡單的GUI開發。但是為了讓所開發的軟件運行速度更快,並與用戶的桌面環境更契合,人們一般會選擇採用第三方GUI庫或框架。著名的第三方GUI庫:

  • PyQtQt的Python綁定庫,由Riverbank Computing公司自從1998年發行,採用GPL許可證或商業許可證。
  • PySideQt的Python綁定庫,由Qt公司自從2009年發行,採用LGPL許可證。
  • PyGObject:替代了PyGTK,它是為Python程序訪問基於GObject的庫而提供的包裝庫[199],GObject是GTKGIO英語GIO (software)GStreamer等庫使用的對象系統。
  • Kivy:用於開發多點觸控應用軟件的開源Python庫,採用了自然用戶界面(NUI)。
  • WxPython:GUI編程框架wxWidgets的Python包裝庫,它與MFC的架構相似。
  • PySimpleGUI:將Tkinter、Qt、WxPython和Remi[200]的GUI框架變換成簡單的接口[201]
  • Gooey:將幾乎所有Python 3控制台程序用一行代碼轉變成GUI應用[202]
  • Dear PyGui:快速而強力的具有極小依賴性的GUI工具箱[203]
  • pywebview:輕量級跨平台的對WebView英語WebView構件的包裝器,允許在其本地GUI窗口中顯示HTML內容[204]

數據科學

重要的數據科學用第三方軟件庫有:

數據可視化

主要的數據可視化軟件庫及儀錶板框架有[210]

機器學習

基礎性的機器學習軟件庫及框架有:

其它種類

應用

在很多作業系統裡,Python是標準的系統元件,它被列入Linux標準規範之中[255]。大多數Linux發行版macOS都集成了Python,可以在終端模擬器虛擬控制台英語Virtual console下直接執行Python。第三方工具pipx,可以將Python應用安裝於隔離的環境中並在其中運行它[256]

雖然Python可被粗略地分類為腳本語言,Python的支持者較喜歡稱它為一種高階動態語言,常像「膠水」一樣被用來連接軟件組件,已經顯著的區別於Unix shellWindows PowerShell這樣的語言。基於Python的xonsh,是跨平台的、青睞Unix的shell語言命令行界面[257]

應用程序

一些Linux發行版,使用Python語言編寫安裝器,比如UbuntuUbiquityFedoraAnaconda;或使用它編寫軟件包管理系統,比如GentooPortage。如下著名應用使用Python編寫或將它作為嵌入式腳本:

人工智能

經由Python開發了眾多的人工智能模型和作為其支撐的軟件庫:

社群流行

自從2003年,Python始終排行於TIOBE編程社區索引英語TIOBE Programming Community Index前十最流行編程語言,在2021年10月它首次達到了第一名最流行語言(居於CJava之前)[270],並被選為2007年、2010年、2018年、2020年、2021年和2024年的年度編程語言[270]。它有如下著名的社群:

  • PyCon:各地社群舉辦的會議,通常每年舉辦。各社群在會議中討論Python相關的議題。
  • Python Discord:參與者眾多的Python社區[271]
  • PyLadies英語PyLadies:由女性社群發起的社群,主要注重於發展Python的女性程式設計社群。
  • Django Girls英語Django Girls:使用Django網頁設計框架,推廣使用Python進行網頁設計的技術。

影響的語言

Python的設計和哲學已經影響了很多其他編程語言:

代碼示例

註釋

延伸閱讀

參閲

外部連接

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.