2014-02-05 51 views
-3

我想知道是否有可能做到這一點的之間:分辯爲int,float值,沒有任何類型的類型檢查

def my_func(num1, num2): 
    """ If both num1 and num2 are ints, return num1+ num2. 
     If both are floats, return num1 + num2 
     If only one is of each type, return a tuple (num1, num2) 
    """ 
    ... 

我知道,操作num1只適用於整數和不要浮動,所以我可以用return num1 + num2來選出int-int的情況。

我不能單獨列出int-float或float-int的情況,而沒有大量的try-except塊,我想知道是否可以以更簡單的方式完成。

哦,這是一個MUST,我不使用任何if陳述

+3

**爲什麼* *完全武斷的限制在這裏不使用'if'? –

+2

即使有可能,這將是一個可怕的API。函數的返回值不應該是數字或序列的任意值。 – geoffspear

回答

2

。利用布爾的是的int一個子類:

def my_func(num1, num2): 
    return (num1 + num2, (num1, num2))[isinstance(num1, float)^isinstance(num2, float)] 

它使用一個XOR布爾邏輯運算;如果兩個號碼都是float,或者兩個號碼都不是float,您將獲得False,否則您將獲得True。當用作整數時,False0True1。這是它之前的元組索引,返回總和(如果類型匹配)或元組(如果類型不匹配)。

如果isinstance()type()被任意不允許任一,則使用hasattr()來測試intfloat唯一屬性:

def my_func(num1, num2): 
    return (num1 + num2, (num1, num2))[hasattr(num1, 'is_integer')^hasattr(num2, 'is_integer')] 

或在浮子表示使用小數點:

def my_func(num1, num2): 
    return (num1 + num2, (num1, num2))[('.' in repr(num1))^('.' in repr(num2))] 
+0

標題說沒有類型檢查(這是愚蠢的,因爲整個前提是結果的類型需要改變,如果類型不同) – geoffspear

+0

@Wooble:那麼,前提是可怕的..有*一些*需要的類型檢查。 –

+0

當然前提是可怕的。這是一個更好的理由不回答,讓OP做他自己糟糕的功課,如果你問我... – geoffspear

3

編輯:擺脫了type()電話。這僅僅是Python2(其使用在標題中指定)

def my_func(num1, num2): 
    """ If both num1 and num2 are ints, return num1+ num2. 
     If both are floats, return num1 + num2 
     If only one is of each type, return a tuple (num1, num2) 
    """ 
    return [(num1, num2), num1+num2][`num1/num1`==`num2/num2`] 

僅有一個異常處理程序

def my_func(num1, num2): 
    """ If both num1 and num2 are ints, return num1+ num2. 
     If both are floats, return num1 + num2 
     If only one is of each type, return a tuple (num1, num2) 
    """ 
    for e in (lambda:~~num1 + ~~num2), (lambda:(num1, ~~num2)), (lambda:(~~num1, num2)), (lambda:num1 + num2): 
     print e 
     try: 
      return e() 
     except: 
      pass 
+0

''。''在repr(num1)中''也能工作.. –

1

可怕劈,但確實0型測試(無typeisinstance,或者檢查類型屬性)

def my_func(num1, num2): 
    is_float = lambda x: float(x) is x and 1 or 0 
    return (is_float(num1) + is_float(num2) == 1) and (num1, num2) or num1 + num2 

編輯:好的,說實話,作爲@Mar彼得斯說,必須進行某種類型的測試。我只是趁着數字身份的屬性的Python爲它;-)

另外,我想利用多非議x and y or z Python的語義:-D

相關問題