Python特性与设计哲学

Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多重继承,有益于增强源代码的复用性。Python支持重载运算符,因此Python也支持泛型设计。Python对函数式设计只提供了有限的支持。有两个标准库(functools, itertools)提供了与Haskell和Standard ML中类似的函数式程序设计工具。

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

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

有很多人把Python作为一种“胶水语言”使用。使用Python将其他语言编写的程序进行集成和封装。在Google内部的很多项目,例如Google应用服务引擎使用C++编写性能要求极高的部分,然后用Python或Java/Go调用相应的模块。

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

Python属于动态类型语言,动态类型语言是在运行期间检查数据的类型,不得不保持描述变量值的实际类型标记,程序在每次操作变量时,需要执行数据依赖分支,而静态类型语言相对于动态类型语言,在声明变量时已经指定了数据类型和表示方法,根据这一原理导致Python相对于C、Visual Basic等静态类型语言来说运行速度较慢。不过,根据二八定律,大多数程序对速度要求不高。在某些对运行速度要求很高的情况,Python设计师倾向于使用JIT(just-in-time compilation实时编译)技术,或者用使用C/C++语言改写这部分程序。[来源请求]当前可用的JIT技术是PyPy。

应用范围

Web程序

Python经常被用于Web开发。比如,通过mod_wsgi模块,Apache可以运行用Python编写的Web程序。使用Python语言编写的Gunicorn作为Web服务器,也能够运行Python语言编写的Web程序。Python定义了WSGI(Web Server Gateway Interface)标准应用接口来协调Http服务器与基于Python的Web程序之间的沟通。一些Web框架,如Django、Pyramid、TurboGears、Tornado、web2py、Zope、Flask等,可以让程序员轻松地开发和管理复杂的Web程序。

Python对于各种网络协议的支持很完善,因此经常被用于编写服务器软件、网络爬虫。第三方库Twisted支持异步在线编写程序和多数标准的网络协议(包含客户端和服务器),并且提供了多种工具,被广泛用于编写高性能的服务器软件。另有gevent这个流行的第三方库,同样能够支持高性能高并发的网络开发。

GUI开发

Python本身包含的Tkinter库能够支持简单的GUI开发。但是越来越多的Python程序员选择wxPython或者PyQt等GUI包来开发跨平台的桌面软件。使用它们开发的桌面软件运行速度快,与用户的桌面环境相契合。通过PyInstaller还能将程序发布为独立的安装程序包。

操作系统

在很多操作系统里,Python是标准的系统组件。大多数Linux发行版和Mac OS X都集成了Python,可以在终端机下直接运行Python。有一些Linux发行版的安装器使用Python语言编写,比如Ubuntu的Ubiquity安装器、Red Hat Linux和Fedora的Anaconda安装器。在RPM系列Linux发行版中,有一些系统组件就是用Python编写的。Gentoo Linux使用Python来编写它的Portage软件包管理系统。Python标准库包含了多个调用作业系统功能的库。通过pywin32这个第三方软件包,Python能够访问Windows的COM服务及其它Windows API。使用IronPython,Python程序能够直接调用.Net Framework。

语法

单步运行

适用于Python 3.0以上版本以及Python 2.6、Python 2.7
>>> print('Hello, world!')
Hello, world!

适用于Python 2.6以下版本以及Python 2.6、Python 2.7
>>> print "Hello, world!"
Hello, world!

注意,在3.0及以上版本中,需要在”Hello,world”周围加上圆括号。其原因是在3.0及以上版本中,print命令不再是一个关键字,而是一个函数。

缩进

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

标识符

  • _单下划线开头:弱“内部使用”标识。对于“from M import *”,将不导入所有以下划线开头的对象,包括包、模块、成员。
  • 单下划线结尾_:为了避免与python关键字的命名冲突
  • 双下划线开头:模块内的成员,表示私有成员,外部无法直接调用
  • 双下划线开头双下划线结尾:指那些包含在用户无法控制的名字空间中的“魔术”对象或属性,如类成员的name 、doc、init、import、file、等。推荐永远不要将这样的命名方式应用于自己的变量或函数。

