- 译者序
- 前言
- 第1章 问答环节
- 第2章 Python 如何运行程序
- 第3章 如何运行程序
- 第4章 介绍 Python 对象类型
- 第5章 数字
- 第6章 动态类型简介
- 第7章 字符串
- 第8章 列表与字典
- 第9章 元组、文件及其他
- 第10章 Python 语句简介
- 第11章 赋值、表达式和打印
- 第12章 if 测试和语法规则
- 第13章 while 和 for 循环
- 第14章 迭代器和解析,第一部分
- 第15章 文档
- 第16章 函数基础
- 第17章 作用域
- 第18章 参数
- 第19章 函数的高级话题
- 第20章 迭代和解析,第二部分
- 第21章 模块:宏伟蓝图
- 第22章 模块代码编写基础
- 第23章 模块包
- 第24章 高级模块话题
- 第25章 OOP:宏伟蓝图
- 第27章 更多实例
- 第28章 类代码编写细节
- 第29章 运算符重载
- 第30章 类的设计
- 第31章 类的高级主题
- 第32章 异常基础
- 第34章 异常对象
- 第35章 异常的设计
- 第36章 Unicode 和字节字符串
- 字符串基础知识
- Python 的字符串类型
- 文本和二进制文件
- Python 3.0 中的字符串应用
- 转换
- 编码 Unicode 字符串
- 编码非ASCII文本
- 编码和解码非ASCII文本
- 其他 Unicode 编码技术
- 转换编码
- 在 Python 2.6 中编码 Unicode 字符串
- 源文件字符集编码声明
- 使用 Python 3.0 Bytes 对象
- 序列操作
- 创建 bytes 对象的其他方式
- 混合字符串类型
- 使用 Python 3.0(和 Python 2.6)bytearray 对象
- 使用文本文件和二进制文件
- Python 3.0 中的文本和二进制模式
- 类型和内容错误匹配
- 使用 Unicode 文件
- 在 Python 3.0 中处理 BOM
- Python 2.6 中的 Unicode 文件
- Python 3.0 中其他字符串工具的变化
- Struct二进制数据模块
- pickle对象序列化模块
- XML解析工具
- 本章小结
- 本章习题
- 习题解答
- 第37章 管理属性
- 第38章 装饰器
- 第39章 元类
- 附录A 安装和配置
- 附录B 各部分练习题的解答
- 作者介绍
- 封面介绍
第四部分 函数
1.基础。这题没什么,但是要注意,使用print(以及你的函数),从技术上来讲就是多态运算,也就是为每种类型的对象做正确的事:
2.参数。下面是示范的解答。记住,你得使用print才能查看测试调用的结果,因为文件和交互模式下输入的代码并不相同。一般而言,Python不会回显文件中表达式语句的结果:
3.可变参数。在下面的adders.py文件中,有两个版本的adder函数。这里的难点在于,了解如何把累加器初始值设置为任何传入类型的空值。第一种解法是使用手动类型测试,从而找出整数,以及如果参数不是整数时,第一参数(假设为序列)的空分片。第二个解法是用第一个参数设定初始值,之后扫描第二元素和之后的元素,很像第18章中的各种min函数版本。
第二个解法更好。这两种解法都假设所有参数为相同的类型,而且都无法用于字典(正如第二部分所看到的,+无法用在混合类型或字典上)。你也可以加上类型检测和特殊代码从而兼容字典,但那是额外的加分项了。
4.关键字参数。下面是我对这个练习题第一部分的解答(文件mod.py)。要遍历关键词参数时,在函数开头列使用**args形式,并且使用循环[例如,for x in args.keys():use args[x]],或者使用args.values(),使其等同于计算*args位置参数的和:
5.(和6.)下面是对练习题5和6的解答(文件dicts.py)。不过,这些只是编写代码的练习,因为Python 1.5新增了字典方法D.copy()和D1.update(D2)来处理字典的复制和更新(合并)等情况(参考Python的链接库手册或者O'Reilly的《Python Pocket Reference》以获得更多细节)。X[:]不适用于字典,因为字典不是序列(参考第8章的细节)。此外,记住,如果你是做赋值(e=d),而不是复制,将产生共享字典对象的引用值,修改d也会跟着修改e:
6.参见5。
7.其他参数匹配的例子。下面是你应该得到的交互模式下的结果,还有注释说明了其匹配情况:
8.再谈质数。下面是质数的实例,封装在函数和模块中(文件primes.py),可以多次运行。增加了一个if测试,从而考虑了负数、0以及1。把/改成//,从而使这个解答不会受到第5章提到的Python 3.0的/真除法改变的困扰,并且使其支持浮点数。(把from语句的注释去掉,把//改成/,看看在Python 2.6中的不同):
下面是这个模块的运行。即使可能不该这样,但//运算符也适用于浮点数:
这个函数没有太好的可重用性,但可以改为返回值,而不是打印,不过作为实验已经足够。这也不是严格的数学质数(浮点数也行),而且依然没有效率。改进的事就留给数学考虑周密的读者作为练习。(提示:通过for循环来运行range(y,1,-1),可能会比while快一些,真正的瓶颈在于算法。)要测试替代方案的时间,可以使用内置的time模块以及下面这个通用的函数调用timer中所用到的编写代码的模式(参考库手册以获得更多细节):
9.列表解析。下面是你应该写出来的代码的样子。其中有我自己的偏好,不要求都照着做:
10.计时工具。下面是我编写来对3个平方根选项计时的代码,带有在Python 2.6和Python 3.0中的结果。每个函数最后的结果打印出来,以验证所有3个方案都做同样的工作:
如下是针对Python 3.0和Python 2.6的测试结果。对这两者而言,看上去math模块比**表达式更快,**表达式比pow调用更快。然而,应该在你自己的机器上以及Python版本中尝试一下。此外要注意,对于这一测试,Python 3.0几乎比Python 2.6慢两倍;Python 3.1或以后的版本可能表现更好些(将来进行测试自己看看结果):
要计时Python 3.0字典解析和对等的for循环交互的相对速度,应运行如下的一个会话。事实表明,这两者在Python 3.0下大致是相同的;然而,和列表解析不同,手动循环如今比字典解析略快(尽管差异并不大,当我们生成50个字典每个字典1 000 000项的时候,会节省半秒钟)。再次说明,你应该自己进一步调查,在自己的计算机和Python中测试,而不是把这些结果作为标准:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论