Python

您所在的位置:网站首页 python大于等于 Python

Python

#Python| 来源: 网络整理| 查看: 265

  关于与「Python」標題相近或相同的条目,請見「Python (消歧義)」。 Python编程范型多范型:过程式、结构化、模块化、反射式、面向对象、函数式設計者吉多·范罗苏姆實作者Python软件基金会发行时间1991年,​32年前​(1991)[1]目前版本3.11.2 (2023年2月8日;穩定版本)[2]3.12.0a6 (2023年3月7日;預覽版本)[3][4] 型態系統鸭子类型、动态、强类型[5]、渐进(英语:gradual typing)(自从3.5)[6]操作系统跨平臺:Windows、Linux/Unix、macOS等許可證Python软件基金会许可证文件扩展名.py、.pyi、.pyc、.pyd、.pyo(3.5之前)[7]、.pyw、.pyz(自从3.5)[8]網站www.python.org 主要實作產品CPython、PyPy、Stackless Python、MicroPython、CircuitPython(英语:CircuitPython)、Pyston[9]、RustPython[10]、IronPython、Jython衍生副語言Cython、RPython、Starlark(英语:Bazel (software))[11]啟發語言ABC[12]、ALGOL 68[13]、APL[14]、C[15]、C++[16]、CLU[17]、Dylan[18]、Haskell[19]、Icon[20]、Java[21]、Lisp[22]、Modula-3[16]、Perl[23]、Standard ML[14]影響語言Boo、Cobra(英语:Cobra (programming language))、CoffeeScript[24]、D、F#、Genie[25]、Go、Groovy、JavaScript[26][27]、Julia[28]、Nim、Ruby[29]、Swift[30] 維基教科書中有關zh:Python的文本

Python(英國發音:/ˈpaɪθən/;美國發音:/ˈpaɪθɑːn/),是一种广泛使用的解释型、高级和通用的编程语言。Python支持多种编程范型,包括结构化、过程式、反射式、面向对象和函数式编程。它拥有动态类型系统和垃圾回收功能,能够自动管理内存使用,并且其本身拥有一个巨大而广泛的标准库。它的语言结构以及面向对象的方法,旨在帮助程序员为小型的和大型的项目编写逻辑清晰的代码。

吉多·范罗苏姆于1980年代后期开始研发Python,作为ABC语言的后继者[20],它也可以被视为采用了叫做M-表达式(英语:M-expression)的中缀表示法的一种LISP方言[31]。吉多·范罗苏姆于1991年首次发布 Python 0.9.0[32]。Python 2.0于2000 年发布并引入了新功能。Python 3.0于2008年发布,它是该语言的主要修订版,并非完全向后兼容。Python 2于2020年随2.7.18版停止支持[33]。

Python的设计哲学,强调代码的可读性和简洁的语法,尤其是使用空格缩进来划分代码块。相比於C语言或Java,Python让开发者能够用更少的代码表达想法。

Python解释器本身几乎可以在所有的操作系统中运行,它的官方直譯器CPython是用C语言编写的。Python是一個由社群驱动的自由软件,目前由Python软件基金会管理。Python是最受欢迎的编程语言之一[34][35][36][37]。

目录 1 歷史 2 特徵與設計哲學 3 語法和语义 3.1 縮排 3.2 关键字 3.3 标识符 3.4 語句 3.5 表达式 3.6 函数 3.7 对象及其方法 3.8 类型 3.9 数学 4 标准库 5 程序代码实例 6 实现 7 开发环境 7.1 通用文本编辑器 7.2 专用开发环境 8 應用 8.1 網絡服务 8.2 图形用户界面 8.3 数据科学 8.4 其它种类的库 8.5 应用软件 8.6 社群流行 9 影響的语言 10 代码示例 11 註釋 12 延伸閱讀 13 参閲 14 外部連接 歷史[编辑] 主条目:Python的歷史 Python創始人吉多·范羅蘇姆在2006年O'Reilly开源大会(英语:O'Reilly Open Source Convention)(OSCON)的照片

Python的創始人吉多·范羅蘇姆,在1982年至1995年间,参与了荷兰数学和计算机科学研究学会多个项目的工作[38]。1989年的聖誕節期間,他決心開發一個新的腳本解釋程式,作為ABC語言的繼承者,并且用它替代Unix shell和C语言来进行系统管理[20],担负与Amoeba操作系统(英语:Amoeba (operating system))[39]之间的交互操作并进行异常处理[12]。他是BBC電視劇《Monty Python的飛行馬戲團》的爱好者,所以选取了Python作为这个编程语言的名字[40]。范羅蘇姆作为Python的主要開發者,独自担负这个项目的发展决策者职责,直到2018年7月12日,他宣布从終身仁慈獨裁者(BDFL)的职位上“永久休假”[41][42]。他在2019年1月至11月参与了第一届五人掌控委员会继续领导项目发展[43][44]。