语句和控制流

  • if语句,当条件成立时运行语句块。经常与else, elif(相当于else if)配合使用。
  • for语句,遍历列表、字符串、字典、集合等迭代器,依次处理迭代器中的每个元素。
  • while语句,当条件为真时,循环运行语句块。
    try语句。与except, finally, else配合使用处理在程序运行中出现的异常情况。
  • class语句。用于定义类型。
  • def语句。用于定义函数和类型的方法。
  • pass语句。表示此行为空,不运行任何操作。
  • assert语句。用于程序调适阶段时测试运行条件是否满足。
    with语句。Python2.6以后定义的语法,在一个场景中运行语句块。比如,运行语句块前加锁,然后在语句块运行结束后释放锁。
  • yield语句。在迭代器函数内使用,用于返回一个元素。自从Python 2.5版本以后。这个语句变成一个运算符。
  • raise语句。抛出一个异常。
  • import语句。导入一个模块或包。常用写法:from module import name, import module as name, from module import name as anothername

表达式

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

  • 主要的算术运算符与C/C++类似。+, -, , /, //, *, , %分别表示加法或者取正、减法或者取负、乘法、除法、整除、乘方、取反、取余数。>>, <<表示右移和左移。&, |, ^表示二进制的AND, OR, XOR运算。>, <, ==, !=, <=, >=用于比较两个表达式的值,分别表示大于、小于、等于、不等于、小于等于、大于等于。在这些运算符里面,, |, ^, &, <<, >>必须应用于整数。
  • Python使用and, or, not表示逻辑运算。
  • is, is not用于比较两个变量是否是同一个对象。in, not in用于判断一个对象是否属于另外一个对象。
  • Python支持字典、集合、列表的推导式(dict comprehension, set comprehension, list comprehension)。比如:
    >>> [x + 3 for x in range(4)]
    [3, 4, 5, 6]
    >>> {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}
  • Python支持“迭代表达式”(generator comprehension),比如计算0-9的平方和:
    >>> sum(x * x for x in range(10))
    285
  • Python使用lambda表示匿名函数。匿名函数体只能是表达式。比如:
    >>> add = lambda x, y : x + y
    >>> add(3, 2)
    5
  • Python使用y if cond else x表示条件表达式。意思是当cond为真时,表达式的值为y,否则表达式的值为x。相当于C++和Java里的cond?y:x。
    Python区分列表(list)和元组(tuple)两种类型。list的写法是[1,2,3],而tuple的写法是(1,2,3)。可以改变list中的元素,而不能改变tuple。在某些情况下,tuple的括号可以省略。tuple对于赋值语句有特殊的处理。因此,可以同时赋值给多个变量,比如:

>>> x, y=1, 2 #同时给x,y赋值,最终结果:x=1, y=2

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

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

  • Python使用’(单引号)和”(双引号)来表示字符串。与Perl、Unix Shell语言或者Ruby、Groovy等语言不一样,两种符号作用相同。一般地,如果字符串中出现了双引号,就使用单引号来表示字符串;反之则使用双引号。如果都没有出现,就依个人喜好选择。出现在字符串中的\(反斜杠)被解释为特殊字符,比如\n表示换行符。表达式前加r指示Python不解释字符串中出现的\。这种写法通常用于编写正则表达式或者Windows文件路径。
  • Python支持列表切割(list slices),可以获取完整列表的一部分。支持切割操作的类型有str, bytes, list, tuple等。它的语法是…[left:right]或者…[left:right:stride]。假定nums变量的值是[1, 3, 5, 7, 8, 13, 20],那么下面几个语句为真:

    nums[2:5] == [5, 7, 8]从下标为2的元素切割到下标为5的元素,但不包含下标为5的元素。 nums[1:] == [3, 5, 7, 8, 13, 20]切割到最后一个元素 nums[:-3] == [1, 3, 5, 7]从最开始的元素一直切割到倒数第3个元素。 nums[:] == [1, 3, 5, 7, 8, 13, 20]返回所有元素。改变新的列表不会影响到nums。 nums[1:5:2] == [3, 7]从下标为1的元素切割到下标为5的元素但不包含下标为5的元素,且步长为2

  • Python爬虫初探

    Web API是网站的一部分,用于与使用非常具体的URL请求特定信息的程序交互。这种请求称为API调用。请求的数据将以易于处理的格式(...

    Python爬虫初探
  • Python可视化数据

    json数据类型world_population.json,这个文件包含全球大部分国家1960~2016年的人口数据。Open Kno...

    Python可视化数据
  • 初次使用Python第三方模块pygame写小游戏

    基础不牢,地动山摇先上图看成效(背景每次打开位置随机生成): 飞船与外星人相撞(飞船可上下左右移动): 对于刚掌握一门高级语言基础的人...

    初次使用Python第三方模块pygame写小游戏