本博客列出的答案不是来自官方资源,是我自己做的练习,如果有疑问或者错误,欢迎讨论。
11-12.
传递函数。给在这章中描述的testit()函数写一个姊妹函数。timeit()会带一个函数对象(和参数一起)并计算出用了多少时间来执行这个函数,而不是测试执行时的错误。返回下面的状态:函数返回值、消耗的时间。本文来自博客园。你可以用time.clock()或者time.time(),无论哪一个给你提了较高的精度(一般的共识是在POSIX上用time.time(),在win32系统上用time.clock())。注意:timeit()函数与模块timeit不相关(在python2.3中引入)。
【答案】
代码如下:
import time def timeit(func): start_time = time.clock() result = func end_time = time.clock() return (result, end_time - start_time) def func(a,b): return a - b print timeit(func(2,1))
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()和递归)。
【答案】
(a)代码如下:
>>> def mult(x,y): ... return x * y ... >>> mult(2,3) 6 >>>
(b)代码如下:
>>> def factorial(n): ... return reduce(mult, range(n+1)[1:]) ... >>> factorial(6) 720 >>>
(c)代码如下:
>>> def factorial(n): ... return reduce((lambda x,y: x*y), range(n+1)[1:]) ... >>> factorial(6) 720
(d)代码如下:
# From www.cnblogs.com/balian/ #-*- encoding: utf-8 -*- import time def timeit(func): "计时函数" start_time = time.clock() result = func end_time = time.clock() return (result, end_time - start_time) def factorial_iteration(n): "使用循环计算阶乘" result = 1 for eachItem in range(n+1)[1:]: result = result * eachItem return result def factorial_lambda(n): "使用lambda计算阶乘" return reduce((lambda x,y: x*y), range(n+1)[1:]) def factorial_recursion(n): "使用递归计算阶乘" if n == 0 or n == 1: return 1 else: return (n * factorial_recursion(n-1)) number = 6 print "使用循环计算阶乘 :" print timeit(factorial_iteration(number)), '\n' print "使用lambda :" print timeit(factorial_lambda(number)), '\n' print "使用递归 :" print timeit(factorial_recursion(number)), '\n'
关键词 Python核心编程答案