在1991年2月,范羅蘇姆在alt.sources上发布了最初代码(标记为版本0.9.0)[1],这时就已经存在了带继承的类、异常处理、函数和核心类型list、dict、str等。在这个最初发行中就有了从Modula-3引进的模块系统[45],和异常处理机制[12]。在1994年1月,Python达到了版本1.0[46],其主要新特征是由Amrit Prem提供的函数式编程工具lambda、map、filter和reduce[47]。受Modula-3启发,Python 1.1介入了缺省参数值,Python 1.3介入了关键字参数(英语:Named parameter)。Python 1.4介入了对复数的内建支持,还包含了采取名字修饰的一种基本形式的数据隐藏(英语:Information hiding)[48]。

在2000年10月,Python 2.0發布,它介入了列表推导式,这是从函数式编程语言Haskell中引进的;它支持了Unicode,还向垃圾回收系统增加了环检测算法[49]。Python 2.1支持了静态嵌套作用域[50]。Python 2.2进行了重大革新,将Python的类型(用C语言写成)和类(用Python写成)统一入一个层级,使得Python的对象模型成为纯粹而一致的对象模型[51];还介入了迭代器[52],受CLU和Icon启发的生成器[53],和描述器协议[54]。Python 2.3介入了从Dylan引进的方法解析次序[18]。Python 2.4介入了集合(英语:Set (abstract data type))类型,和函数修饰器[55]。Python 2.5介入了with语句[56],并在官方实现中介入了抽象语法树[57]。

在2008年12月,Python 3.0發布,它对语言做了较大修订而不能完全后向兼容[58]。Python 3发行包括了2to3实用工具,它(至少部份的)自动将Python 2代码转换成Python 3代码[59]。Python 3.4介入了异步I/O模块[60]。Python 3.5介入了类型提示[61],和采用async/await语法的协程[62]。Python 3.8介入了赋值表达式[63][64]。Python 3.9介入了内建的泛化别名类型[65],并在官方实现中介入了新的语法解析器[66]。Python 3.10介入了结构式模式匹配[67],和内建的联合类型[68]。Python 3.11对官方实现进行了优化提速[69]。

Python 2.7的产品寿命结束日期最初设定为2015年,由于大量现存代码不能移植到Python 3,而延期支持至2020年[70]。随着Python 2的产品寿命结束,2022年3月14日发布的macOS 12.3已经彻底移除了Python 2[71]。当前只有Python 3的稳定版本3.10、3.11和预览版本3.12正在被完全支持,但仍提供对3.7、3.8和3.9版本的安全性修正[72]。

在2022年12月,活跃的Python核心开发者,选举Pablo Galindo Salgado、Gregory P. Smith、Emily Morehouse、Brett Cannon和Thomas Wouters,为2023年度“掌控委员会”的五位成员来领导这个项目[73]。

特徵與設計哲學[编辑]

Python是多范型编程语言。它完全支持结构化编程和面向对象编程,还有很多特征支持函数式编程和元编程比如元对象协议(元类和魔术方法[74])。通过扩展还可以支持很多范型,包括面向切面编程[75]、契约式设计[76]和逻辑编程[77]。

Python使用动态类型,在内存管理上采用引用计数和环检测相结合的垃圾回收器[78]。它的特征还有动态名字解析(后期绑定(英语:late binding)),即在程序执行期间绑定方法和变量的名字。

Python對遵循LISP傳統的函数式编程提供了有限的支持[79],它提供了 map、filter和reduce函数[80];列表推导式、字典、集合(英语:Set (abstract data type))和生成器表达式。標準庫中的模組functools和itertools,实现了从Haskell和Standard ML借鉴来的函數式工具[81]。

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

优美优于丑陋。明瞭优于隐晦。 简单优于复杂。复杂优于凌乱。 扁平优于嵌套。稀疏优于稠密。 可读性很重要。

Python開發者的方法论是“用一種方法,最好是只有一種方法來做一件事”,显著不同于以Perl语言为代表的“不止一种方法去做一件事”風格。Python開發者在設計語言時,如果面臨多種選擇,一般會選擇明確没有或者很少有歧義的語法。

