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
。我在线看了这个消息主要是在函数没有实际返回任何内容时给出的。有人可以帮我解决这个问题吗?
最初counter
,composites
和primes
是在函数之外定义的,并作为输入提供,但我改变了这一点,看看是否会有任何变化。
我被告知这些变量(全局?)不应该在函数内部设置。
答案 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
。此外,这项正在进行的工作在这一点上不是一个素数查找器,由于循环的结构,它将简单地找到偶数和奇数。