Python函数相减报错:tuple与int不支持减法运算
问题分析与解决
你遇到的TypeError并不是Python不支持函数返回值相减,而是代码里的一个语法错误导致你试图用元组和整数做减法,同时我们也可以梳理下Java和Python在这个场景下的差异。
错误根源
看你最后一行代码:
print(type(foo2((1, 1000)-foo(1, 1000))))
这里你把(1, 1000)写成了一个元组,然后试图让这个元组减去foo(1, 1000)的返回值(一个数值)——Python里元组和int/float是不支持减法运算的,这就是报错的直接原因。
另外,再确认下两个函数的返回值类型:
foo2返回的是累加后的数值(虽然你标注了->float,但实际是int,不过Python会自动兼容)- 带
@jit装饰器的foo,只要numba编译正常,返回的也是数值类型,所以a = foo(1,1000)和b=foo2(1,1000)都是数值,a-b本身是完全合法的操作,你可以注释掉最后一行错误代码试试,这部分是能正常运行的。
修正后的代码
把最后一行的错误写法改掉,如果你想计算两个函数返回值的差值并查看类型,应该写成这样:
from numba import jit import numpy as np import time @jit def foo(x: int, y: int) -> float: tt = time.time() s = 0 for i in range(x,y): s += i print("Time used: {} sec".format(time.time() - tt)) return float(s) # 显式转成float,符合你的类型标注 print("value of foo", foo(1, 1000)) def foo2(x, y) -> float: tt = time.time() s = 0 for i in range(x, y): s += i print("Time used for foo2: {} sec".format(time.time() - tt)) return float(s) # 显式转成float print("value of foo2", foo2(1, 1000)) a = foo(1, 1000) b = foo2(1, 1000) print("差值:", a - b) print("类型a:", type(a)) print("类型b:", type(b)) # 正确计算差值并查看类型 diff = foo2(1, 1000) - foo(1, 1000) print("差值的类型:", type(diff))
Java vs Python的差异
Java里你可以直接写func1() - func2(),Python其实完全支持这种写法——只要两个函数都返回数值类型(int、float等)。你之前的误解是因为代码写错了,不是Python不支持这个操作。
额外提示
使用numba的@jit装饰器时,最好加上nopython=True参数(比如@jit(nopython=True)),这样能强制numba编译成机器码,获得更好的性能,同时也能提前发现一些类型相关的问题(比如你的foo函数里的print在nopython模式下是不支持的,如果你需要打印,就用默认的object模式,或者把打印逻辑移到函数外面)。
内容的提问来源于stack exchange,提问作者Archo
相关产品推荐
相关产品推荐