范羅蘇姆认为ABC語言非常優美和强大,它没有取得成功的原因是不開放造成的[82],故而将Python本身設計為可擴充的[83]。Python並不把所有的特性和功能都集成到語言核心,而是提供了豐富的API和工具,以便程式設計師能够輕鬆地使用Python、C语言、Cython來編寫擴充模組。Python还可以通过外界函数接口(英语:Foreign function interface)如标准库中的ctypes等,来访问动态链接库或共享库中C语言兼容数据类型,并调用其中的函数[84],从而对用其他語言編寫的程式進行集成和封裝。

Python開發人員盡量避開不成熟或者不重要的優化。一些針對非重要部位的加快運行速度的補丁,通常不會被合併到Python的官方实现CPython中。在某些對運行速度要求很高的情況,可以使用JIT技术的Python实现或扩展[85]。

語法和语义[编辑] 主条目:Python語法及語義

Python為了讓程式碼具備高度的可閱讀性,在設計時盡量使用了其它語言常用的符號和英文單字。Python支持使用反斜杠作为行接续符,将多个物理行合成为一个逻辑行[86]。在圆括号、方括号或花括号之中的表达式,可以分裂跨越多于一个物理行而不使用反斜杠,这被称为“隐式行接续”[87]。注释开始于并非字符串文字(英语:string literal)一部份的一个井号#,并结束于物理行结尾;注释标示逻辑行的结束,除非已受制于隐式行接续规则;注释在语法上被忽略[88]。简单语句包含在一个单一的逻辑行之内,Python支持使用分号作为分隔符,将多个简单语句合并入语法意义上的一行之中[89]。

Python语法中的复合语句,包含(成组的)其他语句;它们以某种方式影响或控制这些其他语句的执行。Python的复合语句包含一个或多个子句(clause),子句构成自一个头部(header)和一个套件(suite)。特定复合语句的子句头部都在同样的缩排层级上,每个子句头部开始于一个唯一标识关键字,并结束于一个冒号。套件是这个子句所控制的一组语句,套件有两种形式,可以是与头部在同一行上的一个或多个由分号分隔的简单语句,它们跟随在这个头部的冒号之后;或者是在后续诸行上的一个或多个缩排的语句,只有这种套件形式可以包含嵌套的复合语句[90]。

縮排[编辑]

Python語言遵循越位規則,利用縮排来形成语句套件,即语法意义上的块。连续诸行的缩排层级,被用来生成语法解析器才能见到的INDENT和DEDENT记号[91],二者的作用相当于C语言家族的花括号,或Pascal语言家族的关键字begin和end。增加縮排就生成INDENT记号,減少縮排就生成DEDENT记号。根據PEP 8的規定[92],使用4個空格來表示每級縮排。[a]

tab字符(从左至右)被替代为1至8个空格,使得直到tab之前的诸字符加上这些替代空格的字符总数,是8的倍数(这意图同于Unix所用规则)。前导于第一个非空白字符的空格的总数,确定了这一行的缩排层级。缩排所用诸字符,不能使用反斜杠来拆分成多个物理行;直到第一个反斜杠之前的空白确定缩排层级。如果源代码文件混合了tab和空格,并且在这种方式下缩排的意义依赖于一个tab相当于多少个空格,则这种缩排因不一致性而被报错并拒绝[93]。

关键字[编辑]

Python有如下35个关键字;它们不能用作标识符[94]:

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

内建常量True、False和None于Python 3.0中成为关键字,关键字nonlocal介入于Python 3.0[95],关键字async和await介入于Python 3.5[96],并在Python 3.7中成为正式关键字[97]。

标识符match、case和通配符_介入于Python 3.10,它们在与模式匹配语句有关的上下文中,可以在语法上充当关键字;但是这种区分只在语法解析器层次进行,并非在词法分析记号化层次。在Python中,只在特定上下文中保留的这种标识符,叫做“软关键字”[98]。

标识符[编辑]

标识符就是名字,在ASCII范围内(U+0001..U+007F),可用于标识符的字符为:大写字母A至Z和小写字母a至z,下划线_以及数字0至9,但首字不可以用数字。如下命名约定[99],是为“保留标识符类”[100]:

_spam(单下划线开头):弱“内部使用”标识。对于from M import *,将不导入所有以下划线开头的对象。 spam_(单下划线结尾):为了避免与python关键字的命名冲突。 __spam(双下划线开头):在命名一个类特性的时候,采用名字修饰,比如在类SpamEggs内,__spam将变成_SpamEggs__spam[101]。 __spam__(双下划线开头双下划线结尾):指那些包含在用户控制的命名空间中的“魔术”方法或特性,比如__delattr__、__dir__、__doc__、__getattribute__、__init__、__new__、__repr__、__setattr__、__sizeof__等。建议永远不要将这样的命名方式应用于自己的变量或函数。

