2013-02-14 76 views
2

我想編寫一個函數,該函數的默認值是該函數的另一個輸入。我想這樣的事情:也使用python函數arg作爲默認參數

def pythag_thm(a, b=a): 
    return (a**2 + b**2)**.5 

但我得到一個NameError: name 'a' is not defined。我意識到我可以做類似這樣的事情:

def pythag_thm(a, b=False): 
    if b==False: 
     return (a**2 + a**2)**.5 
    else: 
     return (a**2 + b**2)**.5 

但是這看起來不太「pythonic」。有沒有一種乾淨的方式來做到這一點?我只是在錯誤地思考這個問題?

+1

小心,如果b爲0,則由於0 ==假,你會得到一個驚喜錯誤 – 2013-02-14 22:17:34

回答

3

人們通常做的是

def pythag_thm(a, b=None): 
    if b is None: 
     b = a 

    return (a ** 2 + b ** 2) ** .5 
2

默認參數在函數定義的時間進行評估,所以沒有辦法做到這一點的方式。

import math 
def pythag_thm(a, b=None): 
    if b is None: 
     b = a 
    return math.hypot(a, b) 
0

輸入中沒有範圍可以知道b是什麼。他們不存在,直到他們在功能

最Python的方式我能想到的是身體:

def example(a, b=None): 
    if not b: b = a 
    // code here 

編輯:等同於@帕維爾的答案 - 必須學會更快的打字。對於潛伏者:有一種行爲差異。帕維爾的回答是好,我的習慣」正確處理是這樣的:

example (2, 0) 

因爲B是無測試是更正確的一個

+0

這是越野車:如果'b == 0'? – 2013-02-14 22:15:31

1
  1. 人們通常使用這個None

    def pythag_thm(a, b=None): 
        b = b if b is not None else a 
        ... 
    
  2. 如果None對您的b有效,您可以創建自己的DEFAULT值:

    DEFAULT = object() 
    
    def pythag_thm(a, b=DEFAULT): 
        b = b if b is not DEFAULT else a 
        ... 
    
  3. 如果你的心情,你還可以處理*args**kwargs自己:

    def pythag_thm(a, *args, **kwargs): 
        try 
         b = args[0] 
         assert len(args) == 1 
        except IndexError: 
         try: 
          b = kwargs.pop('b') 
          assert not kwargs 
         except KeyError: 
          b = a 
        ... 
    

你可能想用變體1或2個堅持,因爲它是最符合Python和不需要你撥弄argskwargs

0

你想,當你想要的默認值是一個列表提供一個默認值時,作爲一個例子要格外小心,這裏是一個錯誤:

>>> def function_with_default(arg=[]): 
... return arg 
... 

這裏有意想不到的效果的例子:

>>> ret = function_with_default() 
>>> ret 
[] 
>>> ret.append(2) 
>>> # unexpected side-effects ... 
>>> ret2 = function_with_default() 
>>> ret2 
[2] 

上面的例子中發生的事情是,您實際上可以修改對象。 這裏是做無副作用的方式:

>>> def function_with_default(arg=None): 
... if arg is None: 
...  arg = [] 
... return arg 
... 

同樣的例子,不同的輸出:

>>> ret = function_with_default() 
>>> ret 
[] 
>>> ret.append(2) 
>>> # no unexpected side-effects this time ... 
>>> ret2 = function_with_default() 
>>> ret2 
[] 

回答你的問題,你可以使用。

def pythag_thm(a, b=None): 
    if b is None: 
     b = a 
    return (a**2 + b**2)**.5