我想知道是否可以这样做:
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
语句
答案 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
用作整数时,0
为True
,1
为isinstance()
。这是它之前的元组的索引,返回总和(如果类型匹配)或元组(如果类型不匹配)。
如果也不允许type()
或hasattr()
,请使用int
来测试仅float
或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))]
或使用float表示中的小数点:
{{1}}
答案 2 :(得分:1)
可怕的黑客攻击,但进行0类型测试(无type
或isinstance
,或检查类型属性)
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