《Python学习手册》(第四版)学习笔记1
第一部分-使用入门:
主要包括Python语言的介绍、程序运行的过程以及如何运行程序。
1. 关于《Python学习手册》
2. 人们为何使用Python
3. Python的角色定位
4. Python的优缺点
5. Python的设计理念
6. Python的运行过程
7. Python执行模块的变体
8. 安装Python
9. 运行Python
10. IDLE
本书由O’Reilly编写,和作者的另一本书《Programming Python》互补。两者分别涵盖了核心语言与应用程序设计。
1、软件质量
Python更注重可读性、一致性和软件质量。
同时,Python支持软件开发的高级重用机制,如面向对象程序设计。
2、提高开发者的效率
Python代码的大小往往只用C++或Java代码的1/5~1/3。
(Python“符合大脑思维习惯”,以统一并有限的方式进行交互,可以在一套紧凑的核心思想基础上进行自由发挥。)
(Python程序员在阅读和编写代码时无需经常查阅手册。)
(Python具有以下特性:简洁的语法、动态类型、无需编译、内置工具包)
3、程序的可移植性
绝大多数(?)的Python程序不做任何改变即可在所有主流计算机平台运行。
同时,Python提供了多种可选的独立程序,包括用户图形界面、数据库接入、基于Web的系统等。
4、标准库的支持
Python内置了众多预编译并可一直的功能模块(标准库standard library)。
Python代码可以调用C和C++的库,可以被C和C++程度调用,可以与Java组件继承,可以与COM和NET等框架进行通信,并可以通过SOAP、XML-RPC和CORBA等接口(?)与网络进行交互。
1、Python是“脚本语言”吗
Python可以定义为面向对象的脚本语言。人们往往以“脚本”而不是“程序”来描述Python的代码文件。
2、实际上,人们往往给Python冠以以下三个不同的角色:
1)Shell工具
从命令行执行,实现诸如文本文件的处理以及调用其他程序等任务。2)控制语言
控制或重定向其他应用程序组件的“粘接层”(从技术上讲,这基本上就是Python的常规角色。)3)使用快捷的编程语言
1、Python技术上的优点
1)面向对象
Python的OOP特性使它成为面向对象系统语言如C++和Java的理想脚本工具。
2)开源
Python开发是由社区驱动的。
Python的创始者Guido van Rossum是Python社区内公认的“终身的慈善独裁者”【Benevolent Dictator for Life(BDFL)】。
Python语言的修改必须遵循一套规范的有约束力的程序【Python Enhancement Proposal(PEP)】协议,并需要经过规范的测试系统和BDFL进行彻底检查。
3)可移植
除了语言解释器外,Python发行时自带的标准库和模块在实现上也懂尽可能考虑了跨平台的移植性。
Python程序自动编译成可移植的字节码,在已安装兼容版本Python的平台上运行的结果都是相同的。
4)功能强大
Python丰富的工具集使它介于传统的脚本语言和系统语言之间。
1.动态类型
Python在运行过程中随时跟踪对象的种类,不需要代码中关于复杂的类型和大小的声明。2.自动内存管理
Python自动进行对象分配,当对象不在使用时将自动撤销对象(“垃圾回收”),当需要时自动扩展或收缩。3.内置对象类型
Python提供了常用的数据结构作为语言的基本组成部分。4.内置工具
为了对以上对象类型进行处理,Python自带了很多强大的标准操作,包括合并(concatenation)、分片(slice)、排序(sort)和映射(mapping)等。5.库工具
6.第三方工具
由于Python是开源的,它鼓励开发者提供自己的预编码工具。
5)可混合
Python是很好的快速原型工具:出于开发速度考虑,系统可以先用Python实现,之后转移至C,根据不同时期的性能需要逐步实现系统。
6)简单易用
Python可立即执行程序,这形成了一种交互式编程体验和不同情况下快速调整的能力。Python一度被称为“可执行的伪代码”。
7)简单易学
2、Python的缺点
Python没有将代码编译成底层的二进制代码,程序执行速度较慢。
即便当今的CPU的处理速度很快,在一些应用领域仍然需要优化程序的执行速度,如:数值计算和动画。如果在以上领域工作,通常分离一部分需要优化速度的应用,将其转换为编译好的扩展,并在整个系统中使用Python脚本将这部分应用连接起来。
1、Python的彩蛋
在任意一个Python交互解释器中键入import this命令,会显示一段话描述Python的设计原则。
“EIBTI”即“明了胜于晦涩”。
2、Python是工程,而不是艺术
Python vs Perl
Python的创立者所受的是数学家的训练,因此他创造出来的语言具有高度的统一性,其语法和工具集都相当一致。再者,就像数学一样,其设计也具有正交性(orthogonal),也就是这门语言大多数组成部分都遵循以小组核心概念。例如:一旦掌握Python的多态,剩下的就只是细节而已。(?)
相比之下,Perl语言的创立者是语言学家。Perl中相同的任务有很多方式可以完成,并且语言材料的交互对背景环境敏感,有时还像自然语言一样有着相当微妙的方式。基于这种设计,Perl语言及其用户社群在编写代码时,一直在鼓励表达式的自由化。一个人的Perl代码可能和另一个人的完全不同。编写独特、充满技巧性的代码,常常是Perl使用者之间的骄傲来源。
Python安装后包括:一个解释器和一些支持的库
1、解释器
1)Linux和Mac OS X已预装Python
2)Python程序仅是一个包含Python语句的文本文件,惯例以.py结尾。
2、字节码
1)程序执行时,Python内部会先将源代码编译成字节码
字节码是源代码底层的、与平台无关的表现形式。Python通过把每一条源语句分解为单一步骤来将这些源语句翻译成一组字节码指令。2)Python保存字节码以实现启动速度的优化,通常扩展名为.pyc
Python编译时会检查源文件和字节码文件的时间戳。如果上次保存字节码之后没有修改过源代码的话,Python将会自动加载.pyc文件并跳过编译步骤。3)如果Python无法再机器上写入字节码,字节码会在内存中生成并在程序结束时简单地丢弃。(严格地讲,只有文件导入的情况下,字节码才被保存。交互提示模式下录入的代码不会被保存为字节码。)
3、Python虚拟机(PVM)
PVM是“Python解释器”的最后一步,实际上就是迭代运行字节码指令的一个大循环,是实际运行脚本的组件。
4、Python的运行
相对于C和C++这类完全编译语言而言,Python没有“build”或“make”的步骤。
相对于静态语言而言,Python的开发和执行环境没有区别。
1、Python编译器的替代实现
1)CPython
CPython是Python的标准实现,相对于其他替代系统,运行速度最快,最完整而且也最健全。
2)JPython
JPython的目标是让Python代码能够脚本化Java应用程序。它通过将Python代码翻译成Java字节码,实现了与Java的无缝集成。
JPython比CPython要慢,而且也不够健壮。
3)IronPython
IronPython比CPython和JPython都要新(由JPython创始人开发)。其设计目的是让Python程序可以与.NET框架及与之相对应的Linux上的开源Mono(?)编写的应用相集成。
IronPython将.NET和C#程序语言的运行系统设计成与语言无关的对象通信层。它允许Python程序既可以作为客户端,也可以用作服务器端组件,还可以与其他.NET语言进行通信。IronPython实现上和JPython类似。
2、执行优化工具
1)Psyco
Psyco是一个扩展字节码执行模块的组件,可以让程序运行的更快。在程序运行时,Psyco收集了正在传递过程中的对象的类被信息,将这些信息用来裁剪对象的类型,从而生成更高效率的机器码。因为字节码的转化与程序运行同时发生,所以Psyco被看做是一个即时编译器(JIT)。(Psyco实际上与Java中的JIT稍有不同,是一个专有的编译器。如果程序的一部分在不同时候采用了不同的数据类型,Psyco会生成不同欧冠版本的机器码。)
Psyco的缺点是:只能为Intel x86架构的芯片生成机器代码。
(作者称Pysco似乎最终会被PyPy替代。但现在似乎有一种观点认为Python追求执行速度是一种伪需求。)
2)Shedskin C++转换器
Shedskin尝试将Python代码变为C++代码,然后使用C++编译器编译为机器码。它给Python程序施加了一种隐晦的静态类型约束。(?)
3)冻结二进制文件
将字节码、PVM以及程序需要的支持文件捆绑成单独的文件包,形成一个单独的可执行的二进制程序。py2exe、PyInstaller、freeze是三种常用工具。
对于接收者来说,代码是隐藏的。
对于商业软件开发者来说,单文件封装的架构特别有吸引力。
4)其他执行选项
Stackless
Cython
Parrot
1、web-based ,executable , embeddable zip file区别
下载Python时一般有三种不同的文件:
web-based: 透过网络安装的,就是执行安装后才透过网络下载python
executable: 可執行文件的,既把要安装的python全部下载好在本机安装
embeddable zip file: zip 压缩档,就是python打包成zip压缩包
以上三种仅是下载形式不同,软件内容是一样的
2、安装后要配置系统环境变量PATH,使其包含Python的安装目录
1、交互提示模式
1)在系统提示环境下输入“python”进入交互提示模式。
2)交互式对话自动打印输入表达式的结果。在这个提示模式下,不需要每次刻意输入print语句
3)退出:
在UNIX系统中输入Ctrl-D
在Windows和MS-DOS系统中输入Ctrl-Z4)多行语句:
a.当在交互提示模式中输入所有语句行,并两次按下Enter键后立即运行这条语句。
b.在shell窗口中,交互提示符会在第二行及以后由>>>变为…
在IDLE界面中,第一行之后的行会被自动缩进
c.点击Enter或Ctrl-C返回主提示模式
d.不能在交互提示模式中复制并粘贴多行代码,除非这段代码的每条复合语句后都包含空行5)Python中,所有没有嵌套的语句都要在第一列(最左边),否则可能会出现“SyntaxError”提示。
2、模块
1)通常将写入代码以永久保存程序的文件称为模块
2)可以直接运行的模块文件也称为脚本(一个顶级程序文件的非正式说法)
3)使用命令行运行文件
% python example.py
Windows中可以省略Python的名字。系统会通过Windows注册表找到用哪个程序运行一个文件。4)UNIX可执行脚本(#!)
a.第一行
由#!开始(通常叫做hash bang),其后紧跟Python解释器的路径
或者写为#!/usr/bin/env python
,env程序可以通过系统搜索路径的设置定位Python解释器,使代码更具可移植性。
b.拥有可执行权限
c.可以不加.py后缀
d.Windows的DOS系统shell会忽略#!
3、模块导入和重载
1)模块实Python程序架构的一个核心概念。
大的程序往往以多个模块文件的形式出现,并导入了其他模块文件的工具,其中一个模块文件设计成主文件(顶层文件,启动后能运行整个程序的文件)2)
import example
导入开销很大,因此只在每次会话的第一次导入时运行。3)
from myfile import attribute
from复制了模块的属性,使属性成为接收者的直接变量。
这可能导致在导入的文件中的同名变量被覆盖。4)
>>>import imp
>>>imp.reload(example)
或者
from imp import reload
reload(attribute)
a.reload函数可以在同一次会话中再次运行文件
b.reload返回值是一个Python模块对象
c.reload是不可传递的,重载一个模块时不会重载该模块导入的任何模块5)使用exec运行模块文件
exec(open('example.py').read
a.每次运行文件的最新版本。
b.和from一样对当前使用的变量有潜在的默认覆盖的可能
4、其他
1)Python2.6和3的差异
a.print语句
Python3中将print从语句变为函数
b.reload函数
Python3中将reload函数从内置移到了imp标准库模块中
c.exec函数
Python2.6中的
exec(open('module.py'))
execfile('module.py')
两种形式在Python3中都不可用
2)input小技巧
Windows中运行脚本后可能立即退出,看不到运行结果。
可以在最后一行加一句
input()
3)dir函数
dir(example)
内置的dir函数可以用来获取模块内部可用的变量名的列表。
双下划线开头并结尾的变量名是Python预定义的内置变量名。
IDLE是Python官方的IDE,内置无需下载。
为了纪念Monty Python成员Eirc Idle而命名。
(据说IDLE会有一些Bug)