我创建了一个名为number(x)
的函数,它测试一个数字以查看数字是否完美。现在我的目标是创建一个测试器功能,测试从1到1000的所有数字并返回完美的数字。这是测试功能的代码:
def unittest():
for i in range(0,1000):
perfect(i)
if True:
return i
它不起作用,但我认为我很接近。有什么建议或帮助吗?
答案 0 :(得分:2)
我认为你的意思是这个,并注意range
的正确参数,以及我们如何使用列表累积所有结果 - 否则,该函数将仅返回一个值!
def unittest():
ans = []
for i in range(1, 1001):
if perfect(i):
ans.append(i)
return ans
或者,不推荐(它是多余的),您可以测试返回的值是否为True
:
def unittest():
ans = []
for i in range(1, 1001):
if perfect(i) is True :
ans.append(i)
return ans
另一个替代方案是使用list comprehensions,这比使用显式循环更惯用且可能更快:
def unittest():
return [i for i in range(1, 1001) if perfect(i)]
答案 1 :(得分:1)
当你return
时,这就是你职能的终结。如果你想要返回所有的完美数字,你必须跟踪它们并最后将它们全部归还。
最重要的是,您的if True:
表示您将返回0
是否完美。
所以,你需要做的是:
def unittest():
results = []
for i in range(1000):
if perfect(i):
results.append(i)
return results
实际上 是一种通过使用yield
代替return
来解决此问题而无需构建列表的方法。这对你来说可能太先进了,但我还是要解释一下。首先,这是代码:
def unittest():
for i in range(1000):
if perfect(i):
yield i
有关详细信息,请参阅Iterators上的教程部分以及以下两部分。但基本上,yield
就像return
一样不会返回。您的函数实际返回的不是列表,而是生成器。如果有人然后遍历该生成器,它将通过您的函数直到第一个yield
,然后一直持续到下一个yield
,依此类推,直到您完成为止。该教程解释了这一点比单个段落更好。