Python
Template:Hatnote Template:NoteTA 腳本錯誤:沒有「Infobox」這個模塊。Template:Template other腳本錯誤:沒有「Check for unknown parameters」這個模塊。
Python(腳本錯誤:沒有「IPA」這個模塊。;腳本錯誤:沒有「IPA」這個模塊。),是一種廣泛使用的解釋型、高級和通用的編程語言。Python支持多種編程范型,包括結構化、過程式、反射式、面向對象和函數式編程。它擁有動態類型系統和垃圾回收功能,能夠自動管理內存使用,並且其本身擁有一個巨大而廣泛的標準庫。它的語言結構以及面向對象的方法,旨在幫助程式設計師為小型的和大型的項目編寫邏輯清晰的代碼。
吉多·范羅蘇姆於1980年代後期開始研發Python,作為ABC語言的後繼者[1],它也可以被視為採用了叫做Template:Le的中綴表示法的一種LISP方言[2]。吉多·范羅蘇姆於1991年首次發佈 Python 0.9.0[3]。Python 2.0於2000 年發佈並引入了新功能。Python 3.0於2008年發佈,它是該語言的主要修訂版,並非完全向後兼容。Python 2於2020年隨2.7.18版停止支持[4]。
Python的設計哲學,強調代碼的可讀性和簡潔的語法,尤其是使用空格縮進來劃分代碼塊。相比於C語言或Java,Python讓開發者能夠用更少的代碼表達想法。
Python解釋器本身幾乎可以在所有的作業系統中運行,它的官方直譯器CPython是用C語言編寫的。Python是一個由社群驅動的自由軟件,目前由Python軟件基金會管理。Python是最受歡迎的編程語言之一[5][6][7][8]。
歷史[編輯]
腳本錯誤:沒有「main」這個模塊。 Template:CSS image crop
Python的創始人吉多·范羅蘇姆,在1982年至1995年間,參與了荷蘭數學和計算機科學研究學會多個項目的工作[9]。1989年的聖誕節期間,他決心開發一個新的腳本解釋程式,作為ABC語言的後繼者,並且用它替代Unix shell和C語言來進行系統管理[1],擔負與Template:Le[10]之間的交互操作並進行例外處理[11]。他是BBC電視劇《Monty Python的飛行馬戲團》的愛好者,所以選取了Python作為這個編程語言的名字[12]。范羅蘇姆作為Python的主要開發者,獨自擔負這個項目的發展決策者職責,直到2018年7月12日,他宣佈從終身仁慈獨裁者(BDFL)的職位上「永久休假」[13][14]。他參與了2019年第一屆領導項目發展的五人掌控委員會[15][16]。
在1991年2月,范羅蘇姆在Usenet新聞組alt.sources上發佈了最初代碼(標記為版本0.9.0)[17],這時就已經存在了帶繼承的類、例外處理、函數和核心類型list、dict、str等。在這個最初發行中就有了從Modula-3引進的模塊系統[18],和例外處理機制[11]。在1994年1月,Python版本1.0發佈[19],其主要新特徵是由Amrit Prem提供的函數式編程工具lambda、map、filter和reduce[20]。受Modula-3啟發,Python 1.1介入了參數缺省值,Python 1.3介入了關鍵字參數。Python 1.4介入了對複數的內建支持[21]。
在2000年10月,Python 2.0發佈,它從函數式編程語言Haskell中引進了列表推導式[22]。Python 2.1支持了靜態嵌套作用域[23]。Python 2.2進行了重大革新,將Python中用C語言寫成的類型,和用Python語言寫成的類,統一成在同一個層級中,使得Python的對象模型成為純粹而一致的對象模型[24];還介入了迭代器[25],受CLU和Icon啟發的生成器[26],和描述器協議[27]。Python 2.3介入了從Dylan引進的方法決定次序[28]。Python 2.4介入了Template:Le類型,和函數修飾器[29]。Python 2.5在官方實現中介入了抽象語法樹[30]。
在2008年12月,Python 3.0發佈,它對語言做了較大修訂而不能完全後向兼容[31],儘管提供了進行自動轉換的2to3實用工具,仍有大量現存代碼不能移植,故而Python 2.7的產品壽命結束延期至2020年元旦。Python 3.4介入了異步I/O模塊[32]。Python 3.5介入了類型提示[33],和採用async/await語法的協程[34]。Python 3.8介入了賦值表達式[35][36]。
在2020年10月,Python 3.9介入了內建的針對容器類的泛化別名(types.GenericAlias)類型[37],並在官方實現中介入了新的語法解析器[38]。Python 3.10介入了從Haskell和OCaml等借鑑來的結構式模式匹配[39],和內建的聯合類型(types.UnionType)[40]。Python 3.11對官方實現進行了優化提速[41]。Python 3.12介入了類型參數語法[42],並廢棄或移除了一些過時的模塊和功能。
在2024年10月,Python 3.13介入了從PyPy引進的新交互式解釋器,並實驗性的支持了即時編譯器[43]。Python 3.14正式支持了自由線程Python的官方實現構建選項[44]。
每個版本首次發行後,享有2年的完全支持,隨後是3年的安全支持。當前只有Python 3的穩定版本3.13與3.14正在被完全支持,但仍提供對3.10、3.11和3.12版本的安全性修正[45]。
在2025年12月,活躍的Python核心開發者,選舉Pablo Galindo Salgado、Savannah Ostrowski、Barry Warsaw、Donghee Na和Thomas Wouters,為2026年度掌控委員會的五位成員來領導這個項目[46]。
特徵與設計哲學[編輯]
Python是多范型編程語言。它完全支持結構化編程和面向對象編程,還有很多特徵支持函數式編程和元編程比如元對象協議(元類和魔術方法[47])。通過擴展還可以支持很多范型,包括面向方面編程[48]、契約式設計[49]和邏輯編程[50]。
Python使用動態類型,在內存管理上採用的垃圾回收器基於了引用計數[51],並且結合了檢測環引用的分代垃圾回收優化[52]。它的特徵還有動態名字解析(Template:Le),即在程序執行期間綁定方法和變量的名字。
Python對遵循LISP傳統的函數式編程提供了有限的支持[53],它提供了 map、filter和reduce函數[54];列表推導式、字典推導式、Template:Le推導式和生成器表達式。標準庫中的模組functools和itertools,實現了從Haskell和Standard ML借鑑來的函數式工具[55]。
Python的設計理念是「優雅」、「明確」、「簡單」,它的一些重要準則被合稱為「Python之禪」。在Python解釋器內運行import this可以獲得完整的列表,下面舉出其中首要:
- 優美優於醜陋。明瞭優於隱晦。
- 簡單優於複雜。複雜優於凌亂。
- 扁平優於嵌套。稀疏優於稠密。
- 可讀性很重要。
Python開發者的方法論是「用一種方法,最好是只有一種方法來做一件事」,顯著不同於以Perl語言為代表的「不止一種方法去做一件事」風格。Python開發者在設計語言時,如果面臨多種選擇,一般會選擇明確沒有或者很少有歧義的語法。
范羅蘇姆將Python本身設計為可擴充的[56],並不把所有的特性和功能都集成到語言核心,而是提供了豐富的API和工具,以便程式設計師能夠輕鬆地使用Python、C語言、Cython來編寫擴充模組。Python還可以通過Template:Le如標準庫中的ctypes等,來提供C語言兼容數據類型,並訪問動態連結庫或共享庫中的函數[57],從而對用其他語言編寫的程式進行集成和封裝。
在Python的官方實現CPython中,一般避開不成熟的或者對非重要部位的加快運行速度的優化。在某些對運行速度要求很高的情況,可以使用具備JIT技術的Python實現或安裝JIT擴展模塊[58]。
語法和語義[編輯]
腳本錯誤:沒有「main」這個模塊。 Python為了讓程式碼具備高度的可閱讀性,在設計時盡量使用了其它語言常用的符號和英文單字。
行結構[編輯]
Python程序在詞法分析上被分成若干邏輯行。簡單語句包含在一個單一的邏輯行之內,Python支持使用分號作為分隔符,將多個簡單語句合併入一個邏輯行之中[59]。
註釋開始於並非Template:Le一部份的一個井號#,並結束於物理行結尾;註釋標示邏輯行的結束,除非已受制於隱式行接續規則;註釋在語法上被忽略[60]。
Python支持使用反斜槓作為行接續符,將多個物理行合成為一個邏輯行[61]。在圓括號、方括號或花括號之中的表達式,可以分裂跨越多於一個物理行而不使用反斜槓,這被稱為「隱式行接續」[61]。
縮排[編輯]
Python語法中的複合語句,包含了一些其他語句,它們以某種方式影響或控制這些其他語句的執行。Python的複合語句包含一個或多個子句(clause),子句構成自一個頭部(header)和一個套件(suite)。特定複合語句的子句頭部都在同樣的縮排層級上,每個子句頭部開始於一個唯一標識關鍵字,並結束於一個冒號。套件即語法意義上的塊,是這個子句所控制的一組語句。
套件有兩種形式:可以是與頭部在同一行上的一個或多個由分號分隔的簡單語句,它們跟隨在這個頭部的冒號之後;或者是遵循越位規則的在連續諸行上的一個或多個縮排的語句,只有這種套件形式可以包含嵌套的複合語句[62]。Template:Efn
根據PEP 8的規定[63],使用4個空格來表示每級縮排。Template:Efn
縮排層級的變遷,被用來生成語法解析器才能見到的INDENT和DEDENT記號[64],增加縮排就生成INDENT記號,減少縮排就生成DEDENT記號。二者的作用相當於C語言家族的花括號,或Pascal語言家族的關鍵字begin和end。
關鍵字[編輯]
Python有如下35個關鍵字;它們不能用作標識符[65]:
|
|
|
|
|
|
|
內建常量True、False和None於Python版本3.0中成為關鍵字,關鍵字nonlocal介入於版本3.0[66],關鍵字async和await介入於版本3.5[67],並在版本3.7中成為正式關鍵字[68]。
在Python中,將只在特定上下文中保留的標識符,稱為「軟關鍵字」[69]:
match、case和通配符_,介入於版本3.10,它們在與模式匹配語句有關的上下文中,可以在語法上充當關鍵字;但是這種區分只在語法解析器層次進行,並非在詞法分析記號化層次。type,介入於版本3.12,它用在type語句之中。
標識符[編輯]
標識符就是名字,在ASCII範圍內(U+0001..U+007F),可用於標識符的字符為:大寫字母A至Z和小寫字母a至z,下劃線_以及數字0至9,但首字不可以用數字。如下命名約定[70],是為「保留標識符類」[71]:
_spam(單下劃線開頭):弱「內部使用」標識。對於from M import *,將不導入所有以下劃線開頭的對象。spam_(單下劃線結尾):為了避免與python關鍵字的命名衝突。__spam(雙下劃線開頭):在命名一個類特性的時候,採用名字修飾,比如在類SpamEggs內,__spam將變成_SpamEggs__spam[72]。__spam__(雙下劃線開頭雙下劃線結尾):指那些包含在用戶控制的命名空間中的「魔術」方法或特性,比如__delattr__、__dir__、__doc__、__getattribute__[73]、__init__、__new__、__repr__、__setattr__、__sizeof__等。建議永遠不要將這樣的命名方式應用於自己的變量或函數。
語句[編輯]
Python的語句包括簡單語句:
- 賦值語句,採用的中綴記號是等號
=。賦值語句被用來將名字綁定(含重新綁定)到值,以及用來修改可變對象的特性或項目。賦值語句支持鏈式賦值。- Python還支持增廣賦值語句[74],將一個二元運算和一個賦值語句合併成一個單一語句,例如
x += 1。 - Python支持「序列解包」[75]:在等號左側可以是一個表達式列表,其中每個表達式都可求值成能被賦值的東西;在等號右側相應的是一個「可迭代」對象,它在被迭代時產生的值的數量,同於左手側可寫表達式的數量;賦值語句對這個對象進行迭代,將產生的每個值分別賦值給左側對應的可賦值者。在等號右側直接包裝出序列解包所要求的元組,就形成了並行賦值。Template:Efn
- Python還支持增廣賦值語句[74],將一個二元運算和一個賦值語句合併成一個單一語句,例如
- Template:Le語句,用來交互式的計算並寫出一個值,或者用來調用一個過程(即返回無含義結果的函數),在Python中過程返回值
None。 global語句,是在整個當前代碼塊中成立的聲明,它意味着隨後列出的標識符被解釋為全局變量。nonlocal語句,導致隨後列出的標識符,提及在除了全局作用域之外的最近包圍作用域中的先前綁定變量。del語句,遞歸的進行刪除。type語句,聲明作為類型別名類型(typing.TypeAliasType)的實例的一個類型別名。pass語句,充當無操作指令,表示此行為空,不執行任何操作。assert語句,用於程式調適階段時測試執行條件是否滿足。continue語句,越過這次迭代並繼續進行下個項目。break語句,從循環中跳出。raise語句,拋出一個例外。return語句,用來從函數返回值。當函數執行到return語句時,它會停止執行並將指定的值返回給調用者。yield語句,用來從一個生成器中返回一個值[76],yield語句在語義上等價於加圓括號的yield表達式[77],在函數主體中使用yield表達式將導致它成為生成器函數。Template:Efn- 通過生成器的
send()方法傳入的信息,就是其中yield表達式的返回值。Template:Efn - 自從版本3.3,介入了
yield from語句,它在語義上等價於加圓括號的yield from表達式,含有此表達式的生成器函數將特定任務委託給另一個子生成器函數,將傳入信息遞送給它並直接回傳它產生的值[78]。 - 自從版本3.6,在協程函數主體中使用
yield表達式將導致它成為異步生成器函數[79]。
- 通過生成器的
import語句,導入一個模塊或包,它組合了兩種操作,查找指名的模塊,接着將找到的結果綁定到在局部作用域中的名字。導入語句有三種形式(下述語句樣本採用了EBNF,這裏的方括號表示其中內容為可選的):
複合語句:
if語句,當條件成立時執行語句套件。它經常包含elif、else子句。while語句,當條件為真時,重複執行語句套件。for語句,遍歷列表、字符串、字典、集合等迭代器,依次處理迭代器中的每個元素。match語句,用於模式匹配。class語句,是定義類的可執行語句。Template:Efndef語句,是定義函數和方法的可執行語句。Template:Efnasync def語句,用於協程函數定義。await表達式、async for語句和async with語句,只能用在協程函數的主體中。Template:EfnTemplate:Le語句,它經常包含except、else、finally子句,處理在程式執行中出現的例外情況。Python 3.11介入了except*子句[82]。Python支持並廣泛使用EAFP(請求原諒比獲得許可更容易)風格的例外處理,作為檢測錯誤狀況和程序中其他「例外」事件的方式。例如:在訪問一個文件或資源之時,事先不進行測試就嘗試使用它,事後再捕獲可能的訪問失敗所引發的例外。Template:Efnwith語句,把一塊代碼包裹在一個上下文管理器之內。它允許了RAII(對象初始化時獲取資源)方式的行為,可替代常見的try/finallyTemplate:Le。Python使用with語句處理資源[83],例如:在執行一塊代碼時,事先獲取一個鎖,並且事後釋放這個鎖;或事先打開一個文件,並且事後關閉這個文件。Template:Efn
塊與模塊[編輯]
在Python的執行模型中,程序構造自塊(也稱為代碼塊)。塊是作為一個單元執行的Python程序文本,模塊、函數主體和類定義都是塊。交互式鍵入的每個命令、腳本文件和腳本命令都是塊。傳遞給內建函數eval()和exec()執行的字符串是塊。塊在執行框架(frame)中執行。框架包含一些用於調試的管理信息,並確定在這個塊執行完成後,執行在何處以及如何繼續。
模塊是包含Python定義和語句的一個文件,這個文件名字是模塊名字附加上後綴.py;在一個模塊中,模塊的名字(作為字符串)可獲得為全局變量__name__的值[81]。包(package)是可以包含子模塊或遞歸性的子包的模塊。包在技術上是具有__path__特性的Python模塊。可以將包視為文件系統上的目錄,而將模塊視為這種目錄中的文件,但是包和模塊不必然源自文件系統[84]。
名字即標識符,是通用的引用持有者,它不關聯於一個固定的數據類型,但是,一個名字在給定時間,總是被綁定到有一個類型的某個對象上,這就是動態類型的特徵。名字的存儲位置不「包含」所指示的值,一個共同的值可以賦值給多個名字,一個名字在任何時候,都可以重新綁定到各種不同類型的對象上,包括字符串、過程、具有數據和方法的複雜對象等。
如果一個名字綁定在一個塊中,它是這個塊的局部變量,除非被聲明為nonlocal或global。如果一個名字綁定在模塊層次,它是全局變量。模塊對應的塊的變量,既是局部的也是全局的。如果一個變量使用在一個塊中,卻不定義在這裏,它是自由變量[85]。Template:Efn
在Python中,賦值所進行的操作,是將一個名字綁定為到一個分立的動態分配的對象的一個引用。Template:Efn 作用域定義一個名字在一個塊中的可見性。如果一個局部變量被定義在一個塊中,它的作用域包括這個塊。如果這個定義出現在一個函數塊中,作用域擴展到在所界定作用域內包含的任何塊,除非所包含的塊為這個名字介入了不同的綁定。對一個塊可見的所有這種作用域的集合,叫做這個這個塊的「環境」[85]。Template:Efn
當一個名字在一個塊之中使用,它採用最近包圍作用域來解析。如果一個名字綁定在一個塊中,並且在其中於綁定之前就被使用,會導致一個錯誤。Template:Efn當一個函數或類的定義被嵌套到其他函數的定義之內,它的非局部作用域就是這個包圍函數的局部作用域。nonlocal語句導致其列出的標識符,提及在非局部作用域內先前綁定的名字(即Template:Le)[85]。Template:Efn
名字空間是存儲變量的地方,它被實現為字典。有局部名字空間、全局空間即包含這個塊對應的模塊的名字空間,和內建名字空間即模塊builtins的名字空間;對象的方法是定義在類主體內的函數,它有着嵌套的名字空間。名字空間通過防止命名衝突而支持了模塊性,還通過明晰了哪個模塊實現了哪個函數而增進可讀性和可維護性。
如果global語句出現在一個塊之中,在這個語句中指定的所有名字,提及在頂層名字空間中這些名字的綁定。名字在頂層名字空間解析,首先查找全局名字空間,未果查找內建名字空間。global語句與在同一個塊中的名字綁定運算有同樣的作用域。如果一個自由變量的最近包圍作用域包含針對它的global語句,這個自由變量被當作全局的[85]。Template:Efn
表達式[編輯]
Python的Template:Le主要包括如下:
- 在Python中,表達式的最基本元素被稱為原子,最簡單的原子是Template:Le或標識符。由逗號
,分隔的一系列表達式,叫做表達式列表。
- 在Python中,加圓括號(parenthesized)形式被歸類為原子,它是包圍在圓括號中的可選的表達式列表。加圓括號的表達式列表產生的東西,就是這個表達式列表所產生的:如果這個列表包含至少一個逗號,例如
(a,b,c),則它產生一個元組;否則它產生的就是這個單一表達式,例如(a)產生a[86]。要表示僅有單個元素的元組,需要給這個元素後綴一個逗號,例如(a,)。空的圓括號產生空元組對象。元組不是圓括號形成的,而是使用逗號形成的,在沒有歧義的情況下,元組的圓括號是可選的。
- Python提供了稱為展示(display)的特殊語法來構造列表、字典或Template:Le,展示被歸類為原子,並且有兩種方式:要麼其所包容的元素是顯式的列舉出來的,要麼它們是通過叫做「推導式」的特定循環和過濾指令運算出來的。列表展示,是包圍在方括號中的可以為空的一系列表達式,例如
[a,b,c]。字典展示,是包圍在花括號中的可能為空的一系列的用冒號:分隔的鍵-值對。Template:Le展示,是包圍在花括號中的一系列表達式[87]。Template:Efn
- Python支持列表推導式和更一般性的生成器表達式[88],Python 3.0增補了字典推導式和集合推導式。Template:Efn自從Python 3.5,介入了在表達式列表中的「可迭代解包」
*,和在字典展示中的「字典解包」**[89]。Template:Efn
- Python對容器類實例,比如序列類型的列表、元組或字符串,支持形如
a[索引]的下標,和形如a[开始:停止]或a[开始:停止:步长]的Template:Le。此二者與函數調用和特性引用,一起被歸類為表示語言中最緊密運算綁定的初等項(primary)。這裏的下標索引是基於零的,負數是相對於結尾的。分片範圍自從開始索引,直到但不包括停止索引,分片的第三個步長參數,允許元素被跳過和用負數指示反向。分片的每個元素都是Template:Le的。分片索引可以省略,例如a[:],這返回整個列表的一個複本。Template:Efn
- 在Python中,算術運算的加法
+、減法-、乘法*,與C語言和java相同的。除法和模除%的行為有所不同,在Python中有兩種除法:除法/和下取整除法//。Python增加了指數算符**。自從Python 3.5,介入了矩陣乘法算符@[90],它已經用於了NumPy庫[91]。中綴算符+、-,還可以分別表示取原數和取相反數的一元算符。
- 在Python中,有如下必須用於整數的位運算:AND(與)
&、OR(或)|、NOT(非)~、XOR(異或)^、右移>>、左移<<。
- 在Python中,有如下比較運算:大於
>、小於<、大於等於>=、小於等於<=、等於==、不等於!=,用來比較兩個對象的值的大小。Python有同一性測試算符:is、is not,用來比較兩個運算元是否引用了同一個對象;還有成員關係測試算符:in、not in,用於判斷一個對象是否屬於另外一個對象。Python允許由比較運算連結起來的布爾表達式[92],比如a < b < c,它測試a < b and b < c;C語言將它解析為(a < b) < c:即首先求值a < b得出結果0或1,接着將此結果比較於c[93]。
- Python的條件表達式表示為
x if c else y。意思是當c為真時,表達式的值為x,否則表達式的值為y。 在運算元的次序上不同於很多其他語言中常見的c ? x : y。
- Python的
lambda表達式是匿名函數,其函數體只能是一個表達式。Template:Efn
- 自從Python 3.8,介入了賦值表達式,其記號是
:=[35]。它將一個表達式賦值給一個標識符,同時還返回這個表達式的值。Template:Efn
Python中運算符具有優先級,下表中的運算符按照從最高(最先綁定)到最低(最後綁定)的次序列出。在相同單元格中運算符具有相同的優先級,它們從左至右結合,除了指數表達式和條件表達式從右至左結合之外[94]:
| 運算符 | 描述 |
|---|---|
(表达式 …),[表达式 …],{键: 值 …},{表达式 …} |
綁定或加圓括號表達式,列表展示,字典展示,集合展示 |
x[索引],x[索引:索引],x(参数 …),x.特性 |
下標,分片,調用,特性引用 |
await x |
await表達式
|
** |
指數 |
+x,-x,~x |
取原數,相反數,逐位NOT |
*,@,/,//,% |
乘法,矩陣乘法,除法,下取整除法,餘數 |
+,- |
加法和減法 |
<<,>> |
移位 |
& |
逐位AND |
^ |
逐位XOR |
| |
逐位OR |
in,not in,is,is not,<,<=,>,>=,!=,== |
包含成員關係測試,同一測試,各種比較 |
not x |
布爾NOT |
and |
布爾AND |
or |
布爾OR |
… if … else … |
條件表達式 |
lambda |
lambda表達式
|
:= |
賦值表達式 |
Python為序列提供了串接算符+和倍增算符*[95]。自從Python 3.9,介入了字典歸併算符|和字典更新算符|=[96]。
Python為Template:Le提供了集合論運算:併集|、交集&、相對補集-、對稱差^,和子集測試<=、真子集測試<、超集測試>=、真超集測試>。
在Python中,語句不能成為表達式的一部份,表達式比如列表推導式和字典推導式以及lambda表達式,都不能包含語句。這個限制的一個示例:賦值語句比如a = 1,不能用作條件語句的條件判斷表達式的一部份;這能夠避免C語言編程中的一個常見錯誤,即在條件判斷時把等於算符==誤寫為賦值算符=,這不是預期代碼卻在語法上有效而能通過C語言編譯器檢查,在Python中這會導致一個語法錯誤。
數值運算[編輯]
Python的二元算術運算,先將兩運算元轉為共同類型,加法、減法、乘法、下取整除法、模除和指數運算的結果也採用此類型,舉下取整除法//例子:5//2 == 2而5.0//2 == 2.0。自從Python 3.0,除法/總是產生浮點數結果,例如5/2 == 2.5。
下取整除法//的修約是朝向負無窮的,這意味着等式Template:Code永遠成立;很多其它編程語言比如C99採用截尾取整規則,其整數除法不能保證這個等式永遠成立。Python提供了round()內建函數,用於把一個浮點數修約成最近的整數[97],自從Python 3.0,為了打破平局它採用了IEEE 754的約半成偶規則,例如round(1.5) == 2 == round(2.5)。
模除%同樣採用下取整規則,它所得餘數的符號同於除數,例如-5%2 == 1而5%-2 == -1。很多其它語言採用截尾取整規則,其模除所得餘數的符號同於被除數。Python模除運算結果餘數的定義,確使等式Template:Code對於a和n分別為正數或負數的情況均為成立[98];數學中的歐幾里得除法,同樣保證這個等式永遠成立,但它的餘數總是非負數。
Python對所有整數運算,使用任意精度算術。在decimal模塊中的Decimal類[99],提供Template:Le,具有用戶可按需要而更改的缺省28個十進制有效數位精度,並有多種修約方式[100]。在fractions模塊中的Fraction類,提供任意精度的有理數[101]。第三方庫gmpy2[102],提供了到任意精度計算庫GMP/Template:Le、Template:Le和MPC的接口。
除了求絕對值函數abs()列入內建函數之外,大多數數學函數,處於math和cmath模塊內。前者用於實數運算,而後者用於複數運算。Python有着廣泛的數學庫,特別是第三方庫NumPy進一步擴展了固有能力。
字符串操作[編輯]
Python的文本序列類型,包括字符串str和字節序列bytes與bytearray。文本序列的文字有多種寫法:
- 短Template:Le,由單引號
'或雙引號"界定。不同於Unix shell、Perl和受Perl影響的語言,單引號和雙引號功能相同。這二種字符串都使用反斜槓\作為轉義字符。
- 字節Template:Le總是前綴上一個
b或B,它產生bytes類型的實例。它們只可以包含ASCII字符,其數值大於等於128的字節必須通過轉義來表達。
- 字符串文字或字節文字都可選的能前綴上一個
r或R,這叫做Template:Le。轉義序列不被解釋,因此在文字反斜槓常見的地方很有用,比如正則表達式和Windows風格的路徑。
- Python允許多個毗鄰的字符串文字或字節文字(它們以空白分界並可以使用不同的引述約定),在編譯時間於語法層面上串接起來。要在運行時間串接字符串,必須使用序列串接算符
+[103]。
自從Python 3.0,字符串類str提供了Template:Le方法format()[104],例如"spam={0} eggs={1:04d}".format("blah", 2),它求值為'spam=blah eggs=0002'。格式化方法被推薦用來替代早先的字符串對象內建格式化算符%,它在功能上類同於C語言中的printf格式化字符串[105],例如"spam=%s eggs=%04d" % ("blah", 2)。
自從Python 3.6,介入了Template:Le[106],即「格式化字符串文字」或稱為「f字符串」,它向字符串文字前綴上f或F[107],例如x="blah"; y=2; f'spam={x} eggs={y:04d}'。
類型[編輯]
Python使用鴨子類型,並擁有有類型的對象,和無類型的變量名字。在編譯期不檢查類型約束,而寧願在一個對象上的操作出現可能的失敗,表現出這個給定對象不具有適合的類型。儘管是動態類型系統,Python卻是強類型的,禁止沒有明確定義的操作,比如將一個數和一個字符串相加,而不是默默的去嘗試轉換使其有意義。
Python有着範圍廣泛的基本數據類型。同時具備常規的整數和浮點算術,它透明的支持任意精度算術、複數和Template:Le。Python支持種類繁多的字符串操作。在Python中,字符串是不可變的,所以在其他編程語言中可能就地改變字符串的字符串操作,比如字符替換,在Python中返回新的字符串。
Python有一個非常有用特徵,就是搜集(或稱容器)類型的概念。一般的說,搜集是以一種易於引用或索引的方式,包含其他對象的對象。Python的搜集類型包括了序列、映射和集合,Python提供了廣泛的搜集操縱能力,比如內建包含檢查和通用迭代器協議。
列表(動態數組)、元組和字符串是序列類型。所有序列類型都有位置索引,並且除了字符串,都可以包含任意類型的對象,在同一個序列中可以包括多種類型的對象。字符串和元組是不可變的,使得它們成為字典的鍵的完美候選者。列表是可變的,元素可以被插入、刪除、修改、添加或就地排序。
字典是無次序的映射類型,它將一組不可變的鍵,映射到相應的元素上。在字典中的鍵,必須是不可變的Python類型,比如整數或字符串,因為在底層它們是通過散列函數實現的。Template:Le是無次序的類型,它包含唯一性的不可變對象作為元素。有二種類型的集合:可變的set和不可變的frozenset。
Python允許編程者使用類,定義自己的類型[24]。類的新實例,是通過調用這個類的構造器而創建的,而類型和類都是元類type的實例,元類type更是其自身的實例,這允許了元編程和反射。Python支持對類型和類的廣泛內省,它們可以被讀取和比較。Template:Efn
長期規劃是支持Template:Le[109],並且自從Python 3.5,語言的語法允許指定靜態類型,但在缺省實現CPython中不檢查它們[110]。靜態類型檢查器mypy,支持編譯期類型檢查[111]。
| 類型 | 可變性 | 描述 | 語法例子 |
|---|---|---|---|
bool
|
不可變 | 布爾值,有表示值False和True的兩個對象。作為整數類型的子類型,除了在轉換成字符串時轉換為"False"和"True"之外,它們在幾乎所有上下文中表現得如同0和1。
|
Template:Code Template:Code |
int
|
不可變 | 整數,其大小在理論上無限制,實際上受限於內存[112]。 | Template:Code |
float
|
不可變 | 雙精度浮點數,確切精度依賴於機器。一般實現為IEEE 754標準binary64浮點數,它有53個二進制有效數位精度[113]。 | Template:Code |
complex
|
不可變 | 複數,即分別表示實部與虛部的兩個雙精度浮點數的有序對。 | Template:Code |
range
|
不可變 | 數的序列,通常用在for循環中指定循環次數[114]。
|
Template:Code Template:Code |
str
|
不可變 | 字符串,即Unicode代碼點序列[115]。其代碼點都在區間[\u0000, \uffff]或[\U00010000, \U0010ffff]之內。
|
Template:Code"""Spanning
multiple lines"""
|
bytes
|
不可變 | 字節序列,其項目是8位字節,可以用區間[0x00, 0xff]的整數表示。
|
Template:Code Template:Code |
bytearray
|
可變 | Template:Code Template:Code | |
list
|
可變 | 列表,可以包含任意的Python對象。 | Template:Code Template:Code |
tuple
|
不可變 | 元組,可以包含任意的Python對象。 | Template:Code Template:Code |
dict
|
可變 | 字典是鍵-值對的搜集。鍵在其生存期間是不可變的(稱其為可散列的),列表、字典或其它可變對象和包含它們的對象不可以用作鍵。 | Template:Code Template:Code |
set
|
可變 | 無序的Template:Le,包含唯一性的不可變的對象,它們不能用任何下標來索引。 | Template:Code Template:Code |
frozenset
|
不可變 | Template:Code | |
types.EllipsisType
|
不可變 | 這個類型的值是有一個單一對象,它表示為Template:Le...或內建名字Ellipsis,它的真值為真。它用於NumPy多維陣列索引[116]。
|
Template:Code Template:Code |
types.NoneType
|
不可變 | 這個類型的值是一個單一對象None(相當於其他語言的Null)[117],它被用來指示值的缺席,它的真值為假。
|
Template:Code |
types.NotImplementedType
|
不可變 | 這個類型的值是一個單一對象NotImplemented,數值方法和豐富比較方法如果沒有實現在所提供運算元上的這個運算則應當返回這個值,它不應該在布爾值上下文中求值。
|
Template:Code |
除了各種數據類型,Python解釋器還內建了很多其他類型,包括可調用類型:用戶定義函數、實例方法、生成器函數、協程函數、異步生成器函數、內建函數、內建方法、類、類方法;模塊,定製類,類實例,I/O對象(也叫做文件對象),和暴露給用戶的一些內部類型:代碼對象、框架對象、溯回對象、切片對象、靜態方法對象、類方法對象。
函數[編輯]
Python的函數支持閉包[118]和其他頭等函數特徵Template:Efn,並支持限制最大深度的遞歸Template:Efn, 它不支持函數重載即不能創建具有相同名字而有不同實現的多個函數,但其標準庫可支持單一分派泛化函數[119]。Python的函數作為頭等對象,具有和普通對象平等的地位。Python官方實現不提供尾調用優化或頭等續體,吉多·范羅蘇姆曾聲稱他不會對其加以支持[120],有第三方庫支持Template:Le[121]。
在Python中,函數調用的實際參數與函數定義的形式參數之間的結合,所傳遞的是「對象引用」,函數在被調用之時,所給予的實際參數被介入到一個局部符號表中,實際參數使用傳值調用來傳遞,而這個值總是對象引用,並非這個對象的值[122]。如果形式參數綁定到一個可變對象,則通過形式參數對此對象內容的修改,在函數外也是可見的。如果形式參數綁定到一個不可變對象,則通過形式參數不能修改此對象內容,但可以把形式參數重新綁定到其它對象上,這並不影響函數外的對象的值。Template:Efn
Python在函數定義時,可以在形式參數序列中,以形式参数=值的樣式指定形式參數缺省值。在函數調用時可以省略有缺省值的形式參數,這時這個缺省值就被代入到它的位置中。在這個函數定義被執行之時,從左至右的求值作為形式參數的缺省值的這些表達式。這意味着這種表達式在這個函數被定義之後只被求值一次,而每次函數調用之時都使用相同的「預先計算」的值。Template:Efn
Python在函數調用中,可以給予位置實際參數和關鍵字實際參數。實際參數可以如同C語言那樣,按照位置與函數定義的形式參數匹配;也可以採用關鍵字實際參數,即形式参数=值樣式的實際參數。Python在函數定義中,可以使用不對應實際參數的特殊形式參數/和*,將形式參數序列分為三部份:唯位置形式參數、可位置可關鍵字形式參數和唯關鍵字形式參數。如果一個形式參數有缺省值,則在其後直到*之前的所有形式參數也都必須有缺省值。Template:Efn
在函數定義中的位置形式參數序列和關鍵字形式參數序列,可以分別在其末尾有*args或**kwargs這樣的加了前綴*或**的形式參數,它們捕獲在函數調用時提供的,超出形式參數序列規定而無所對應的多個實際參數;在形式參數args前加*號,則args是元組類型,它捕獲可變數目的位置實際參數;在形式參數kwargs前加**號,則kwargs是字典類型,它捕獲可變數目的關鍵字實際參數。Template:Efn
在函數調用的實際參數序列中,關鍵字實際參數必須出現在位置實際參數之後。如果要傳遞給一個函數的一些位置實際參數,已經在一個序列類型如列表或元組的對象中,則可以在函數調用中給它前綴*來進行可迭代解包;如果要傳遞的一些關鍵字實際參數已經在字典對象中,則可以給它加**號來進行字典解包。
在函數定義頭部之後可以插入「文檔字符串」,用作函數的使用幫助,它可以使用內置函數help()打印出來。自從Python 3.0,函數定義可以對形式參數與返回值增加類型標註[123]。自從Python 3.5,開始支持類型提示[110]。
Python的修飾器(decorator)可用來修改任何可調用Python對象,其用法是將已定義的對象比如函數、方法或類定義傳遞給修飾器,再將它所返回的修改後的對象綁定到原來對象的名字。修飾器可用於元編程,其用途至少包括:建立類方法或靜態方法,設置先決條件和後置條件、實現多方法、記憶化[124]。
Python使用@作為關鍵字形成修飾符,它是用來應用修飾器的語法糖。Template:Efn
通過在毗連的行上放置多個修飾符,多個修飾器可以連結起來應用。Template:Efn
對象及其方法[編輯]
Python支持大多數面向對象編程技術。在Python中所有東西都是對象,包括數、函數、類和模塊。它允許多態性,不限定於在Template:Le之內子類型方式,而是採用了鴨子類型方式[125],就是說針對變量的方法調用和特性(attribute)訪問,不事先限制這個的變量的類型,它可被綁定到任何對象。Python的類繼承支持多重繼承,這可以用來實現混入。Python支持元類[126],還支持抽象基類[127],自從Python 3.6,提供了定製化類創建的簡單機制[128]。
對象的方法,是附屬於這個對象的類的函數。對於正常的方法和函數,語法实例.方法(实际参数),是类.方法(实例, 实际参数)的語法糖。Python不提供其他一些面向對象編程語言比如C++和Java中的隱式的Template:Le關鍵字[129],Python的對象方法沿襲自Modula-3,使用顯式的第一個形式參數來訪問實例特性,習慣上將其命名為Template:Le。Template:Efn
Python支持一些名字以__開始和結束的特殊方法,它們用於實現實現多種特殊功能[47],尤其是實例初始化,在一個類中定義__init__(),它在實例創建後返回給調用者之前被調用,所給予的實際參數就是傳遞給對象構造器表達式的那些實際參數。某些特殊方法可以實現運算符重載,比如在一個類中定義__add__(),將允許在這個類的實例上使用+算符。
在Python中,對象的特殊特性__dict__,是存儲其所有(可寫)特性的字典[130]。在一個類中的類變量__slots__,可以被賦值為變量名字序列,它為所聲明的這些變量在類實例對象中保留空間,並阻止其自動建立__dict__[131]。Template:Efn
在Python中,定義了一個或多個特殊方法__get__()、__set__()、__delete__()的類,可以用作描述器(descriptor)[132]。在類的定義中,如果一個成員若是另一個描述器類的實例,則它被稱為這個類的屬性(property),使用與特性(attribute)訪問相同的語法,訪問這個類的實例對象中的屬性。Template:Efn
在Python中,不強制採用訪問子與變異子方法,來訪問對象的數據成員。Python使用名字修飾,有限的支持私有變量[72]。Python的property內建函數和@property修飾符,將一個類中特殊定義的訪問某個特性的那些方法,包裝成的這個類的一個屬性[133]。Template:Efn
Python允許通過使用@classmethod和@staticmethod修飾符,來分別建立類方法和靜態方法[29]。在方法調用之時,類方法接收這個類的作為其隱式的第一個實際參數,而靜態方法不接收隱式的第一個實際參數。Template:Efn
Python不提供隱式的super關鍵字而是提供了super()內建函數,在一個類的方法中調用此函數返回一個代理(proxy)對象,它為了在類層級內這個類所有基類中查找實現了特定方法的基類,確定了優先次序即方法決定次序(MRO),次序居前的基類優先於位居其後的它的父輩類或平輩類[134]。當一個子類的方法覆蓋了其超類方法的時候,可通過調用super().方法,將這個方法調用委託給與子類的self.方法同名的超類方法。Template:Efn
標準庫[編輯]
Python擁有一個強大的標準庫[135]。Python標準庫包括了如下功能: Template:Div col
- 內建函數
- 內建常量
- 內建類型
- 內建例外
- Python運行時服務
- 定製Python解釋器
- 導入模塊
- Python語言服務
- Template:Le服務
- Template:Le服務
- 數據類型
- 數值和數學模塊
- 函數式編程模塊
- 文件和目錄訪問
- 數據持久化
- 數據壓縮和存檔
- 文件格式
- 加密服務
- 通用作業系統服務
- MS Windows專有服務
- Unix專有服務
- 命令行界面庫
- 並發執行
- 網絡和進程間通信
- 互聯網數據處理
- Template:Le標記處理工具
- 互聯網協議及其支持
- 多媒體服務
- 國際化
- 程序框架
- Tk圖形用戶界面
- 開發工具
- 調試和分析
- 軟件打包和Template:Le
程序代碼實例[編輯]
一個在標準輸出設備上輸出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.x版本中,print是一個關鍵字而可以不加圓括號。
實現[編輯]
Python是一門跨平台的腳本語言,Python規定了一個Python語法規則,根據該規則可編寫Python直譯器[136]。Python屬於動態語言,其官方實現CPython將Python程序編譯成中間形式的字節碼[137],並接着在它的虛擬機上執行[138],運行速度緩慢於C/C++所編譯出的機器碼和在HotSpot JVM上運行的java字節碼[139]。
- 活躍開發的實現
- CPython:官方的Python直譯器,需要區別於其他直譯器的時候才以CPython稱呼。CPython默認採用全局解釋器鎖(GIL),以確保在任何時刻只有一個線程執行Python字節碼;一些擴展模塊被設計為在進行計算密集任務時釋放GIL,還有在進行I/O時總是釋放GIL[140]。
- MicroPython:為微控制器而優化的Python 3變體,它實現了完整的Python 3.4語法,和補充自版本3.5的
async/await關鍵字,以及後來版本的一些選定特徵;它提供了實現Python標準庫模塊功能子集的內建模塊,和特定於微控制器的一些模塊。Template:Le是Template:Le開發的MicroPython分叉。 - PyPy:採用了Template:Le的Python實現,缺省支持stackless模態[141],它是用RPython編寫的,當前支持Python版本3.11和2.7。
- Numba:使用LLVM JIT的Python優化編譯器,它將包括很多NumPy函數的聚焦數值計算的Python子集,轉譯成快速的機器碼,它為在CPU和GPU上並行化Python代碼提供了大量選項。
- Codon:高性能且無運行時開銷的Python編譯器[142],它將Python代碼編譯成本機機器代碼,並且支持本機多線程和GPU並行運算,還包括了特徵齊全的完全編譯的內建NumPy實現。它由MIT CSAIL的研究人員開發[143],其語義在數據類型等方面上與CPython有所不同[144]。
- Pyodide:基於WebAssembly/Emscripten的用於瀏覽器和Node.js的Python發佈[145],支持任何在PyPI上
wheel形式的純Python包,並且已經移植了很多具有C語言擴展的包。 - RustPython:用Rust編寫的Python解釋器[146],它可以嵌入到Rust應用程式中從而將Python用作腳本語言,還可以被編譯成WebAssembly從而在瀏覽器中運行Python代碼。
- Brython:用JavaScript編寫的在瀏覽器中運行的Python實現[147],具有到DOM元素和事件的接口。
- GraalPy:針對JVM的基於Template:Le的Python高性能實現[148]。
- 轉譯成其他語言的編譯器
- Cython:將增加了靜態類型聲明的Python超集編譯成C或C++的編譯器。Cython補充支持調用C語言函數並且在變量和類特性上聲明C語言類型,還支持以OpenMP為後端的本機多線程並行[149]。
- mypyc:將Python模塊編譯成C擴展的編譯器[150],它使用標準的Python類型提示生成快速代碼。mypyc是mypy發行的可選依賴,它使用mypy進行類型檢查和類型推論[111]。
- Template:Le:用Python編寫的到C11(或替補為C++03)的編譯器[151],它將Python模塊轉譯成使用CPython的
libpython共享庫和自己的靜態C文件的C層級程序,接着將其編譯成本機機器代碼。 - Template:Le:將純粹但隱含為靜態類型的Python有限子集代碼轉譯成優化的C++代碼的編譯器[152],它可以生成獨立程序或者能導入其他Python程序的擴展模塊。
- Pythran:將聚焦於科學計算的Python子集編譯成C++11的Template:Le[153],它依賴於Boost和xsimd庫,將標註了接口描述的Python模塊編譯為本機共享庫模塊,能利用上多核和SIMD指令單元。
- Transcrypt:用Python編寫的Python 3.9到JavaScript編譯器[154],用於在瀏覽器中運行Python代碼,它被預先編譯為高可讀性且高效的JavaScript代碼。
- Template:Le:將Python編譯成Verilog或VHDL[155]。
其他實現舉例:Cinder,它是Meta孵化器發佈的面向性能的CPython分叉[156]。Jython,它是用Java實現的Python 2.7。IronPython,它基於DLR之上的Python 2.7和Python 3.4實現。Stackless Python,它是實現Template:Le的CPython 3.8分叉。Pyston,它是具有JIT等性能優化的CPython 3.8.12的分叉[157]。Pyjion,將Python代碼編譯成本機CIL的CPython 3.10的JIT擴展[158]。Grumpy,它是Python 2.7到Go的轉譯器和運行時系統[159]。py2many,將Python轉譯成多種語言如C++17、Rust、Go和Julia等的轉譯器[160]。
開發環境[編輯]
通用文本編輯器[編輯]
很多並非集成開發環境軟件的文本編輯器,也對Python有不同程度的支持,並且加上專門為Python設計的編輯器插件也會有很高的可用性。 Template:Div col
專用開發環境[編輯]
適用於Python的集成開發環境(IDE)軟件,除了標準二進制發佈包所附的IDLE之外,還有許多其他選擇。其中有些軟件設計有語法着色、語法檢查、運行調試、自動補全、智能感知等便利功能。由於Python的跨平台出身,這些軟件往往也具備各種作業系統的版本或一定的移植性。 Template:Div col
- IDLE:Python「標準」IDE,一般隨Python而安裝,支持較少的編輯功能,調試功能也比較弱。
- Eric:基於PyQt的自由的IDE,支持自動補全、智能感知、自動語法檢查、工程管理、svn/mercurial集成、自動單元測試等功能,具有可擴展的插件系統,通過可選插件支持Git集成。調試功能與Visual Studio和Eclipse類似。
- Spyder:開源的跨平台科學計算IDE。
- PyCharm:由JetBrains公司出品,具備一般IDE的功能,比如調試、語法高亮、Project管理、代碼跳轉、智能提示、自動完成、單元測試、版本控制等等,另外,它還提供了一些功能用於Django開發,還支持IronPython。它是商業軟件,但也具有社區版和教育版。
第三方擴展包[編輯]
腳本錯誤:沒有「main」這個模塊。 Python社群提供了大量的功能覆蓋眾多領域的第三方模組,其使用方式與標準庫類似。第三方模塊可以使用Python/Cython或者C語言編寫。軟件工具比如SWIG,通過定義接口文件或規定文件的方式,可以將C/C++編寫的程序庫包裝為Python模塊。Python解釋器本身也可以被集成到其它需要腳本語言的程式內。
Python包索引是公開的軟件包在線倉庫。pip是官網推薦的以安全方式安裝Python應用及其依賴軟件包的最流行工具[161]。要安裝在整個作業系統範圍內共享的Python包,現在需要通過作業系統的軟件包管理系統。為了將特定於應用的依賴包隔離於共享的Python安裝,需要創建虛擬環境,這可以使用標準庫的venv[162],或第三方工具比如virtualenv[163]和pipenv[164]。
網絡編程[編輯]
Python標準庫對於各種網絡協定的支援很完善,因此適用於編寫伺服器軟件、網絡爬蟲等Web開發。Python定義了WSGI標準應用接口,來協調HTTP伺服器與基於Python的Web程式之間的溝通。比如,通過Template:Link-en模組,Apache HTTP Server可以運行用Python編寫的Web程式。
用Python編寫的一些Web框架,有助於輕鬆地開發和管理複雜的Web程式。重要的第三方Template:Le庫和Web框架有: Template:Div col
- Zope:著名的開源Web應用伺服器。
- Beautiful Soup:用作HTML/XML解析器的一個簡單易用Python包。
- Twisted:事件驅動的網絡編程框架,它支持很多常見的網絡協議並包括了很多不同用途的模塊,它支持所有主要的系統事件循環和各種GUI事件循環。
- Django:MTV架構[165]的Web框架,它注重組件的重用性和「可插拔性」、快速開發和DRY法則。
- Tornado:使用單線程事件循環的異步非阻塞式web伺服器,也是輕量級的Web框架。
- Flask:微Web框架,不要求特定的工具或庫。
- Requests:適合於常人使用的HTTP庫,封裝了許多繁瑣的HTTP功能,極大地簡化了HTTP請求所需要的代碼量。
- aiohttp:基於
asyncio的HTTP客戶端和伺服器二者[166]。 - uvloop:對內建
asyncio事件循環的快速的、直截了當的替代者[167],它用Cython實現並在底層使用了libuv。 - Template:Le:用於實現基於HTTP的網絡服務API的現代高性能web框架[168]。
- PyScript:創建在瀏覽器內的Python應用的框架[169],可採用Pyodide、MicroPython、WebAssembly和當代Web技術。
圖形用戶界面[編輯]
Python本身包含了Tkinter庫,它是Python的業界標準GUI並被集成進入了IDLE。Tkinter基於了Tcl命令工具,能夠支持簡單的GUI開發。但是為了讓所開發的軟件運行速度更快,並與用戶的桌面環境更契合,人們一般會選擇採用第三方GUI庫或框架。主要的第三方GUI庫有: Template:Div col
- PyQt:Qt的Python綁定庫,由Riverbank Computing公司自從1998年發行,採用GPL許可證或商業許可證。
- PySide:Qt的Python綁定庫,由Qt公司自從2009年發行,採用LGPL許可證。
- PyGObject:替代了PyGTK,它是為Python程序訪問基於GObject的庫而提供的包裝庫[170],GObject是GTK、Template:Le和GStreamer等庫使用的對象系統。
- Kivy:用於開發多點觸控應用軟件的開源Python庫,採用了自然用戶界面(NUI)。
- WxPython:GUI編程框架wxWidgets的Python包裝庫。
- Gooey:將幾乎所有Python 3控制台程序用一行代碼轉變成GUI應用[171]。
- Dear PyGui:快速而強力的具有極小依賴性的GUI工具箱[172]。
- pywebview:輕量級跨平台的對Template:Le構件的包裝器,允許在其本地GUI窗口中顯示HTML內容[173]。
數據科學[編輯]
重要的數據科學用第三方軟件庫有: Template:Div col
- NumPy:Python的基礎性的科學計算軟件庫,它提供了強力的多維陣列對象,廣播式陣列運算[174],集成C/C++和Fortran代碼的工具,較為有用的線性代數、傅里葉變換和隨機數功能。
- SciPy:用於數學、科學和工程的Python軟件庫,它以NumPy的多維陣列作為基本數據結構,所包含的模塊針對了:統計、最優化、數值積分、常微分方程求解、插值、線性代數、傅里葉變換、信號處理、圖像處理等。
- Template:Le:NumPy/SciPy兼容的GPU加速的陣列庫[175],它可在NVIDIA CUDA或AMD ROCm平台上充當其直截了當的替代者,來運行現存的NumPy/SciPy代碼。
- matplotlib:基於NumPy的綜合性Template:Le庫,用於創建靜態的、動畫的和交互式的數據可視化。
- pandas:用於數據分析和數據操縱的軟件庫,它在NumPy基礎上,提供了加標籤數據結構「數據幀」[176],和統計函數等。它的缺省繪圖後端是matplotlib,還可以擴展上第三方Template:Le後端[177]。
- Template:Le:伸縮範圍從筆記本電腦至計算機集群的並行計算庫[178],它提供的用戶接口鏡像了PyData生態系統中pandas、scikit-learn和NumPy的API。
數據可視化[編輯]
主要的數據可視化軟件庫及儀錶板框架有[179]: Template:Div col
- VisPy:高性能交互式2D/3D數據可視化庫[180],它通過OpenGL庫利用GPU的計算能力來顯示非常大的數據集。
- Datoviz:通過Vulkan庫利用GPU的用於數據可視化的高性能渲染庫[181]。
- seaborn:基於matplotlib的數據可視化庫[182],它提供了繪製統計圖形的高層接口。
- Vega-Altair:基於Vega-Lite JSON規定設計的聲明式統計可視化庫[183]。
- Bokeh:針對現代Web瀏覽器的交互式數據可視化庫[184],它在大型或Template:Le的數據集上提供高效的交互性。
- plotly:交互式開源的基於瀏覽器的圖形繪製庫[185],它是基於plotly.js實現的聲明式圖表庫。
- Dash:數據應用和儀錶板框架,它可將現代用戶界面元素如下拉選單、Template:Le和圖形,直接連結至分析型Python代碼[186],它由Template:Le公司出品,基於了React、Flask和plotly.js[187]。
- Panel:Template:Le和Web應用框架,它能無縫的集成於PyData生態系統,提供交互式數據表格和可視化等功能[188],它可用在Pyodide和PyScript之中[189]。Panel是HoloViz生態系統的成員[190],這個工具組還包括了:hvPlot、HoloViews、GeoViews、Datashader、Lumen、Param和Colorcet。
- Streamlit:迅速將Python腳本轉變為Web應用的框架[191],所生成的應用可共享於Streamlit社區雲平台。
- Voilà:將Jupyter Notebook轉變為獨立的Web應用的框架[192]。
機器學習[編輯]
基礎性的機器學習軟件庫及框架有: Template:Div col
- scikit-learn:機器學習軟件庫,它提供的功能包括:監督學習中的分類和回歸,無監督學習中的聚類和降維,還有模型選擇和Template:Le。它基於了NumPy、SciPy、輕量級管道庫Joblib[193]和線程池控制庫threadpoolctl[194],其繪圖功能依賴於matplotlib,還用到了Template:Le、seaborn和plotly。
- PyMC:基於從Theano分叉出的PyTensor的概率編程庫,它用於建立貝葉斯統計模型,並使用馬爾可夫鏈蒙特卡洛(MCMC)方法進行模型擬合。
- TensorFlow:Google開發的「端到端」開源機器學習平台,它提供了Python API[195],其中實現了Keras API[196]。Keras現在是在TensorFlow 2上建立的深度學習高層API。
- PyTorch:Meta在Template:Tsl基礎上開發的開源的Python軟件包,提供了具有強大的GPU加速的張量計算,和建立在基於tape的自動微分系統上的深度神經網絡。
- JAX:Google開發的開源機器學習框架,其核心是可任意組合的對數值純函數的變換[197],它結合了修改版本的針對NumPy的自動微分庫Autograd[198],和TensorFlow中的加速線性代數庫XLA[199],它使用XLA來在GPU和TPU上編譯和運行NumPy程序。
其它種類[編輯]
- Pegen:Python的PEG文法解析器的生成器[200]。
- PeachPy:採用高層Python的可移植高效x86-64匯編代碼的生成器[201]。
- llvmlite:輕量級的LLVM的Python綁定,用於編寫即時編譯器[202]。
- xDSL:圍繞靜態單賦值(SSA)中間表示(IR)構建的Python原生的編輯器框架[203],它的設計受到了Template:Le的影響。
- SymPy:支持數學符號運算的軟件庫,用於提供計算機代數系統。
- SimPy:基於由Python生成器函數定義的進程的離散事件模擬框架[204]。
- ModernGL:不同於PyOpenGL[205],ModernGL是在OpenGL 3.3+核心上的Python包裝器[206],它簡化了簡單圖形應用如科學模擬、遊戲和用戶界面的創建。
- PyCUDA:不同於Nvidia的cuda-python[207],PyCUDA提供對CUDA API的Python風格訪問[208]。
- PyOpenCL:PyOpenCL提供對OpenCL API的Python風格訪問[209],例如光滑粒子流體動力學框架PySPH的性能關鍵部份用Cython和PyOpenCL實現[210]。
- Kompute:基於Vulkan的通用計算框架[211],它是高速的、支持流動裝置、異步的並且針對高級GPU數據處理用例做了優化。
- SQLAlchemy:Python的SQL工具包和採用數據映射器模式的對象關係映射器(ORM)。
- Graphene:GraphQL框架[212],支持各種數據源如SQLAlchemy、Mongo、Django和定製Python對象等。GQL是常用來與之配合的GraphQL客戶端Python庫[213]。
- Template:Le:基於Python的圖像處理軟件庫[214],它支持廣泛的圖形文件格式,分叉於已終止的PIL。
- Fabric:經由SSH遠程執行shell命令的高層庫[215],它產生有用的Python對象作為回饋。
- Prefect:現代工作流程編排框架[216],它易於搭建、調度和監控健壯的數據流水線。
- pygame:開發視頻遊戲的Python軟件庫,基於了SDL軟件庫[217]。如視覺小說引擎Ren'Py就基於pygame。
- pyglet:Python編寫的面向對象的遊戲和多媒體庫,利用了FFmpeg軟件庫並需要OpenGL 3.3+。2D街機遊戲開發庫Arcade基於了pyglet[218],它還利用了基於2D物理引擎Template:Le構建的Pymunk[219]。
- Template:Le:開源遊戲引擎,包括了圖形、音頻、I/O、碰撞偵測和其他與3D遊戲有關的功能,使用Python作為遊戲開發語言[220]。
- pythonnet:可以近乎無縫的集成.NET通用語言運行庫(CLR)的程序包[221]。
- PyInstaller:將Python應用和它的依賴項捆綁成一個單一的包[222],從而不需要安裝Python解釋器或任何模塊就可以運行應用。
應用[編輯]
在很多作業系統裏,Python是標準的系統元件,它被列入了ISO/IEC 23360-1-4:2021 Linux標準規範(LSB)之語言規定[223]。大多數Linux發行版和macOS都集成了Python,可以在終端模擬器或Template:Le下直接執行Python。第三方工具pipx,可以將Python應用安裝於隔離的環境中並在其中運行它[224]。
雖然Python可被粗略地分類為腳本語言,Python的支持者較喜歡稱它為一種高階動態語言,常像「膠水」一樣被用來連接軟件組件,已經顯著的區別於Unix shell、Windows PowerShell這樣的語言。基於Python的xonsh,是跨平台的、青睞Unix的shell語言和命令行界面[225]。
應用程式[編輯]
一些Linux發行版,使用Python語言編寫安裝器,比如Ubuntu的Ubiquity和Fedora的Anaconda;或使用它編寫軟件包管理系統,比如Gentoo的Portage。下面舉例使用Python編寫或將它作為嵌入式腳本的一些應用程式: Template:Div col
- IPython:以多種編程語言進行交互式計算的命令shell和Jupyter的內核,最初為Python開發,它提供了內省、富媒體、shell語法、Template:Le和歷史。
- Conda:跨平台的、語言無關的二進制包管理器,它被Python的Anaconda發行版採用。
- Template:Le:基於scikit-learn和pandas的開源機器學習和數據可視化軟件,利用了PyQt5和基於Blink的PyQtWebEngine,通過廣大多樣的工具箱來搭建數據分析工作流程[226],由盧布爾雅那大學開發。
- SageMath:涵蓋許多數學功能的應用軟件,基於NumPy、SciPy、matplotlib、SymPy、Maxima、Template:Le、FLINT、R等開源軟件包進行實現。
- Template:Le:基於VTK的應用程式和庫,用於交互式科學數據可視化和採用Python的3D繪圖[227]。
- Pitivi:用Python開發的基於GStreamer的視頻編輯軟件。
- Blender:開源3D繪圖軟件,使用Python作為建模工具與GUI語言。
- Inkscape:開源的SVG矢量圖形編輯器,使用Python用於插件。
人工智能[編輯]
經由Python開發了眾多的人工智能模型和作為其支撐的軟件庫: Template:Div col
- Ray:對人工智能及Python應用的運行規模進行伸縮的統一框架[228],由Anyscale公司開發。它構成自一個核心的分佈式運行時系統,和加速機器學習工作負載的AI軟件庫。
- Kornia:基於PyTorch的可微分計算機視覺軟件庫[229]。
- Template:Le:用Python和Cython開發的工業級實力的自然語言處理軟件庫[230]。
- OpenNMT:神經機器翻譯和神經Template:Le的開源生態系統[231]。
- Template:En-link:開源的Template:En-link的程序,它允許用戶從一系列的文本提示生成圖像。ComfyUI使用自由的擴散模型比如Stable Diffusion作為其圖像功能的基礎模型,還合併了其它工具比如ControlNet和LCM低秩適應,這裏每個工具都表示為程序中的一個節點。
- Transformers:為下載和訓練前沿的預訓練模型提供API和工具[232],由Hugging Face開發,支持在PyTorch、TensorFlow和JAX之間的框架互操作性。
- Gradio:它是一個Python庫,允許快速創建和分享用於機器學習模型、API或任何任意Python函數的Web應用程式。使用Gradio,可以構建交互式用戶界面,與各種機器學習框架兼容。還可以使用Gradio以交互方式調試模型、從用戶獲取反饋,並通過自動生成的可共享連結輕鬆部署模型。[233][234]
- LangChain:它是一個應用框架,旨在簡化使用大型語言模型的應用程式。作為一個語言模型集成框架,LangChain的用例包括文檔分析和總結摘要, 代碼分析和聊天機械人。[235] LangChain提供了一個標準接口,用於將不同的語言模型(LLM)連接在一起,以及與其他工具和數據源的集成。
社群流行[編輯]
自從2003年,Python始終排行於Template:Le前十最流行編程語言,在2021年10月它首次達到了第一名最流行語言(居於C和Java之前),並被選為2007年、2010年、2018年、2020年、2021年和2024年的年度編程語言[7]。它有如下著名的社群: Template:Div col
- PyCon:各地社群舉辦的會議,通常每年舉辦。各社群在會議中討論Python相關的議題。
- Python Discord:參與者眾多的Python社區[236]。
- Template:Link-en:由女性社群發起的社群,主要注重於發展Python的女性程式設計社群。
- Template:Le:使用Django網頁設計框架,推廣使用Python進行網頁設計的技術。
影響的語言[編輯]
Python的設計和哲學已經影響了很多其他編程語言,例如: Template:Div col
- ECMAScript/JavaScript:從Python借鑑了迭代器和生成器。
- Genie:基於Vala編譯器的具有近似Python語法的語言。
- Go:其設計原則受到了Python的可讀性與易用性的啟發[237],享有相同風格的數組分片語法。
- Groovy:受到Python等動態類型語言的影響[238]。
- Julia:在表達高級數值計算的方式和支持通用編程上借鑑了Python等語言[239]。
- Kotlin:融合了Python和Java特徵,極小化了Template:Le而增加了開發效率[240]。
- Nim:使用縮進和類似的語法[241]。
- Ruby:主要從Python等語言中借鑑了特徵[242]。
- Swift:有受Python啟發的語法[243]。
Template:Div col end 此外還有:Boo[244]、Template:Le[245]、CoffeeScript[246]、GDScript[247]、Template:Le[248]和Template:Le[249]等等。
在Python基礎上開發的編程語言有: Template:Div col
- Taichi Lang:採用同Python幾乎一樣語法的指令式並行編程語言[250],源出自MIT CSAIL實驗室,它嵌入在Python之中並使用即時編譯器框架如LLVM,將計算密集的Python代碼轉變成本機GPU或CPU指令。
- Coconut:在Python語法之上增加了用於函數式編程的新特徵的Python變體[251]。
- Snek:受Python啟發的微小的可嵌入式語言,其目標處理器僅有數以kB計的閃存和靜態內存[252]。
- Pycopy:Template:Le的[253]、輕量級且可擴展的MicroPython兼容語言實現[254]。
- Mojo:基於Template:Le並設計為Python超集的語言[255]。
- Hy:嵌入到Python中的Lisp方言,它將Lisp代碼變換成Python抽象語法樹對象,從而以Lisp形式操控全部Python庫。
示例與註釋[編輯]
引用[編輯]
- ↑ 1.0 1.1 Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ 7.0 7.1 Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ 11.0 11.1 Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite news
- ↑ Template:Cite news
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
Template:Cite web - ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ 24.0 24.1 Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ 引用錯誤:無效的
<ref>標籤,未定義名稱為mro的參考文獻內容文字。 - ↑ 29.0 29.1 Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ 35.0 35.1 Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
Template:Cite web - ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
Template:Cite web - ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ 47.0 47.1 Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
Template:Cite web - ↑ Template:Cite web
- ↑ 61.0 61.1 Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ 72.0 72.1 Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ 80.0 80.1 Template:Cite web
- ↑ 81.0 81.1 Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ 85.0 85.1 85.2 85.3 Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ 腳本錯誤:沒有「citation/CS1」這個模塊。
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
Template:Cite web - ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ 110.0 110.1 Template:Cite web
- ↑ 111.0 111.1 Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
Template:Cite web - ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
Template:Cite web - ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
Template:Cite web - ↑ Template:Cite web Template:Cite web Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
Template:Cite web
Template:Cite web - ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite-web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Python library for easily interacting with trained machine learning models https://pypi.org/project/gradio/ Template:Wayback
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite book
- ↑ 引用錯誤:無效的
<ref>標籤,未定義名稱為lattner2014的參考文獻內容文字。 - ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ 引用錯誤:無效的
<ref>標籤,未定義名稱為edemaine的參考文獻內容文字。 - ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ 引用錯誤:無效的
<ref>標籤,未定義名稱為vpeople的參考文獻內容文字。 - ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ 引用錯誤:無效的
<ref>標籤,未定義名稱為Mojo的參考文獻內容文字。
延伸閱讀[編輯]
參閲[編輯]
腳本錯誤:沒有「Portal」這個模塊。 Template:Div col
外部連接[編輯]
腳本錯誤:沒有「Sister project links」這個模塊。Template:Main other Template:Div col
- Template:Official website
- Awesome Python Template:Wayback
- Real Python Tutorials Template:Wayback
- programingz - Learn Python Programming Template:Wayback
- w3schools - Python Tutorial Template:Wayback
- ItsMyCode- Learn Python Programming Template:Wayback
- Codecary - Learn Python Programming Template:Wayback
- dainikchorcha - Learn Python ProgrammingTemplate:Wayback
- Tutlane - Learn Python Online Template:Wayback
- Brmgha - Learn & Challenges Python Online Template:Wayback
- AlmaBetter- Python Tutorial Template:Wayback
Template:Python 腳本錯誤:沒有「Navbox」這個模塊。 Template:Python web frameworks Template:SciPy ecosystem Template:Differentiable computing Template:Package management systems Template:FOSS