测试你的知识:Part I 练习 —— 答案
是时候开始自己编写一点代码了。这第一套练习相当简单,但旨在让你为阅读本书余下部分做好准备,而且它的一些问题暗示了后面章节中接下来的主题。确保到附录 D 的 Part I 查看答案;这些练习和它们的答案有时包含了正文中没有讨论到的额外信息,所以即使你成功的独立回答出了所有问题,你也应该看一下这些答案。
-
交互#
使用系统命令行,IDLE,或在你平台上适用的任何其他方法,来开启 Python 交互式命令行(>>> 提示符),然后输入表达式 "Hello World!"(包括双引号)。这个字符串应该对你回显出来。这个练习的目的是让你配置好运行 Python 的环境。在一些场景中,你可能需要首先运行一个
cd
shell 命令,键入 Python 可执行文件的完整路径,或把它的路径添加到你的 PATH 环境变量中。如果想的话,在 Unix 系统上你可以将 PATH 设置到你的 .cshrc 或 kshrc 文件中来让 Python 永远可用;在 Windows 上要达到这个效果,环境变量 GUI 通常就是你想要的。参见附录 A 来获取关于环境变量设置的帮助。% python ...copyright information lines... >>> "Hello World!" 'Hello World!' >>> # Use Ctrl-D or Ctrl-Z to exit, or close window
-
程序#
使用你选择的文本编辑器,编写一个含有单一语句
print('Hello module world!')
的简单模块文件并且将它存储为 module1.py。现在,通过使用任何你喜欢的启动选项来运行这个文件:在 IDLE 中运行它,点击它的文件图标,在系统 shell 的命令行上将其传递给 Python 解释器(比如,python module1.py
),内置exec
调用,导入与重载,诸如此类。事实上,尽你所能的使用尽可能多的本章讨论过的启动技术,通过运行文件来实验。哪一种技术看起来最简单?(当然,这个问题没有正确答案)module1.py
print('Hello module world!')
% python module1.py Hello module world!
-
模块#
开启 Python 交互式命令行(>>> 提示符)然后导入你在练习 2 中编写的模块。尝试将文件移动到不同的目录然后从它的原始目录再次导入(也就是说,当你导入时在原始目录运行 Python,也就是说先退出 Python shell)。发生了什么?(提示:在原始目录中是不是仍然有一个 module1.pyc 的字节码文件,或在那里的
__pycache__
子目录中有类似的东西?)% python >>> import module1 Hello module world! >>>
测试:将 module1.py 移动到 ./testdir 子目录,然后再次导入会发生什么?#
mv module1.py testdir/
再次导入:
% python >>> import module1 Traceback (most recent call last): File "<stdin>", line 1, in <module> ModuleNotFoundError: No module named 'module1' >>>
会发现出错,发现原始目录中并没有 module1.pyc 的字节码文件,而是在
__pycache__
子目录中有 module1.cpython-310.pyc 这个文件。这个现象说明了什么问题?#
这个现象说明,在导入 Python 模块时,Python 会搜索
sys.path
中的路径,如果找不到该模块,就会引发ModuleNotFoundError
错误。在这种情况下,将模块移动到子目录后,Python 无法在sys.path
中找到该模块,因此导入模块时会出错。要解决这个问题,需要在代码中添加以下语句,以确保子目录包含在
sys.path
中:import sys sys.path.append('testdir')
然后,可以再次尝试导入模块:
% python >>> import module1 Hello module world! >>>
-
脚本#
如果你的平台支持,在 module1.py 文件的顶部添加 #! 行,给此文件可执行的权限,然后作为可执行文件直接运行。第一行需要包含什么?#! 通常只在 Unix,Linux 和类 Unix 系统如 Mac OS X 上有意义;如果你工作在 Windows 上,尝试通过在一个命令提示符窗口,只列出它的名字而不需要单词 “Python” 在它的前面来运行文件(这在最新版本的 Windows 上适用),或通过 Start->Run... 对话框,或类似的方法。如果你正在使用 Python3.3 或和它一起安装的 Windows 启动器,尝试修改脚本的 #! 行来启动可能已经安装到电脑上的不同的 Python 版本(或等价地,完成附录 B 中的教程)
编辑 module1.py:
#!/usr/bin/env python print('Hello module world!')
% chmod +x module1.py % ./module1.py Hello module world!
-
错误和调试#
在 Python 交互式命令行,输入数学表达式和赋值语句来实验。在这个过程中,输入表达式
2 ** 500
和 1 / 0,然后像我们在本章之前做的那样引用一个未定义的变量名。发生了什么?你可能还不知道,但当你犯错误时,你就正在进行异常处理(将在 Part VII 中深入探索的主题)。技术上讲你正在触发所谓的默认异常处理程序 —— 打印一个标准错误信息的逻辑。如果你没有捕获错误,默认的处理程序就会去捕获然后在响应中打印出标准的错误信息。
在 Python 中,异常也和调试的概念绑定在一起。当你首次开始学习时,Python 的关于异常的默认错误消息将尽可能多地提供你所需要的错误处理支持 —— 它们给出了错误的原因,和显示出当错误发生时正在被执行的代码行。要获取更多关于调试的信息,参见侧边栏 调试 Python 代码。
% python >>> 2 ** 500 3273390607896141870013189696827599152216642046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376 >>> 1/ 0 Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>> spam Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'spam' is not defined >>>
-
中断和循环#
在 Python 命令行,输入:
L = [1, 2] # 创建一个两个项目的列表 L.append(L) # 将L作为单独的一项添加给自己 L # 打印L:一个循环的对象
发生了什么?在 Python 所有最近的版本中,你将看到一个我们将在答案附录中描述的奇怪输出,而且它会在我们在本书的下一部分中学习引用时更加有意义。如果你正在使用老于 1.5.1 的 Python 版本,在大多数平台上,一个 Ctrl-C 组合键很可能会有帮助。你认为为什么你的 Python 版本会以它对这段代码响应的方式那样去响应?
警告
如果你确实有一个老于版本 1.5.1 的 Python(但愿今天很少出现这种情况!),在运行这个测试前,确保你的机器使用 Ctrl-C(或其他类似)的组合键可以停止程序,否则你可能需要等待很长一段时间。
% python >>> L = [1,2] >>> L.append(L) >>> L [1, 2, [...]] >>>
-
文档。#
在继续前进前,至少花 15 分钟浏览 Python 库和语言手册来了解标准库中的可用工具和文档集的结构。至少要花这么长的时间来熟悉手册集合中主要主题的位置;一旦熟悉后,要找到所需要的东西就很容易了。可以通过在一些 Windows 上的 Python 开始按钮入口,或在 IDLE 的帮助下拉菜单中的 Python Docs 选项,或在线的 http://www.python.org/doc 来查找这个手册。在第 15 章还将讲述更多关于手册和其他可用文档资源(包括 PyDoc 和
help
函数)。如果还有时间,去探索 Python 网站,和它的 PyPi 第三方扩展仓库。特别是检查一下 Python 官网文档和搜索页;它们可是非常重要的资源。
推荐文章: