区分int和float值,不进行任何类型的类型检查

时间:2014-02-05 12:38:55

标签: python floating-point int

我想知道是否可以这样做:

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情况。

我不能在没有很多try-except块的情况下挑出int-float或float-int的情况,我想知道是否可以用更简单的方式完成。

哦,而且必须我不使用任何if语句

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

利用布尔值作为int的子类:

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

这使用XOR布尔逻辑运算;如果两个数字都是float,或者两个数字都不是float,则会得到False,否则会得到True。当False用作整数时,0True1isinstance()。这是它之前的元组的索引,返回总和(如果类型匹配)或元组(如果类型不匹配)。

如果也不允许type()hasattr(),请使用int来测试仅floatdef 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))]

或使用float表示中的小数点:

{{1}}

答案 2 :(得分: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

编辑:好吧,老实说,正如@Martijn Pieters所说,必须进行某种类型的测试。我只是在Python中利用Python中数字标识的属性; - )

此外,我想要使用备受诟病的x and y or z Python语义:-D