CodeWars问题:
创建一个名为divisors的函数,它接受一个整数并返回一个 包含所有整数除数的数组(1和数字除外) 本身)。如果数字是素数返回字符串'(整数)是素数'
当我在Spyder3 for Python中测试它时,下面的代码运行得很好。
def divisors(integer):
arr = []
for x in range(2,integer - 1): #if integer is 12
if integer % x == 0:
arr.append(x)
if len(arr) == 0:
print(integer, 'is prime')
else:
print(arr)
但是,当我将其提交给CodeWars时,它会返回以下错误。
divisors(15)
应该返回[3,5];我的功能就是这样。 CodeWars窗口日志显示答案是正确的,但继续说None should equal [3, 5]
。
我检查了它是否返回了除列表之外的东西,但是检查了。有人能发现问题吗?
答案 0 :(得分:3)
网站希望您从函数中返回一个值 - 只需打印它:
if len(arr) == 0:
return str(integer) + ' is prime'
else:
return arr
答案 1 :(得分:1)
您的函数返回None
- 没有return
语句,没有返回值。函数的默认返回值是None
,因此会出现错误消息。
def divisors(integer):
arr = []
for x in range(2,integer - 1): #if integer is 12
if integer % x == 0:
arr.append(x)
if len(arr) == 0:
return str(integer) + ' is prime'
else:
return arr
for i in [1, 3, 9, 12, 64]:
print (i, divisors(i))
输出:
1 1 is prime
3 3 is prime
9 [3]
12 [2, 3, 4, 6]
64 [2, 4, 8, 16, 32]
答案 2 :(得分:1)
对您的问题元答案 ...
由于每个其他答案都解决了(明显的)主要问题,我想对现有算法进行改进(因为这是代码大战)。 This link将解释此代码的工作原理。
def divisors(integer):
arr = []
for x in range(2, round(integer ** 0.5)): #if integer is 12
if integer % x == 0:
arr.append(x)
if len(arr) == 0:
return str(integer) + ' is prime'
else:
return arr
非素数将只有幅度上的平方根。这为您提供了比O(n)
稍微好一点的复杂性,并且对于非常大的输入显着改善了。
现在,您可以通过列表理解来大幅缩短代码。
def divisors(integer):
arr = [x for x in range(2, round(integer ** 0.5)) if integer % x == 0]
if len(arr) == 0:
return str(integer) + ' is prime'
return arr
这是做同样的事情,但现在循环已经转移到理解中。 else
也是多余的。