在Python文献中经常使用的元语法变量(英语:metasyntactic variable)是spam和eggs(英语:Spam (Monty Python))而非传统的foo和bar[101]。

語句[编辑]

Python的语句包括简单语句:

赋值语句,记号为等号=。赋值语句被用来将名字绑定(含重新绑定)到值,以及用来修改可变对象的特性或项目。Python支持“序列解包”(sequence unpacking)特征:在等号左侧是一个表达式列表,其中每个表示式都可求值成能被赋值的东西(变量、可写特性等);在等号右侧是一个“可迭代”对象,它在被迭代时产生的值的数量,同于左手侧可写表达式的数量;赋值语句对这个对象进行迭代,将产生的每个值分别赋值给左侧对应的可赋值者[102]。在等号右侧直接包装出序列解包所要求的元组,就形成了并行赋值,可以同时给多个变量赋值,还可以交换两个变量的值。[b]Python还支持增广赋值,将一个二元运算和一个赋值语句合并成一个单一语句,例如x += 1[103]。 表达式(英语:Expression (computer science))语句,用来交互式的计算并写出一个值,或者用来调用一个过程(即返回无含义结果的函数),在Python中过程返回值None。 global语句,是在整个当前代码块中成立的声明,它意味着随后列出的标识符被解释为全局变量。 nonlocal语句,导致随后列出的标识符,提及在除了全局作用域之外的最近包围作用域中的先前绑定变量。 pass語句,充当NOP,表示此行為空,不執行任何操作。 assert語句,用於程式調適階段時測試執行條件是否滿足。 continue语句,越过这次迭代并继续进行下个项目。 break语句,从循环中跳出。 return语句,用来从函数返回值。 raise语句,抛出一个异常。 yield语句,使用它从一个生成器中返回一个值。在版本2.5之前,信息只能单向的从生成器传递出来。[c]自此版本2.5,重定义yield为表达式[104],通过它的返回值将信息传递进入生成器函数中[105],从而能够支持协程功能[105]。[d]自从版本3.3,提供了yield from语句,含有这个语句的“委托生成器”将其部份运算委托给另一个“子生成器”,将传入信息递送给它并直接回传它产生的值[106]。yield语句在语义上等价于加圆括号的yield表达式[107]。版本3.4在异步I/O框架中扩展了基于生成器的协程[108],这个扩展自从Python 3.8已经被弃用[109]。版本3.6介入了异步生成器[110]。 import语句,导入一个模块或包,它组合了两种操作,查找指名的模块,接着将找到的结果绑定到在局部作用域中的名字。导入语句有三种形式:import 模块名字 [as 别名],找到一个模块,装载它,如果有需要的话初始化它;在这个导入语句出现的作用域的局部名字空间中,定义一个名字或一些名字[111]。from 模块名字 import 定义1 [as 别名1], 定义2 [as 别名2], ...,找到、装载、必需时初始化一个模块;接着在局部名字空间中,增加到找到指名特性的引用[111]。(这二个语句示例中的方括号表示其中内容为可选的。)from 模块名字 import *,在导入语句出现的作用域的局部名字空间中,绑定模块中定义的所有公开的名字[112]。 del语句,递归的进行删除。

复合语句:

if語句,當條件成立時執行語句套件。它經常包含elif、else子句。 while語句,當條件為真時,重複執行語句套件。 for語句,遍历列表、字符串、字典、集合等迭代器,依次處理迭代器中的每個元素。 match语句,用于模式匹配。 try(英语:Exception handling syntax)語句,它经常包含except、else、finally子句,處理在程式執行中出现的異常情況。Python支持并广泛使用异常处理,作为检测错误状况和程序中其他“异常”事件的方式,并提倡在可能出现错误状况的任何时候都使用异常。习惯上访问一个文件或资源不在使用之前进行测试,而是先行尝试使用它,再捕获访问被拒绝引发的异常。[e] with語句,把一块代码包裹在一个上下文管理器之内。它允许了资源获取即初始化(RAII)式行为,可替代常见的try/finally惯用法。Python使用with语句处理资源[113],在进入一个作用域的时候调用一个函数,而在离开它的时候调用另一个函数,例如:在一块代码执行之前获取一个锁,并且在此后释放这个锁;或事先打开一个文件,并且事后关闭它。[f] class語句,是定义类的可执行语句。类的继承列表给出基础类列表,没有继承列表的类,缺省继承基础类object。类的套件接着在新的执行框架(frame)中执行,它使用新建的局部名字空间和原来的全局名字空间。当这个类套件完成执行之时,丢弃它的执行框架并保存它的局部名字空间。一个类对象接着被创建,其基础类采用继承列表,其特性字典采用保存的局部名字空间。类名字接着在原来的局部名字空间中,被绑定到这个类对象。 def語句,是定義函數和方法的可执行语句。它的执行在当前局部名字空间中,将函数名字绑定到一个函数对象(对函数的可执行代码的包装器)。这个函数对象包含到当前全局名字空间的引用,作为调用这个函数时使用的全局名字空间。 async def语句,用于协程函数定义。await表达式、async for语句和async with语句,只能用在协程函数的主体中。[g]

