Python 返回函数之外的值不会给出任何结果

Python 返回函数之外的值不会给出任何结果,python,function,return,primes,Python,Function,Return,Primes,仅供参考,这是我的第一个官方Python脚本。如果您需要上下文,这将在给定一个输入后最终计算第x个素数(我没有包括这一位,请不要被args部分混淆) 运行此代码时,我收到错误消息NoneType object not iterable。我在网上查看了一下,这个消息主要是在函数实际上没有返回任何内容时给出的。有人能帮我弄一下这个结构吗 最初,计数器,组合,和素数都是在函数外部定义的,并作为输入,但我改变了这一点,看看是否会有任何变化 我被告知这样的变量(全局?)不应该在函数内部设置。在代码中,您应

仅供参考,这是我的第一个官方Python脚本。如果您需要上下文,这将在给定一个输入后最终计算第x个素数(我没有包括这一位,请不要被
args
部分混淆)

运行此代码时,我收到错误消息
NoneType object not iterable
。我在网上查看了一下,这个消息主要是在函数实际上没有返回任何内容时给出的。有人能帮我弄一下这个结构吗

最初,
计数器
组合
,和
素数
都是在函数外部定义的,并作为输入,但我改变了这一点,看看是否会有任何变化


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

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


与您的代码一样,如果代码完成了for循环,并且没有转到任何return语句,那么它将在几个点中以None

Missing
break
的形式返回。此外,这项正在进行的工作在这一点上不是质数查找器,它将简单地查找偶数和奇数,因为循环是如何构造的

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

最好将所有重要参数传递到函数中,不要使用硬编码常量,这会使函数更加灵活

有关更有效的算法,请参阅:


在函数的底部,您不返回任何内容。因此,没有。如果你不想
None
返回,你需要返回一些东西。我想知道这个。。。我在“if”语句下有条件地返回了三个变量。这不是返回值的一种方法吗?是的,但是函数的其他退出点呢?Stephernauch说了什么。在函数末尾放入一个“dummy value”返回语句,其中包含已知值。如果这是返回的结果,则表示循环结束时If语句不为true。为什么要调用
prime\u func()
两次?第一次呼叫似乎没有用,因为您没有保存结果。好的,谢谢,我正在慢慢地弄清楚这一点。你知道为什么函数没有在我想要的地方退出吗?如果
args[1]
小于50,那么应该在某个点达到它,对吗?您提到args[1]==counter right?,可能是args[1]从不等于counter,或者该条件没有变为true。也可能是args[1]和counter具有不同的数据类型
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)
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))