Python

✍ dations ◷ 2024-12-23 05:03:20 #Python,脚本语言,面向对象的编程语言,面向文本编程语言,基于类的编程语言,LAMP,荷兰发明

Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/)是一种广泛使用的解释型、高级编程、通用型编程语言,由吉多·范罗苏姆创造,第一版发布于1991年。Python是ABC语言的后继者,也可以视之为一种使用传统中缀表达式(英语:M-expression)的LISP方言。Python的设计哲学强调代码的可读性和简洁的语法(尤其是使用空格缩进划分代码块,而非使用大括号或者关键词)。相比于C++或Java,Python让开发者能够用更少的代码表达想法。不管是小型还是大型程序,该语言都试图让程序的结构清晰明了。

与Scheme、Ruby、Perl、Tcl等动态类型编程语言一样,Python拥有动态类型系统和垃圾回收功能,能够自动管理内存使用,并且支持多种编程范式,包括面向对象、命令式、函数式和过程式编程。其本身拥有一个巨大而广泛的标准库。

Python 解释器本身几乎可以在所有的操作系统中运行。Python的其中一个解释器CPython是用C语言编写的、是一个由社群驱动的自由软件,目前由Python软件基金会管理。

Python的创始人为吉多·范罗苏姆,当时他在阿姆斯特丹的CWI工作。1989年的圣诞节期间,吉多·范罗苏姆为了在打发时间,决心开发一个新的脚本解释编程,作为ABC语言的一种继承,担负同Amoeba操作系统(英语:Amoeba (operating system))的交互和异常处理。之所以选中Python作为编程的名字,是因为他是BBC电视剧——蒙提·派森的飞行马戏团的爱好者。Python是为了替代使用Unix shell和C语言进行系统管理而从ABC语言发展起来,而它的模块系统主要受到了Modula-3的影响,它还结合了C语言的最少争议特征。就范罗苏姆本人看来,ABC这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,究其原因,他认为是非开放造成的。范罗苏姆决心在Python中避免这一错误,并获取了非常好的效果。

目前范罗苏姆仍然是Python的主要开发者,决定整个Python语言的发展方向。Python社群经常称呼他是终身仁慈独裁者(BDFL)。

Python 2.0于2000年10月16日发布,增加了实现完整的垃圾回收,并且支持Unicode。同时,整个开发过程更加透明,社群对开发进度的影响逐渐扩大。

Python 3.0于2008年12月3日发布,此版不完全兼容之前的Python源代码。不过,很多新特性后来也被移植到旧的Python 2.6/2.7版本。

Python是多范式编程语言。完全支持面向对象编程和结构化编程,而它的很多特征支持函数式编程和面向切面编程(包括元编程和元对象(英语:Metaobject)(魔术方法))。Python是完全面向对象的语言,函数、模块、数值、字符串都是对象;并且完全支持继承、重载、派生、多重继承,有益于增强源代码的复用性。Python支持重载运算符,因此Python也支持泛型设计。Python对遵循Lisp传统的函数式编程提供了有限的支持,它提供了 filtermapreduce函数;列表推导、字典、集合和生成器表达式。标准库中有两个模块(functools和itertools)实现了从Haskell和Standard ML取来的函数式工具。

Python的设计哲学是“优雅”、“明确”、“简单”。Python开发者的哲学是“用一种方法,最好是只有一种方法来做一件事”,也因此它和拥有明显个人风格的其他语言很不一样。在设计Python语言时,如果面临多种选择,Python开发者一般会拒绝花俏的语法,而选择明确没有或者很少有歧义的语法。这些准则被称为“Python之禅”。在Python解释器内运行import this可以获得完整的列表,下面是其中首要:

Python开发人员尽量避开不成熟或者不重要的优化。一些针对非重要部位的加快运行速度的补丁通常不会被合并到Python内。再加上因为Python属于动态类型语言,动态类型语言是在运行期间检查数据的类型,不得不保持描述变量值的实际类型标记,程序在每次操作变量时,需要执行数据依赖分支,而静态类型语言相对于动态类型语言,在声明变量时已经指定了数据类型和表示方法,根据这一原理导致Python相对于C、Visual Basic等静态类型语言来说运行速度较慢。不过,根据二八定律,大多数编程对速度要求不高。在某些对运行速度要求很高的情况,Python设计师可以使用JIT技术如PyPy,或者使用C/C++语言编写扩展模块。

