我必须确定列表中的所有数字是否都是素数,然后根据结果返回布尔“True”或“False”语句。我在for循环中做了一些条件语句,看看数字是否为素数。
以下是代码:
def all_primes(xs):
is_prime = None
for i in xs:
if i < 2:
is_prime = False
return is_prime
break
elif (i % 2 == 0) and (i % i == 1):
is_prime = False
return is_prime
break
else:
is_prime = True
return is_prime
问题是,我在Python Visualizer中看到了这一点,for循环在检查列表中的第一个值后停止迭代。我不明白为什么语法与我过去使用的循环相同。
我插入了一些示例值,例如:all_primes([5,2,11,37])
或all_primes([5,2,4,37])
,返回值始终为true,因为5是列表中的第一个数字,也是唯一要迭代的数字。
为什么有任何想法?
答案 0 :(得分:4)
return
区块中有break
和if/else
,你应该摆脱它们。同样,return
中的else
应该在外面,或者只要他找到“素数”就会返回。
def all_primes(xs):
is_prime = None
for i in xs:
if i < 2:
is_prime = False
return is_prime
elif (i % 2 == 0):
is_prime = False
return is_prime
else:
is_prime = True
return is_prime
在此之后,你应该知道,你并没有真正检查质数。 这不是最有效的方式,但它明确如何:
def all_primes(xs):
def checkPrime(n):
if n < 2:
return False
for i in xrange(2, n):
if n%i == 0:
return False
return True
return all(map(checkPrime, xs))
编辑:
如果没有map
函数,您只需要使用for
循环进行迭代:
def all_primes(xs):
def checkPrime(n):
if n < 2:
return False
for i in xrange(2, n):
if n%i == 0:
return False
return True
for n in xs:
if not checkPrime(n):
return False
return True
答案 1 :(得分:1)
你应该反过来看问题。
如果你发现一个不是素数的数字你应该返回False,在你的循环结束后你应该返回True。