2016-08-18 97 views
0

我想在右邊的默認參數值內的下面的函數中使用左側參數的值。 是否可以在Python中使用默認參數值賦值的參數值?

def function(var, vartwo = var*2): 
    return vartwo 


print(function(7)) #should print 14 
print(function(7,6)) #should print 6 

但是我得到NameError:名字 '無功' 沒有定義。是不是可以在Python的默認參數值中使用參數值?你會如何建議我解決這個問題?

+1

好吧,你需要傳遞實際的'默認',這不能是以前聲明的另一個參數的名稱。 def function(var,vartwo ='blabla'): return vartwo 應該可以工作 –

+0

另一件事 - 如果你需要第二個參數總是作爲第一個參數 - 你不認爲你需要第二個參數,def函數(var): vartwo = var return vartwo在這裏是一樣的。或者如果你解釋爲什麼你需要第二個參數如此糟糕,因爲從這個上下文中不清楚 –

+0

我編輯了問題以更好地解釋上下文。 –

回答

3

這是不可能的;這個怎麼樣?

def function(var, vartwo = None): 
    if vartwo is None: 
     vartwo = var*2 
    return vartwo 

print(function(7)) 
print(function(7,6)) 

的黑客是默認值設置爲None,然後將其設置在內部。如果不是,則返回用戶輸入的內容。

+0

那麼這解決了他當前的問題,而它的原始問題依然存在。dunno,unanswered - 是否可以將先前聲明的參數作爲默認值傳遞給下一個var名稱。蟒蛇說不(如預期)。但如何解決這個一般:D –

+0

是的,這將工作,有點希望不要破解。我會把它作爲一個不可以在默認情況下使用參數值。我只是設置答案。 –

+0

呃......據我所知,'var'必須被定義爲使用。 – TuanDT

0

你做什麼不行,因爲var沒有被聲明。這裏有一個不同的方法:

def function(var, multiply=False): 
    if multiply: 
     return var * 2 
    else: 
     return var 

print(function(7, True)) # 14 
print(function(6)) # 6 
2

踢皮球:

def function(var, *args): 
    return (lambda var, vartwo=var * 2: vartwo)(var, *args) 


print(function(7)) # should print 14 
print(function(7, 6)) # should print 6 

I know about lambda functions but mind adding explanation?

既然我們不能在vartwo的定義中使用var,我們通過建立一個新的參數列表拖延,通過一個lambda,其中var現在被定義,vartwo的默認值是合法的。

我做了這個有點通過重用var變量名代表兩個不同的變量(一個正式的參數function和正式的參數lambda),也作爲一個位置佔位混亂。

def function(var, *args): 
    return (lambda vartwo=var * 2: vartwo)(*args) 

,但我想保留原來的問題的味道:

我可以,而且可能是應該,因爲寫了這更簡單。

+0

不錯,非常pythonic – TuanDT

+0

我知道lambda函數,但介意添加解釋? –

+1

@JoelAntonioDelacruzParedes,我添加了一些解釋以及簡化。讓我知道它是否不足。 – cdlane

0

不,不可能將未在函數外定義的值用作該函數的參數值。

另外,我遲到了派對,但如果None是第二個參數,那麼短而簡單的工作如何?

def function(var, *args): 
    return args[0] if args else var * 2 


print(function(7)) # prints 14 
print(function(7, 6)) # prints 6 
print(function(7, None)) # prints 'None' 

這裏,argsvar後提供的參數列表,可能是一個空列表。然後,如果列表不爲空(這相當於第二個參數),則返回此列表的第一個元素。如果列表爲空,我們將返回var * 2

這裏需要注意的是,如果提供了兩個以上的參數,這不會引發相應的錯誤。如果len(args) > 1(記住args是參數第一個參數之後),那麼您可以選擇手動提高TypeError,如果這對執行很重要。

0

在默認值中不能使用另一個參數的值。原因非常簡單:默認值只被計算一次:在執行函數定義時。

使用一個常見的模式是有第二個參數被設置爲默認的特殊標記值,然後測試該參數是在函數內重新設置:

SENTINEL = object() 

def function(var, vartwo=SENTINEL): 
    # was vartwo set? 
    if vartwo is not SENTINEL: 
     return vartwo 

    return var * 2 

這樣的函數將返回vartwo正確,即使你通過None或任何其他值,除非你明確地通過了SENTINEL常數。