2016-07-19 40 views
1

在定義時解析默認值。所以這不會起作用將自身作爲默認參數的函數

def f(x, func = f): 
    if x<1: 
     return x 
    else: 
     return x + func(x-1) 

雖然我確實找到了一種方法。我開始與一些虛擬功能

def a(x): 
    return x 

def f(x, func=a): 
    if x < 1: 
     return x 
    else: 
     return x + func(x-1) 

,然後發出

f.__defaults__ = (f,) 

顯然很尷尬。有沒有另一種方式,或者這是不好的Python?如果不好,你能解釋爲什麼嗎?它會在哪裏破壞事物?

在任何情況下,它的工作原理:

In [99]: f(10) 
Out[99]: 55 

In [100]: f(10, f) 
Out[100]: 55 

In [101]: f(10, lambda x : 2*x) 
Out[101]: 28 
+6

爲什麼不使用'None'? –

+5

你爲什麼要這麼做?它聞起來像一個XY問題。你真的想做什麼? – DeepSpace

+2

這更像遞歸。你可以在函數 –

回答

3

爲了詳細說明安德烈Corbellini的建議,你可以做這樣的事情:

def f(x, func=None): 
    if func is None: 
     func = f 

    if x < 1: 
     return x 
    else: 
     return x + func(x-1) 

這是Python中的相當標準的成語來實現實際的默認值在函數內部,並且由於易變的默認值(例如list對象)的問題,將默認參數定義爲None(或者在None是有效輸入的情況下,某個私有標記對象)。