模块是包含Python定义和语句的一个文件,这个文件名字是模块名字附加上后缀.py;在一个模块中,模块的名字(作为字符串)可获得为全局变量__name__的值[112]。内建globals()函数,返回实现当前模块名字空间的字典[114]。内建dir()函数,在无参数时,返回在当前局部作用域内的名字列表;在有一个参数时,尝试返回这个对象的有效特性的列表[115]。包(package)是可以包含子模块或递归的子包的模块。包在技术上是具有__path__特性的Python模块。可以将包视为文件系统上的目录,而将模块视为这种目录中的文件,但是包和模块不必然源自文件系统[116]。

Python程序构造自代码块。代码块是作为一个单元执行的Python程序文本。模块、函数主体和类定义都是块。交互式键入的每个命令都是块。脚本文件和脚本命令是代码块。__main__是顶层代码运行所在的环境。“顶层代码”是启动运行的首个用户指定Python模块。从命令行使用-m参数,作为顶层脚本运行的模块(作为模块__main__)也是代码块。此时__name__变量被设置为"__main__",在这个模块中可籍此增加直接运行时候执行的代码[112][117]。传递给内建函数eval()和exec()执行的字符串是代码块。

在Python中赋值所进行的操作,是将一个名字绑定为到一个分立的动态分配的对象的一个引用。名字是通用的引用持有者,它不关联于一个固定的数据类型,但是,一个名字在给定时间,总是被绑定到有一个类型的某个对象上,这就是动态类型的特征。名字的存储位置不“包含”所指示的值,一个共同的值可以赋值给多个名字,一个名字在任何时候,都可以重新绑定到各种不同类型的对象上,包括字符串、过程、具有数据和方法的复杂对象等。

除了在块中出现的每个赋值语句或导入语句之外,下列构造也绑定名字:给函数的形式参数、类定义、函数定义、赋值表达式、在for语句头部中和各种as关键字之后的标识符目标(target),as关键字出现在import语句、with语句、except子句、except*子句和结构式模式匹配的as模式之中。如果一个名字绑定在一个块中,它是这个块的局部变量,除非被声明为nonlocal或global。如果一个名字绑定在模块层次,它是全局变量;模块代码块的变量,既是局部的也是全局的。如果一个变量使用在一个代码块中,却不定义在这里,它是自由变量[118]。

作用域定义一个名字在一个块中的可见性。如果一个局部变量被定义在一个块中,它的作用域包括这个块。如果这个定义出现在一个函数块中,作用域扩展到在所界定作用域内包含的任何块,除非所包含的块为这个名字介入了不同的绑定。当一个名字在一个代码块之中使用,它采用最近包围作用域来解析。对一个代码块可见的所有这种作用域的集合,叫做这个这个块的“环境”[118]。如果一个名字绑定在一个块中,并且在其中于绑定之前就被使用,会导致一个错误。[h]

如果global语句出现在一个块之中,在这个语句中指定的所有名字,提及在顶层名字空间中这些名字的绑定。名字在顶层名字空间解析,首先查找全局名字空间,即包含这个代码块的模块的名字空间;未果查找内建名字空间,即模块builtins的名字空间。global语句与在同一个块中的名字绑定运算有同样的作用域。如果一个自由变量的最近包围作用域包含它的一个global语句,这个自由变量被当作全局的[118]。[i] nonlocal语句导致相应的名字,提及在最近包围函数作用域内的先前绑定变量(即非局部变量(英语:Non-local variable))[118]。[j]

表达式[编辑]

Python中很多表达式(英语:Expression (computer science))与C语言和java类似,而另一些则与之不同。

在Python中,算术运算的加法+、减法-、乘法*和取模%是与C语言和java相同的,但是除法的行为不同。在Python中有两种除法,它们是下取整除法(或整数除法)//和浮点除法/。Python增加了指数算符**。自从Python 3.5,介入了矩阵乘法算符@[119],它已经用于了NumPy库[120]。 在Python中,有如下必须用于整数的位运算:&与(AND),|或(OR),~非(NOT),^异或(XOR),>>右移,


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3