退出功能会给出无

时间:2018-05-21 02:59:56

标签: python function return primes

def prime_func():
    counter = 0
    composites = [2]
    primes = [3]
    for x in range(4, 50):
        for y in range(2, x):
            a = x/y
            if a - int(a) == 0:
                composites = composites + [x]
            else:
                primes = primes + [x]
                counter = counter + 1
                if counter == args[1]:
                    return counter, composites, primes
                else:
                    pass

prime_func()

counter1, composites1, primes1 = prime_func()

print(counter1)

仅供参考,这是我的第一个官方Python脚本。如果你想要上下文,一旦输入,这将最终计算第x个素数(我没有包含这个位,不要被args部分混淆)。< / p>

运行此代码时,我收到错误消息NoneType object is not iterable。我在线看了这个消息主要是在函数没有实际返回任何内容时给出的。有人可以帮我解决这个问题吗?

最初countercompositesprimes是在函数之外定义的,并作为输入提供,但我改变了这一点,看看是否会有任何变化。

我被告知这些变量(全局?)不应该在函数内部设置。

3 个答案:

答案 0 :(得分:1)

我假设在给定范围0 .. 49中没有足够的素数,因此中断条件counter == args[1]永远不会应用,并且函数返回None。

最好将所有重要参数传递给函数,不要使用硬编码常量,这样可以使您的函数更加灵活。

有关更高效的算法,请查看:https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

def is_prime(a):
    for y in range(2, a):
        if a % y == 0:  # the modulo operation finds the remainder after division
            return False
    return True

# pass end condition into function, args[1] is a global variable
def prime_func(max_value, max_prime_count=10): 
    # you don't need a counter len(primes) do the same, also counter should start a 1
    primes = [3]

    for x in range(4, max_value):
        if is_prime(x):
            primes.append(x)
            if len(primes) == max_prime_count:
                break  # max prime count reached

    # calculates composites by set operation
    composites = set(range(2, max_value)) - set(primes)
    # also works if max_prime_count is not reached
    return sorted(composites), primes


composites, primes = prime_func(50, 10)

print(composites)
print(primes)
print(len(primes))

答案 1 :(得分:0)

在您的代码中,您应该尝试在函数中的每个可能的出口点返回值。如果所有代码到达点并且没有返回或没有进一步操作,则它将返回为无

就像你的代码一样,如果代码完成了for循环并且它没有转到任何return语句,它将返回为None

答案 2 :(得分:0)

在几个地方缺少break。此外,这项正在进行的工作在这一点上不是一个素数查找器,由于循环的结构,它将简单地找到偶数和奇数。