该笔记通过Mark Lutz -《Learning Python, Fourth Edition》一书梳理。所有权:Learning Python,Fourth Edition,by Mark Lutz. Copyright 2009 Mark Luty, 978-0-596-15806-4
目录
一、基础背景
学习一门语言的动机基本上都是需要使用它来完成某项任务。因此非常有必要了解新学的语言的一些背景知识,通过回答问题的方式,来了解关于Python的相关基础背景。
-
为什么使用这门语言?
- 软件质量
- 更注重可读性、一致性,具备比传统语言更优秀的可重用性和可维护性,可以保证所有人的代码都能易于理解
- Python支持软件开发的高级重用机制(如:Object-oriented programming)
- 开发效率
- 代码大小往往只有C++或Java代码的20%~33.3%⬇。少量的代码意味着录入、调试、维护工作都会大幅度减少
- Python程序可以立即运行,无需传统编译或者静态语言所必须的编译以及链接等步骤
- 可移植性
- 绝大多数Python程序不需要任何改变即可在主流计算机平台上运行(如:Linux ↔️ Windows只需要复制python代码即可,C++则需要注意语法,换行规则等。)
- Python提供了多种可选的独立程序(如:GUI、DB接入、基于Web的系统、程序启动和文件夹处理等OS接口 等等)
- 标准库的支持
- Python内置众多预编译、可移植的功能模块,即标准库。它支持一些列应用级的编程任务(从字符模式到网络脚本编程的匹配等)
- 可以通过自行开发的库或众多第三方的应用支持软件进行拓展
- Python的第三方支持工具包括网站开发、数值计算、串口读写、游戏开发等各个方面(如:NumPy是一个免费的、如同Matlab一样功能强大的数值计算开发平台)
- 组件集成:灵活的集成机制允许它与应用程序的其他部分进行通信(如:Python代码可以被C\C++程序调用、与Java组件集成、与COM\.NET等框架通信、通过SOAP\XML-RPC\CORBA等接口与网络交互)。
- 软件质量
-
Python是脚本语言吗?
-
它是一门多种用途的编程语言,时常扮演脚本语言的角色。
-
它可以定义为面向对象的脚本语言。
-
脚本倾向于描述简单的顶层代码文件,程序描述相对复杂一些的多文件应用。
-
它采用了一种所谓极简主义的设计理念,人们往往以脚本描述它的代码文件。
-
不止是脚本语言、控制语言,也不仅可以实现简单的编程任务。
-
一般意义上,脚本语言可能最适用于描述它的开发模式(快速和灵活)而不是特定的应用领域的概念。
-
-
有什么缺点呢?
- 唯一的缺点,在现有的(2011年)实现方式下,与C和C++这类编译语言相比,Python的执行速度还不够快。简单来说,Python的标准实现方式是:源代码的语句➡编译成字节码➡解释字节码(Python的可移植性来自于字节码)。由于没有编译成底层的二进制代码(Intel芯片指令),一些Python程序执行起来会比C这样的完全编译语言慢一些。
- 程序类型决定了是否需要关注程序的执行速度。在现代计算机处理速度的情况下,Python开发速度带来的效益 > 执行速度带来的损失。
- 一些应用领域仍需优化程序的执行速度(如:数值计算和动画)。要求其核心数值处理单元至少以 C语言的速度或者更快执行。可以通过分离一部分需要优化速度的应用 ➡ 转换成编译好的扩展 ➡ 在整个系统中用Python脚本将这部分应用连接起来。NumPy是一个典型采用双语言混编策略的例子,它是Python的数值计算扩展,将Python打造成一个高效、简单、易用的数值计算编程工具。
-
它广泛应用于哪些领域,谁在用他们?
- 除了广泛的个人用户使用之外,一些公司将其应用于商业产品的开发上(Youtube视频分享服务、BitJorrent、EVEOnline)。
- 在P2P、网游、视频、大规模硬件测试、动画电影制作、科学计算任务、AI等方面都有Python的影子。Python的通用性使其几乎能应用于任何场景,而不仅仅只能在一处使用。
- 无论是短期策略任务(测试/系统管理)还是长期战略上的产品开发,Python已证明无所不能。从网站到游戏开发到机器人和航天飞机控制都可以应用Python,它的应用角色几乎是无限的。
- 最常用的应用领域:
- 系统编程(对OS服务的内置接口使其成为维护OS管理工具和部件的理想工具)
- 用户图形接口(简洁、快速的开发周期非常适合开发GUI)
- Internet脚本(它提供了标准Internet模块,使其能够广泛在多种网络任务中发挥作用,C/S都可以)
- 组件集成(利用C/C++进行扩展,嵌套它们的特性成为一种灵活的黏合语言,可以脚本化处理其它系统和组件的行为)
- 数据库编程(Python提供了对所有主流关系数据库系统的接口,如Sybase、Oracle、Informix、ODBC、MySQL、PostgreSQL、SQLite等)
- 快速原型(使用Python做系统原型,然后将组件移植到C/C++这样的编程语言上)
- 数值计算和科学计算编程(各种工具与Python集成一个缜密、严谨、简单的数值计算工具,且借助类似Scipy等扩展,提供数据3D可视化、并行化处理)
- 游戏、图像、人工智能、XML、机器人等(利用pygame系统对图形和游戏编程、Pyserial扩展在Windows/Linux以及更多系统上进行串口通信、用PIL/PyOpenGL/Blender/Maya和其它一些工具进行图像处理、PyRo工具包进行机器人控制编程、xml库/xmlrpclib模块和其他一些第三方扩展进行XML解析、使用神经网络仿真器和专业的系统shell进行AI编程、使用NLTK包进行自然语言分析)
-
Python有哪些技术上的优点?
- 面向对象(类模块支持多态、操作符重载和多重继承等高级概念,OOP易于应用。通过适当的粘接代码,Python程序可以对C++/Java/C#的类进行子类的定制)
- 和所有的开源软件一样,使用和分发是完全免费的。
- Python的标准实现由可移植的ANSI C编写的。
- 从特性来看,Python是一个混合体。丰富的工具集使其介于传统脚本语言(Tvl/ Scheme/ Perl)和系统语言(C/ C++/ Java)之间。这使得它提供所有脚本语言的简单和易用性,也具有在编译语言中才能找到的高级软件工程工具。
- Python工具箱的部分工具简介
- 动态类型,没有复杂的类型和变量声明,它自动应用了一种广义的对象。
- 自动内存管理,Python自动进行对象分配。垃圾回收/自动扩展其都能代替人工进行底层内存管理。
- 大型程序支持,为能建立更大规模的系统,Python包含了模块、类和异常等工具。这些工具允许我们把系统组织为组件,使用OOP重用并定制代码,并以一种优雅的方式处理事件和错误。
- 内置对象类型,Python提供了常用的数据结构作为语言的基本组成部分,如list、dictionary、string等。
- 内置工具,为了对对象类型进行处理,Python自带许多标准操作,包括合并concatenation、分片slice、排序sort和映射mapping等。
- 库工具,为了完成更多特定的任务,Python预置了很多预编码的库工具,从正则表达式匹配到网络都支持。
- 第三方工具,开源的最大收益就是可以产生很多内置工具之外的预编码工具,如:COM、图像处理、CORBA ORB、XML、数据库等免费支持工具。
- 可混合,Python程序可以以多种方式与其他语言编写的组件粘接在一起,如将Python和C/C++写成的库文件混合起来,使Python成为一个前端语言和定制工具。
- 简单易用、简单易学,运行时直接键入Python程序并运行就可以了,无需其他中间步骤。除了开发周期短,简洁的语法和强大的内置工具也是亮点
-
import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those! -
章节小结
-
了解Python的一些基础信息,应用的场景。整体来说,书中描述详尽,毫不吝啬称赞,看看就行了,了解一下。
-
章节提供的习题和解答
- 人们选择Python的六个主要原因是什么?
- 软件质量
- 开发者效率
- 程序的可移植性
- 标准库的支持
- 组件集成
- 享受简便
- 质量和效率是人们选择Python的主要原因
- 列举如今正在使用Python的四个公司和组织的名称
- Industrial Light & Magic
- EVE Online
- Jet Propulsion Labs
- Maya
- 处于何种原因会让你在应用中不适用Python?
- 性能原因,运行执行没有C/C++快
- 对于大多数应用足够快了,除非速度要求很苛刻
- 你可以用Python做什么?
- 在计算机的任何方面使用Python
- 从网站到游戏开发到机器人和航天飞机控制
- Python中import this有什么意义?
- 触发Python内部的一个彩蛋将显示Python语言层面之下的设计哲学。
- 人们选择Python的六个主要原因是什么?
-
~ 第一章节END ~
二、Python如何运行程序
简单了解程序执行的流程,这比直接学习计算机原理,编译原理这些课程简单许多,当然也深入不到哪里。第二章节主要学习Python解释器。
1. Python解释器简介
从实现上来讲,Python是一个名为解释器的软件包。解释器是一种让其他程序运行起来的程序。在编写了一段Python程序后,Python解释器读取这段程序,并按照其中的命令执行获取结果。实际上,解释器是软件逻辑层,位于代码和机器的计算机硬件之间。
Python包安装之后,包含了一些最小化的组件:一个解释器和支持的库。使用情况不同,解释器可能以可执行程序的形式出现,或是作为链接到另一个程序的一系列库。解释器本身可以用C/Java类实现,或是其他形式。
2. 程序执行
编写和运行Python脚本的意义从程序员和Python解释器的角度看是不一样。从这两种视角可以很好的观察理解Python编程。
2.1 程序员视角
最简单的形式,一个Python程序就是一个包含Python语句的文本文件。比如下边这段代码是我们能够想象到的最简单的Python脚本,但它算得上一个典型的Python程序。
print('Hello World') print(2 ** 100)
这个文件包含两个打印语句,一个字符串,一个数学表达式。编辑完文件之后,以".py"的后缀保存文件。然后告诉Python去执行这个文件,从头到尾按照顺序一个接一个的运行文件中的语句。可以通过命令行、IDE中点击其图标或者其他标准技术来运行Python程序,最后显示结果。
2.2 Python视角
Python运行脚本时,在开始处理代码之前,Python还会执行一些步骤。先将代码编译成字节码,然后转发到虚拟机中。
1. 字节码编译
程序执行时,Python内部会将源代码编译成字节码形式。编译是一个简单的翻译步骤,字节码时源代码底层的且与平台无关的表现形式。每一条源语句被翻译成一组字节码指令。字节码可以提高执行速度。".pyc"后缀的文件保存的便是编译过的".py"源代码。
2. PVM(Python虚拟机)
编译成的字节码会发送到Python虚拟机上执行。PVM是迭代运行字节码指令的一个大循环,一个接一个完成操作。它是Python的运行引擎,是实际运行脚本的组件。
3. 执行模块的变体
上述的程序执行的流程是Python的标准实现形式,这不是Python语言本身所必需的,因为执行模板随着时间在演变,有些系统改进了这种流程。
3.1 Python实现的替代者
截止到2011年Python语言主要有三种实现方式(CPython、Jython、IronPython)以及一些次要的实现方式,如Stackless Python。CPython是标准的实现,其他的方式都有特定的目标和角色。所有的实现都只是通过不同的形式执行程序而已。
1. Cpython
由可移植的ANSI C语言代码编写而成,CPython是这门语言的参照实现方式,和其他替代系统相比,它的运行速度最快、最完整、最健全。
2. Jython
为了与Java编程语言集成生成的一种替代实现方式。Jython包含Java类,这些类编译Python源代码,形成java字节码,并将得到的字节码映射到Java虚拟机上。Jython脚本可以应用于开发Web applet和servlet,建立基于Java的GUI。相对于CPython慢切不够健壮。
3. IronPython
为了让python程序可以与Windows平台上的.NET框架以及Linux的Mono编写成的应用相集成,出现了IronPython。
3.2 执行优化工具
以上三种通过同样的方式实现Python语言,即通过把源代码编译成字节码,然后在合适的虚拟机上执行这些字节码。而其他的系统,比如Psyco即时编译器以及Shedskin C++转换器,则试着优化基本执行模块。
1. Psyco实时编译器
它是一个扩展字节码执行模块的组件,可以让程序运行更快。也可以看成一个PVM的增强工具,这个工具收集并使用信息。程序运行时,可以将一部分程序的字节码转化成底层的真正的二进制机器代码,从而实现更快的执行速度。缺点是它实际上只能为Intel x86架构的芯片生成机器代码。
2. Shedskin C++转换器
它是一个引擎系统,采用一种不同的Python程序执行方法:尝试将Python代码变成C++代码,然后使用机器中的C++编译器将得到的C++代码编译成机器代码。
3.3 冻结二进制文件
通过第三方工具让Python程序生成独立的可执行二进制代码,即将Python程序转化为可执行程序(冻结二进制文件,Frozen Binary)是有可能的。冻结二进制文件能将程序的字节码、PVM以及任何程序所需要Python支持文件捆绑在一起形成一个单独的文件包。比如微软系统中的.exe文件很容易向客户分发。
3.4 其他执行选项
还有一些其他的方案可以用来运行Python程序,他们具有更专注的目标。如Stackless Python是Cpython的一个变体,它不会在C语言调用栈上保持状态。这使得Python更容易移植到较小的栈架构中,提供了更高效的多处理选项,并且促进了像coroutine这种新奇的编程结构。
4. 总结与习题
介绍了Python的执行模块并探索了这个模块的一些变体。可以通过这一章节理解程序如何运行。
1. 什么是Python解释器?
运行Python程序的程序。
2. 什么是源代码?
为程序所写的语句:它包括文本文件(.py)的文本。
3. 什么是字节码?
Python将程序编译后所得到的底层形式。自动将字节码保存至.pyc的文件中。
4. 什么是PVM?
Python虚拟机。它是Python的运行引擎,是实际运行脚本的组件
5. 列出两个Python标准执行模块的变体的名字。
Psyco、Shedskin以及Frozen Binary是执行模块的变体。
6. CPython、Jython以及IronPython有什么不同?
CPython是Python语言的标准实现,Jython和IronPython分别是Python程序的Java和.NET的实现。它们都是Python的编译器的替代实现。
~ 第二章节END ~
三、如何运行程序
了解程序执行之后就可以编写程序了。这一章讨论常用的启动技术。这一过程学习交互的输入程序代码、保存代码并用命令行执行、图标点击、模块导入以及IDLE这样的GUI中的菜单选项等内容。
非常基础的内容,笔记就不再非常详尽的记录,一笔带过了。不过红色标记的内容可以看一下。
1. 交互提示模式下编写代码
最简单的运行Python程序的办法。一般使用系统终端如DOS键入命令行即可。
1.1 交互地运行代码
每个">>>"后边输入一行Python语句,在按下确定键之后在下一行就会出现结果。在这种交互模式下可以自由输入Python的命令。这种模式下没有必要创建一个源代码文件,也没有必要在运行代码前先通过编译器和连接器。后边会提到如何键入多行语句并运行。
>>> print(2 ** 8) 256
1.2 为什么使用交互提示模式
用来体验语言和测试"编写中的程序文件"。代码是立即执行的,交互提示是实验这个语言的绝佳地方。我们可以尝试执行不理解的Python代码,正确的语句输出的结果会让我们加快理解。错误的语句可以获取交互的提示,错在了哪里。
>>> X <== Making mistakes Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'X' is not defined
除了体验,交互式解释器也是测试已经写入到文件中的代码的好地方。你可以交互地导入模块文件,键入命令从而运行测试。例如,下边的代码在Python的标准库所附带的一个预编码的模块中测试一个函数,它将会显示出我们当前工作的目录的名称。
>>> import os >>> os.getcwd() <== Testing on the fly 'c:\\Python30'
交互提示模式是一个测试程序组件的地方,不需要考虑其源代码。可以在Python文件中导入并测试函数和类,通过输入命令连接C函数,在Jython中使用Java类等。
2. 系统命令行和文件
交互模式下执行完代码之后,这一个段程序是不会被保存的。如果要重新运行,需要从头开始输入。为了永久保存程序,需要在文件中写入代码,这样的文件通常加模块。模块是一个包含了Python语句的简单文本文件。可以直接运行的往往叫脚本(一个顶层程序文件的非正式说法)。
2.1 第一段脚本
在文本编辑器中输入如下语句:
# A first Python script import sys print(sys.platform) print(2 **100) x = 'Spam!' print(x * 8)
这几行代码从上到下,导入了一个Python模块获取平台名称、运行三个print函数调用以显示脚本结果。“#”符号后的文本作为注释。
2.2 使用命令行运行脚本
保存后的文本文件,其完整的文件名是Python的第一个参数。在shell中输入要求Python来运行它。
% python script.py win32 1267650600228229401496703205376 Spam!Spam!Spam!Spam!Spam!Spam!Spam!Spam!
使用特定的shell语法可以将结果保存在指定的文件内,这种方式一般叫做流重定向(stream redirection),用于文本的输入和输出。
% python script.py > saveit.txt
2.3 使用命令行和文件
几个简单的注意事项:
1. 注意Windows上的默认拓展名。现在的开发工具都能避开这种低级问题。
2. 命令行模式下使用文件拓展名,导入的时候别使用文件拓展名。执行和import的区别。有点编程常识的基本上都不会犯错误。python script.py / import script
3. 注意print语句的使用场景。
2.4 UNIX可执行脚本和env查找技巧
有兴趣的可以自行了解相关基础知识。
3. 点击文件图标
3.1 在Windows中点击图标
找到源代码script.py存放的位置,双击也能直接运行文件,windows中,也许因为没有输入交互,运行界面会一闪而过看不到输出和错误提示。
3.2 input的技巧
为了能解决上边一闪而过的问题,在最后加上input函数的一条调用语句。最终的运行界面就会停留在等待输入的位置。
# A first Python script import sys print(sys.platform) print(2 **100) x = 'Spam!' print(x * 8) input()
3.3 图标点击的其他限制
一闪而过也许会错过错误信息。其实现在的编辑器足够优秀而不需要单独的打开shell窗口。除非是真正的毫无经验的初学者,可以尝试着多了解一些基础内容。
4. 模块导入和重载
从术语来讲,每一个后缀为py的Python源代码文件都是一个模块。其他文件可以通过导入一个模块读取这个模块的内容。本质上讲,导入就是载入另一个文件,并且能够读取那个文件的内容。一个模块的内容通过这样的属性能够被外部世界使用。更大的程序往往以多个模块文件的形式出现,并且导入了其他模块文件的工具。其中一个模块文件设计成主文件,叫做顶层文件,启动后能够运行整个程序的文件。
4.1 模块的显要特性:属性
简单讲就是介绍了import导入python程序的一些基础知识。比如一个python程序里有一些变量a,b,c。一般会在使用这些变量的时候import,一般有如下几种import
# myfile.py title = "The Meaning of Life"
% python >>> import myfile >>> print(myfile.title) The Meaning of Life % python >>> from myfile import title >>> print(title) The Meaning of Life
# zeroNames.py a = 'love' b = 'is' c = 'blue' print(a, b, c)
% python love is blue % python >>> import zeroNames love is blue >>> >>> zeroNames.b, zeroNames.c ('is', 'blue') >>> >>> from zeroNames import a, b, c >>> b, c ('is', 'blue') >>> >>> dir(zeroNames) ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'a', 'b', 'c']
4.2 import和reload的使用注意事项
通过import和reload都能执行文件,但是并不是所有的情况都适合,而且很容易让人变得混乱。所以在使用这两个方法的时候需要记住,你如果能记住何时导入,才能知道能不能够reload。reload不可传递,只会重载一个模块,而不会重载该模块所导入的任何模块。不过总的来说,尽量避免使用import和reload启动程序。
5. 使用exec运行模块文件
除了上边介绍的还有很多方法运行模块文件中保存的代码。比如:
exec(open('module.py').read())
该内置函数调用,是从交互提示模式启动文件而不必导入以及随后的重载的一种方法。每次exec都运行最新版本的文件,而不需要随后的重载。
6. IDLE用户界面
IDLE提供了做Python开发的GUI,可以认为它是一个IDE。下边的内容基本上就是小白操作教程,使用IDE的方法,不在这里赘述了。
6.1 IDLE基础
介绍了启动和基本的界面,以及编辑窗口的功能项。
6.2 使用IDLE
较为详尽的介绍了一些操作要点,比如从哪里点击运行,怎么运行。
6.3 高级IDLE工具
介绍了一些高级功能特性。
7. 其他IDE
常见的IDE还有Eclipse、PyDev、Komodo、NetBean、PythonWin、PyCharm等,你完全可以选择你想要的IDE工具进行开发。
8. 其他启动选项
介绍了运行Python的其他方法。在不同的领域,运行python的方式也多种多样。
8.1 嵌入式调用
一些特定的领域,Python代码也许会在一个封闭的系统中运行。我们称Python程序被嵌入在其他程序中运行。Python代码可以保存在一个文本文件中,存储在数据库,从一个HTML页面获取、从XML文件解析等。
8.2 冻结二进制的可执行性
这种方式适合在发售前进行封装成一个单独的可执行程序的包。
8.3 文本编辑器启动的选择
文本编辑器也提供启动Python程序编译的工作,只不过不像IDE那么功能全面而已。
8.4 其他的启动选择
根据使用的平台不同,也许也有其他的方法启动Python程序,不过和我们关系并不大,绝大多数人的主流平台还是Windows。
9. 总结
这一章节学习启动Python程序的一般方法:交互的输入运行代码、系统命令行运行保存在文件中的代码、文件图标点击、模块导入、exec调用以及IDE开发。主要介绍入门的细节,以便开工。下一部分我们讲介绍数据类型。
~ 第三章节 END ~
~ 第一部分 END ~