为了账号安全,请及时绑定邮箱和手机立即绑定

decorator这几节的问题?

def factorial(n):
    return reduce(lambda x,y: x*y, range(1, n+1))

print factorial(10)


为什么这几节都出现这个定义函数,与题目有啥联系吗?

好不容易看懂@了,然后又不懂了

正在回答

3 回答

这个跟题目没什么联系, 只是用这个函数测时间容易看出差值,你用@performance去测下面这个函数是一样的。

@performance
def test(n):
    for i in range(0, n):
      print "Hello world"

但是, 这样就测不出时间值了,每次都是0.0000000s。


1 回复 有任何疑惑可以回复我~

请编写一个@performance,它可以打印出函数调用的时间。

计算函数调用的时间可以记录调用前后的当前时间戳,然后计算两个时间戳的差。

参考代码:

import time
def performance(f):
   def fn(*args, **kw):
       t1 = time.time()
       r = f(*args, **kw)
       t2 = time.time()
       print 'call %s() in %fs' % (f.__name__, (t2 - t1))
       return r
   return fn

@performance
def factorial(n):
   return reduce(lambda x,y: x*y, range(1, n+1))
print factorial(10)

考察一个@log的定义:

def log(f):
   def fn(x):
       print 'call ' + f.__name__ + '()...'
       return f(x)
   return fn

对于阶乘函数,@log工作得很好:

@log
def factorial(n):
   return reduce(lambda x,y: x*y, range(1, n+1))
print factorial(10)

我不明白为啥各种问题中最后都要用到factorial这个东东?

0 回复 有任何疑惑可以回复我~
#1

柏舟0

恩...从某一节开始,上面的修饰函数计算的是factorial函数完成所需要的时间
2016-09-13 回复 有任何疑惑可以回复我~

这里定义的函数factorial(n)是一个计算从1累乘到n并返回计算值的函数。最好重新回顾一下 2-5 节的 reduce() 函数。比如: factorial(10) 是返回 1* 2 * 3 * ... * 10 = 3628800。

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255665    人
  • 解答问题       2949    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

decorator这几节的问题?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信