返回介绍

第四部分 函数

发布于 2024-01-29 22:24:14 字数 3418 浏览 0 评论 0 收藏 0

参考第20章 第四部分 练习题 的习题。

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文