问题本身很简单,主要是通过这个小问题来演示Python的一些用法,例如测试代码运行时间、函数嵌套定义等等。
from time import time
from math import factorial
from functools import reduce
from random import randint
def myFactorial1(n):
'''使用传统方法计算阶乘'''
result = 1
for i in range(1, n+1):
result = result*i
return result
def myFactorial2(n):
'''使用reduce()函数'''
#Python允许函数的嵌套定义
def mul(x, y):
return x*y
return reduce(mul, range(1, n+1))
def myFactorial3(n):
'''使用reduce()函数'''
#lambda表达式可以作为函数来使用
return reduce(lambda x,y: x*y, range(1, n+1))
def myFactorial4(n):
'''递归法'''
if n == 1:
return 1
else:
return n*myFactorial4(n-1)
def builtinFactorial(n):
'''使用Python标准库提供的方法直接计算阶乘'''
return factorial(n)
functions = {'Straightforward':myFactorial1,
'Use map to simulate':myFactorial2,
'Use map+lambda to simulate':myFactorial3,
'Use recursive method':myFactorial4,
'Builtin factorial method in math':builtinFactorial}
for m in range(10):
results = []
timeUsed = dict()
#生成随机整数进行测试
n = randint(100, 500)
print('='*30)
print('n=', n)
#比较几个函数的计算结果是否一致,比较每个函数所用时间
for name, func in functions.items():
start = time()
for i in range(1000):
func(n)
results.append(func(n))
timeUsed[name] = time()-start
#按所用时间从大到小输出
for n, t in sorted(timeUsed.items(), key=lambda x:x[1], reverse=True):
print(n, ':', t)
#如果所有函数计算结果一致,输出OK
if results.count(results[0]) == len(results):
print('OK')