2016-04-27 235 views
2

我知道标题有点混乱。如何通过Python在其他函数中用参数调用一个函数?

因此,让我借此代码为例:

import timeit 

def test1(x,y): 
    return x*y 

def time_cost(func): 
    start = timeit.default_timer() 
    func() 
    stop = timeit.default_timer() 

    print(stop - start) 

time_cost(test1) 

我想给test1的两大参数,x和y,以time_cost功能。

但我不知道该怎么做。

我曾尝试在此之前:

import timeit 

def test1(x,y): 
    return x*y 

def time_cost(func): 
    start = timeit.default_timer() 
    func 
    stop = timeit.default_timer() 

    print(stop - start) 

time_cost(test1(1,2)) 

它可以运行,但结果是如此怪异,我认为这是错误的。

那么如何做到这一点?谢谢你们。

+0

如果只接受一个参数('func'),则不能将'x'和'y'作为'time_cost'的参数。如果你想'time_cost'接受其他参数,那么你需要重写它,以便它接受其他参数。 – BrenBarn

+0

你会想要阅读条款:闭包,装饰,包装。其基本思想是用一个新的函数替换(“包装”)你的函数,这个函数可以做你想做的事情,并以你想要的方式处理参数。 –

回答

4

返回一个你想要的功能。

def time_cost(func): 
    def run(*args, **kwargs): 
     start = timeit.default_timer() 
     func(*args, **kwargs) 
     stop = timeit.default_timer() 

     print(stop - start) 
    return run 

然后调用它。

time_cost(test1)(1, 2) 
+0

你的回答非常好!谢谢! –

2

试试这个。

from functools import wraps 
import timeit 

def time_cost(func): 
    @wraps(func) 
    def wrapper(*args, **kwargs): 
     start = timeit.default_timer() 
     result = func(*args, **kwargs) 
     stop = timeit.default_timer() 
     print(stop - start) 
     return result 
    return wrapper 

test1 = time_cost(test1) 
test1(1,2) 

这种函数被称为装饰器。也称为包装,或封闭。

您还可以使用修饰语法使用:

@time_cost 
def test1(x,y): 
    return x*y 

test1(1,2) 

这并不与上面相同的代码。

+0

你的方法似乎有点神秘。无论如何,我非常感谢您的帮助! –

+0

@MarsLee这实际上可能是在Python中完成这种事情的首选方法。这与IVA的第一个答案完全相同,我只是略微不同地使用它。请参阅:https://www.python.org/dev/peps/pep-0318/#abstract –

相关问题