11.11 练习
11-1.参数。比较下面3个函数:
给定如下的输入直到程序输出,你认为会发生什么?向下表11. 2填入输出。如果你认为给定的输入会发生错误的话填入“ERROR”或者如果没有输出的话填入“NONE”。
11-2.函数。结合你对练习5-2的解,以便你创建一个带相同对数字并同时返回一它们之和以及产物的结合函数。
11-3.函数。在这个练习中,我们将实现max()和min()内建函数。
(a)写分别带两个元素返回一个较大和较小元素,简单的max2()核min2()函数。他们应该可以用任意的python对象运作。举例来说,max2 (4,8)和min2 (4, 8)会各自每次返回8和4。
(b)创建使用了在a部分中的解来重构max()和min()的新函数my_max()和my_min()。这些函数分别返回非空队列中一个最大和最小值。它们也能带一个参数集合作为输入。用数字和字符串来测试你的解。
11-4.返回值。给你在5-13的解创建一个补充函数。创建一个以分为单位的总时间,以及返回一个以小时和分为单位的等价的总时间。
11-5.默认参数。更新你在练习5-7中创建的销售税脚本以便让销售税率不再是函数输入的必要之物。创建使用你地方税率的默认参数如果在调用的时候没有值传入。
11-6.变长参数。下一个称为printf()的函数。有一个值参数,格式字符串。剩下的就是根据格式化字符串上的值,要显示在标准输出上的可变参数,格式化字符串中的值允许特别的字符串格式操作指示符,如%d, %f, etc。提示:解是很琐碎的——无需实现字符串操作符功能性,但你需要显示用字符串格式化操作(%) 。
11-7.用map()进行函数式编程。给定一对同一大小的列表,如[1,2,3]和[‘abc’,’def,‘ghi’, …,将两个标归并为一个由每个列表元素组成的元组的单一的表,以使我们的结果看起来像这样:{[(1,‘abc’), (2,‘def’), (3,‘ghi’), …]。(虽然这问题在本质上和第6章的一个问题相似,那时两个解没有直接的联系)然后创建用zip内建函数创建另一个解。
11-8.用filer()进行函数式编程。使用练习5-4你给出的代码来决定闰年。更新你的代码一边他成为一个函数如果你还没有那么做的话。然后写一段代码来给出一个年份的列表并返回一个只有闰年的列表。然后将它转化为用列表解析。
11-9.用reduce()进行函数式编程。复习11.7.2部分,阐述如何用reduce()数字集合的累加的代码。修改它,创建一个叫average()的函数来计算每个数字集合的简单的平均值。
11-10.用filter()进行函数式编程。在unix文件系统中,在每个文件夹或者目录中都有两个特别的文件:‘.’表示现在的目录,‘..’表示父目录。给出上面的知识,看一下os. listdir()函数的文档并描述这段代码做了什么:
11-11.用map()进行函数式编程。写一个使用文件名以及通过除去每行中所有排头和最尾的空白来“清洁”文件。在原始文件中读取然后写入一个新的文件,创建一个新的或者覆盖掉已存在的。给你的用户一个选择来决定执行哪一个。将你的解转换成使用列表解析。
11-12.传递函数。给在这章中描述的testit()函数写一个姊妹函数。timeit()会带一个函数对象(和参数一起)并计算出用了多少时间来执行这个函数,而不是测试执行时的错误。返回下面的状态:函数返回值、消耗的时间。你可以用time. clock()或者time. time(),无论哪一个给你提供了较高的精度(一般的共识是在POSIX上用time. time(),在win32系统上用time. clock())注意:timeit()函数与timeit模块不相关(在python2.3中引入)。
11-13.使用reduce()进行函数式编程以及递归。在第8张中,我们看到N的阶乘或者N作为从1到N所有数字的乘积。
(a)用一分钟写一个带x, y并返回他们乘积的名为mult (x, y)的简单小巧的函数。
(b)用你在a中创建mult()函数以及reduce来计算阶乘。
(c)彻底抛弃掉mult()的使用,用lamda表达式替代。
(d)在这章中,我们描绘了一个递归解决方案来找到N!用你在上面问题中完成的timeit()函数,并给三个版本阶乘函数计时(迭代的、reduce()和递归)。
11-14.递归。我们也来看下在第8章中的斐波纳契数字。重写你先前计算斐波纳契数字的解(练习8-9)以便你可以使用递归。
11-15.递归。从写练习6-5的解,用递归向后打印一个字符串。用递归向前以及向后打印一个字符串。
11-16.更新easyMath.py。这个脚本,如例子11. 1描绘的那样,以入门程序来帮助年轻人强化他们的数学技能。通过加入乘法作为可支持的操作来更进一步提升这个程序。额外的加分:也加入除法;这比较难做些因为你要找到有效的整型除数。幸运的是,已经有代码来确定分子比分母大,所以不需要支持分数。
11-17.定义
(a)描述偏函数应用和currying之间的区别。
(b)偏函数应用和闭包之间有什么区别?
(c)最后,迭代器和生成器是怎么区别开的?
11-18.*同步化函数调用。复习下第6章中当引入浅拷贝和深拷贝的时候,提到的丈夫和妻子情形(6. 20小结)。他们共用了一个普通账户,同时对他们银行账户访问时会发生不利影响。创建一个程序,让调用改变账户收支的函数必需同步。换句话说,在任意给定时刻只能有个一进程或者线程来执行函数。一开始你试着用文件,但是一个真正的解决方法是用装饰器和在threading或者mutex模块中的同步指令。你看看第17章来获得更多的灵感。