prime_factorize(1) - > ? (Pythonic错误信号)

时间:2010-12-18 06:02:52

标签: python

我有一个prime_factorize函数,它返回从素数除数到它们的幂的字典映射。例如,50 = 2 ^ 1 * 5 ^ 2,因此prime_factorize(50)返回{2 : 1, 5 : 2}

假设这是记录的行为,如果调用0,1或负数,那么发出错误信号的最不令人惊讶的方法是什么?扔ValueError?返回看起来正确输出的内容(例如prime_factorize(-5) -> {-1: 1, 5: 1})?返回一个空的字典?

如果你有更好的格式来返回素数分解,我也很乐意听到。

4 个答案:

答案 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,因为空字典的分解似乎非常合理。