Python本身被设计为可扩展的。并非所有的特性和功能都集成到语言核心。Python提供了丰富的API和工具,以便程序员能够轻松地使用C、C++、Cython来编写扩展模块。Python编译器本身也可以被集成到其它需要脚本语言的编程内。因此,有很多人把Python作为一种“胶水语言”使用。使用Python将其他语言编写的编程进行集成和封装。

Python的设计目标之一是让代码具备高度的可阅读性。它设计时尽量使用其它语言经常使用的标点符号和英文单字,让代码看起来整洁美观。因为Python是动态语言,它不像其他的静态语言如C、Pascal那样需要书写声明语句。

Python开发者有意让违反了缩进规则的程序不能通过解释,以此来强迫程序员养成良好的编程习惯,也方便所有人查找和阅读。并且Python语言利用缩进表示语句块的开始和结束(Off-side规则),而非使用花括号或者某种关键字。增加缩进表示语句块的开始,而减少缩进则表示语句块的结束。缩进成为了语法的一部分。例如if语句:

if age < 21:    print("你不能買酒")  #美國法律規定21歲以下的人不能購買酒    print("不過你能買口香糖")print("這句話處於if語句塊的外面")

根据PEP 8的规定,必须使用4个空格来表示每级缩进。使用Tab字符和其它数目的空格虽然都可以被解释器识别,但不符合编码规范。支持Tab字符和其它数目的空格仅仅是为兼容很旧的Python编程和某些有问题的编辑编程。偏向使用Tab字符的程序员可以设置文本编辑器将Tab键转换为4个空格实现缩进而不致导致缩进错误。

Python的表达式写法与C/C++类似。只是在某些写法有所差别。

>>> >>> {x + 3 for x in range(4)}{3, 4, 5, 6}>>> {x: x + 3 for x in range(4)}{0: 3, 1: 4, 2: 5, 3: 6}
>>> sum(x * x for x in range(10))285
>>> add = lambda x, y : x + y>>> add(3, 2)5
>>> x, y=1, 2 #同时给x,y赋值,最终结果:x=1, y=2

特别地,可以使用以下这种形式来交换两个变量的值:

>>> x, y = y, x #最终结果:y=1, x=2

函数

Python的函数支持递归、默认参数值、可变参数、闭包,但不支持函数重载。为了增强代码的可读性,可以在函数后书写“文档字符串”(Documentation Strings,或者简称docstrings),用于解释函数的作用、参数的类型与意义、返回值类型与取值范围等。可以使用内置函数help()打印出函数的使用帮助。比如:

>>> def randint(a, b):...     "Return random integer in range , including both end points."...>>> help(randint)Help on function randint in module __main__:   randint(a, b)    Return random integer in range , including both end points.

函数调用时,实参可以如同C语言那样按照位置与形参匹配;也可以按照命名参数(英语:Named parameter)形式调用,即 param_name=value 形式的实参。在一个函数调用的实参表中,关键字引数必须出现在位置参数之后。

可变参数用*args或**dictargs表示,即在形式参数名字前加一个*号,表示这是由多个实参组成的可变参数,该形参视作tuple数据类型;在形式参数名字前加**号,表示这是由多个实参组成的可变参数,该形参视作dict数据类型。实际上,在一个"集合(collection)类型"(包括set、list、tuple甚至bytes、str等)的变量前加一个*号,获得了其中所有元素作为多个对象。

Python的函数作为第一类对象,具有和普通变量平等的地位。函数一旦定义,即可视作为普通对象,其形参会保留上次调用时的值,但在函数新的一次调用时会被实参值覆盖。因此函数的缺省参数值在连续多次调用该函数时,如果不被实参值覆盖,就会一直保留。例如:

def f(a, L=):    L.append(a)    return Lprint(f(1))print(f(2))print(f(3))

结果为:

函数的缺省参数值在函数被定义时被一次性计算其初值。

Python的函数实参与形参之间的结合是传递。这是因为Python的赋值操作是把(变量)名字绑定到对象上。形实结合也是这种方式。如果形参绑定到一个可变的对象,则通过形参对此对象内容的修改,在函数外也是可见的。如果形参绑定到一个不可变的对象,则通过形参是不能修改此对象内容,但可以把形参重新绑定到其它对象上,这并不影响函数外的对象的值。例如:

def foo(a):    a.append('haha')    def bar(b):    b=101 #实际上是重新绑定了另一个整型对象101a=b=100foo(a)bar(b)print(a) #结果为print(b) #结果为100

数据类型与动态类型

专题

相关