附录A 部分练习参考答案
关于生命、宇宙和一切,这个宏大问题的答案……就是……42,Deep Thought带着无限的威严和平静说道。
——道格拉斯〃亚当斯,1979年10月
(出自The Hitchhiker’s Guide to the Galaxy,1979,Pan Books)
第1章
正则表达式
1-1 匹配字符串
bat、hat、bit等
[bh][aiu]t
1-2 姓+名
[A-Za-z-]+ [A-Za-z-]+
(任何一对由单个空格分隔的单词,即姓和名、连字符都可以)
1-3 名+姓
[A-Za-z-]+,[A-Za-z]
(任何由一个逗号和单空格分隔的单词和单个字母,例如姓氏的首字母)
[A-Za-z-]+,[A-Za-z-]+
(任何一对由一个逗号和单个空格分隔的单词,例如姓、名、连字符都可以)
1-8 Python长整型
\d+[1L]
(仅仅十进制整数)
1-9 Python浮点数
[0-9]+(.[0-9]*)?
(描述了一个简单的浮点数,也就是说,任何数量的数字后可以选择性地跟随一个小数点及零个或多个数字,如“0.004”、“2”、“75.”等。)
第2章
2-3 套接字
TCP
2-6 Daytime服务
>>>import socket
>>> socket.getservbyname('daytime', 'udp') 13
第3章
3-20 标识符
pass是一个关键字,所以它不能用作标识符。所有这种情况下,常见的习惯是向变量名字中附加一条下划线(_)。
第4章
4-2 Python线程
I/O密集型。为什么?
第5章
5-1 客户端/服务器架构
窗体客户端是GUI事件,这些事件通常由用户生成,并且必须由充当服务器的窗体系统处理;它负责及时更新显示给用户的内容。
第6章
6-1 扩展Python
性能改进
保护源代码
功能的新变化或期望的变化
更多
第7章
7-16 提高字幕幻灯片的设计(部分答案)
代码中的主要问题是它为演讲标题和个别幻灯片标题都调用了str.title()。第43行确实需要改进。
s.Shapes[0].TextFrame.TextRange.Text = line.title()
我们可以做出快速改变,以使得代码仅仅将标题大小写应用于标题(目前在所有大写字母中),而不管无标题幻灯片的标题。
s.Shapes[0].TextFrame.TextRange.Text = title and line.title() or line
然而,我们可以做得更好。这个练习涉及如何处理TCP/IP,以及如何避免改变它为“TCP/ IP”。假设我们定义一个新的变量eachWord。我的建议是检查eachWord == eachWord.upper()是否成立。如果它是一个缩写,那么就别管它;否则,我们就可以应用标题大小写。是的,虽然也有例外,但如果我们覆盖了80%,那么目前对我们来说就已经足够好了。
第8章
8-1 DB-API
DB-API是一个针对所有Python数据库适配器的常见接口规范。它是很不错的,因为它强制所有的适配器编写者对相同的规范进行编码,以便最终用户程序员能够编写一致的代码,这些代码可以以最少的工作量更加容易地移植到其他数据库中。
第10章
10-6 CGI错误
Web服务器要么不会返回数据,要么会返回错误文本,这将在你的浏览器中导致一个HTTP 500或内部服务器错误,因为这些返回的数据不是一个有效的HTTP或HTML数据。cgitb模块捕获Python错误消息与追溯,并将其作为有效数据通过CGI返回且显示给用户一个强大的调试工具。
第13章
13-8 Web服务和csv模块
用下面的代码替换stock.py中的for循环。
import csv
for tick, price, chg, per in csv.reader(f):
print tick.ljust(7), ('%.2f' % round(float(price), 2)).rjust(6), chg.rjust(6), per.rjust(6)
第14章
14-2 CSV与str.split()
显然,当解析使用不同分隔符的数据时,逗号真的并不是可使用的最好分隔符,这一点不言而喻。除此之外,如果字段(单个“列”值)可以包含引号,那么使用逗号也充满危险。此外,如果字段可以包含引号,也会引发其他问题,这不仅仅因为字符串中可以包含逗号,还因为解析包含逗号的内容时,逗号可以出现在一个引号的左边或右边。
引号本身会导致问题——当你希望引号字符串中的所有单词被当作单个实体时,你将如何解析一个包含引号字符串的字符串?(提示:查看http://docs.python.org/library/shlex)
14-11 稳健性
在xmlrpcsrvr.py文件中,修改第13行为如下内容。
FUNCs = ('add', 'sub', 'mul', 'div', 'mod')
添加所有需要的函数:
FUNCs = ('add', 'sub', 'mul', 'div', 'mod', 'gt', 'ge', 'lt', 'le', 'eq', 'ne',
truediv', 'floordiv',
)
在operator模块中,这些都是可用的,所以除了这些变化之外,不需要额外的工作。现在你应该有足够的知识,并能够增加一元操作符-、**,以及接位操作符&、|、^和~。
第15章
15-1 Jython
Jython是(大部分)标准Python解释器的Java实现,标准Python解释器是用C语言编写的,因此它的另一个名字为CPython。Jython是字节编译的,以运行于Java虚拟机(JVM)上。并非一个直接移植的产物,Jython的创建者认识到Java有它自己的内存管理和异常处理框架,所以这些语言特性并不需要移植。Jython版本以特定的兼容性进行编号,也就是说,Jython 2.5兼容 CPython 2.5。最初版本的 Jython 命名为 JPython,但它后来被 Jython 取代。可以在http://wiki.python.org/jython/JythonFaq/GeneralInfo上的Jython在线FAQ找到更多信息。
