《Python核心编程》第二版第308页第十一章练习 续二 -Python核心编程答案-自己做的-

时间:2021-11-16 11:49:02

本博客列出的答案不是来自官方资源,是我自己做的练习,如果有疑问或者错误,欢迎讨论。

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核心编程答案