1.9 思考与提高
1.Python 2.x和Python 3.x的主要差别在哪里?
【案例分析】
考虑到Python 2.x还被广泛使用,Python社区也提供了部分方案以解决二者的兼容性问题。下面我们列出Python2.x和Python3.x的主要区别。
(1)字符编码方式的差异
Python 3.x中所有字符的编码方式都是unicode。在Python 2.x中,定义unicode字符时需要在字符前面显式加上标识符u,但在Python 3.x中则不需要。针对这种差异,可以在Python 2.x源文件中导入__future__“未来包”,妥善处理二者的兼容性问题,具体如下。
导入该包以后,Python 2.x即可使用Python 3.x的未来特性,即在Python 2.x中定义的普通字符将自动识别为unicode字符。
(2)print操作的差异
在早期的Python 2.x中,print是关键字,到了Python 3.x中,print变成了一个函数。事实上,Python 2.6以后也提供了print函数。既然是函数,输出内容就会被当作函数的参数包裹在一对括号之内。而Python 2.x则不需要这对括号。我们可以对比如下代码的差异。
为了同时打印输出多个字符串,我们可以导入print_function,用来阻止Python 2.x把它们解释成一个元组(tuple)。
在模块的顶部导入新的函数,可提升兼容性。
(3)异常处理上的差异
在Python 3.x中,对异常的处理也做了更新,这个和print处理手法类似,此处不再赘述。
(4)部分模块名和函数名的差异
相比于Python 2.x,Python 3.x中似乎“少”了很多的模块包,其实在大多数情况下,这些包只是改了个名字而已。部分函数名发生了变化,例如存在xrange和range的差异。此外,运算规则也发生了变化,例如在Python 3.x中,5/2的结果是2.5,而不是Python 2.x中的整数2,Python 3.x会把所有整数之间的除法结果换算成一个浮点数(float)。
以上仅仅给出粗略对比,更多具体细节上的差异,请读者自行参考Python 3.x官方文档。
下面给出好用的脚本,通过加载如下脚本,Python 3.x能完美兼容绝大部分通过Python 2.7以上版本编写的代码。
【范例1-3】
2.如何让Python代码像脚本、命令一样执行?
【案例分析】
有时,我们希望编写的Python代码在命令行直接运行,而不需要显式通过Python解释器来执行。这时我们可以在类UNIX系统下(如macOS或Linux)将.py文件变成一个可执行文件,步骤如下。
首先,声明解释器。我们需要为Python源文件指定解释器,例如在【范例1-3】中,我们在第01行使用“#!/usr/bin/env python”进行声明。
在脚本编程中,第1行以“#!”开头的代码在计算机行业中叫作“shebang”(也称为Hashbang),其作用是指定由哪个解释器来执行脚本。整行代码的含义是,从PATH环境变量中查找Python解释器的位置,然后调用该路径下的解释器来执行脚本。
然后,添加执行权限。在脚本运行前,必须让脚本获得执行权限。
①Linux/UNIX的文件访问权限分为三级:拥有者、群组、其他。利用chmod命令可以更改文件的访问权限。其中,参数“a”表示所有(all),即拥有者、群组、其他三类用户,“+”表示添加权限,“x”表示执行(execute)权限。
②此处“./”表示当前路径,通常不可省略。
3.Jupyter中的常见快捷键有哪些?
【案例分析】
使用快捷键能够显著提高我们的编程效率。Jupyter中的常见快捷键如表1-2所示。
表1-2 Jupyter中的常用快捷键