我有一个prime_factorize
函数,它返回从素数除数到它们的幂的字典映射。例如,50 = 2 ^ 1 * 5 ^ 2,因此prime_factorize(50)
返回{2 : 1, 5 : 2}
。
假设这是记录的行为,如果调用0,1或负数,那么发出错误信号的最不令人惊讶的方法是什么?扔ValueError
?返回看起来正确输出的内容(例如prime_factorize(-5) -> {-1: 1, 5: 1}
)?返回一个空的字典?
如果你有更好的格式来返回素数分解,我也很乐意听到。
答案 0 :(得分:2)
在prime_factorize(n)
:
if n < 2 or not isinstance(n, numbers.Integral):
raise ValueError("Number to factor can't be less than 2")
else:
# normal behavior
这样用户a。)获得有关出错的有意义的信息,b。)可以在try...except
块中处理异常。
我肯定不会转错不正确的数据或空的dict,因为这会在第一次有人传递不正确的值时导致一些棘手的调试。提出异常,这就是他们的目的!
答案 1 :(得分:1)
不确定为什么你在这里使用字典。两元组的列表不一样吗?即,prime_factor(50)
返回[(2,1), ((5,2)]
。
使用字典预先假定您知道密钥并想要查找它的值,而对于任意数字的素数因子似乎并非如此。
答案 2 :(得分:0)
与素数因子化的概念有关,而不是与python有关;因子分解应该为所有x&lt; 2或非整数。
答案 3 :(得分:0)
标准库中的数学函数可能是一个很好的参考,可以作为最不令人惊讶的行为。让我们检查math.sqrt
例如:它在域错误(此处为n&lt; 1)上返回ValueError
,在意外类型上返回TypeError
(如果发送非整数,则返回此处)。所以我写了。
if is not isinstance(n, numbers.Integral):
raise TypeError("an integer is required")
elif n < 1:
raise ValueError("number to factor can't be less than 1")
...
我同意Piotr Findeisen,因为空字典的分解似乎非常合理。