2016-04-27 123 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 –

相關問題