测试所有数字1到1000的另一个函数的函数

时间:2013-11-21 21:36:00

标签: python testing for-loop

我创建了一个名为number(x)的函数,它测试一个数字以查看数字是否完美。现在我的目标是创建一个测试器功能,测试从1到1000的所有数字并返回完美的数字。这是测试功能的代码:

def unittest():

    for i in range(0,1000):
        perfect(i)
        if True:
            return i

它不起作用,但我认为我很接近。有什么建议或帮助吗?

2 个答案:

答案 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,依此类推,直到您完成为止。该教程解释了这一点比单个段落更好。