Python函数检查数字是否为质数。

3
def is_prime(num):
    lst = []
    if num > 1:
        pass
    else:
        return False
    for number in range(0, 1000000+1):
        if str(num) in str(number):
            continue
        elif str(1) in str(number):
            continue
        elif str(0) in str(number):
            continue
        lst.append(number)
    for x in lst:
        if num % num == 0 and num % 1 == 0 and not(num % x == 0):
            return True
        else:
            return False

print(is_prime(9))

我不知道我的代码哪里出了问题,也找不到解决方案。程序的目的是检查一个数是否为质数(质数只能被1和它本身整除)。for循环似乎根本没有起作用。


1
你为什么要把所有东西都转换成字符串?(使用 str() - Grismar
2
虽然这样做可以工作,@JohnD,但将lambda表达式分配给变量是一种不好的实践。如果需要,请使用def - Grismar
1
任何数除以1的余数始终为0,因此您在for循环中的条件将保持为真。 - sahasrara62
1
@JohnD 在 StackOverflow 上为了方便短帖而教授不良习惯有点毫无意义,因为这违背了 StackOverflow 的初衷,您同意吗? :) - Grismar
1
Guido van Rossum是Python的创始人,他实际上想在Python 3中删除lambda。他是将reduce移动到functools后面的主要原因。 - juanpa.arrivillaga
显示剩余8条评论
4个回答

7
def isprime(n):
    return (all([False for i in range(2,n) if n % i == 0 ]) and not n < 2)
    
print (isprime(0))
print (isprime(1))
print (isprime(2))
print (isprime(3))
print (isprime(9))
print (isprime(10))
print (isprime(13))

输出:

False
False
True
True
False
False
True

或者:

def isprime(n):

    if n < 2: return False

    for i in range(2, n):
        if n % i == 0:
            return False
    else:
        return True

3
第一个版本认为2不是质数,而第二个版本认为0和1是质数。 - Alain T.
谢谢,我已经更正了(一开始没有包括那些,但你是对的!) - Synthase

3

第16-19行:

if num % num == 0 and num % 1 == 0 and not(num % x == 0):
    return True
else:
    return False

第一个语句num % num == 0是找到当numnum除以时的余数,由于余数总是零,因此该语句始终为真。 num % 1 == 0也始终为真,因此您的代码等效于:

if not(num % x == 0):
    return True
else:
    return False

在程序的上下文中,“如果lst中第一个值不是num的因数,那么num是质数。否则,num不是质数。”
这只运行了一次循环并且方向相反。相反,您需要检查其中一个数字是否为lst的因子来返回False,并且如果lst中所有数字都不是因子,则返回True。
for x in lst:
    if num % x == 0:
        return False
return True

2
for x in lst:
    if num % num == 0 and num % 1 == 0 and not(num % x == 0):
        return True
    else:
        return False

这个循环只会执行一次,因为在第一次迭代时它保证会返回true或false。如果你找到了任何因子,你就想返回False。否则,返回True

for x in range(2, num):
    if num % x == 0:
        return False
return True

(此外,我不确定 strnum % num / num % 1 条件的作用是什么,因为它们总是为零。但这些都应该是不必要的)


严格来说,您不必让范围在num-1处停止,因为Python的范围不包括范围内的最后一个数字。 为了提高速度,您还可以将范围设为range(2:int(math.sqrt(num)+1)) - goalie1998
啊,我总是记不住哪些语言具有包含范围,哪些语言没有。谢谢你指出来! - Silvio Mayolo

2
除了2本身,您只需要检查从3到该值的平方根之间的奇数是否可以整除该值。
以下是简短版本:
def isPrime(N): 
    return all(N%p for p in range(3,int(N**0.5)+1,2)) if N>2 and N&1 else N==2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接