本部落格列出的答案不是來自官方資源,是我自己做的練習,如果有疑問或者錯誤,歡迎討論。
11-12.
傳遞函數。給在這章中描述的testit()函數寫一個姊妹函數。timeit()會帶一個函數對象(和參數一起)並計算出用了多少時間來執行這個函數,而不是測試執行時的錯誤。返回下面的狀態:函數傳回值、消耗的時間。本文來自部落格園。你可以用time.clock()或者time.time(),無論哪一個給你提了較高的精度(一般的共識是在POSIX上用time.time(),在win32系統上用time.clock())。注意:timeit()函數與模組timeit不相關(在python2.3中引入)。
【答案】
代碼如下:
import timedef timeit(func): start_time = time.clock() result = func end_time = time.clock() return (result, end_time - start_time)def func(a,b): return a - bprint 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 timedef 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 resultdef 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核心編程答案