使用 for 和 while 循环编写质数函数的最 pythonic 方法是什么?

Which is the most pythonic way for writing a prime number function using for and while loop?

我将要执行一个函数,其目的是 return 一个 Prime/Not 质数语句,如果它的参数是或不是质数。我使用 for 循环成功了:

def prime1(n):

z = []

for i in range (1, n+1):
    if (n/i).is_integer():
        z.append(i)
        i=i+1

if len(z) == 2:
    print ("Prime")
else:
    print ("Not prime")`

然后我尝试做同样的事情,但使用了 while 循环:

def prime2(n):

z = []
i = 1

while i < int(len(range(1, n+1))):
    if (n/i).is_integer():
        z.append(i)
        i=i+1

if len(z) == 2:
    print ("Prime")
else:
    print ("Not prime")

不幸的是,我的系统继续计算而没有打印输出。

你能解释一下我哪里做错了吗?

i = i + 1 在你的 for 循环中什么都不做,因为 i 的值被迭代器的下一个值覆盖;实际上,for 循环在 每次 迭代中为您执行 i = i + 1,无论 i 是否划分 n。您需要在 while 循环中做同样的事情:

while i < n + 1:
    if (n/i).is_integer():
        z.append(i)
    i = i + 1

您在 if 语句中递增可迭代变量 i,因此该变量永远不会递增,陷入无限循环。

当您使用 for 时,它起作用了,因为在块的每次完整迭代后,可迭代对象都会改变自身。

i 的增量向左移动一个标识块(在 while 内而不是 for 内)就可以了

代码改编自https://www.programiz.com/python-programming/examples/prime-number

你不需要检查直到 num ,如果你没有素数数据库,你可以 2 乘 2

import math
#num = 437
if num > 1:
    # check for factors
    for i in range(2, int(math.ceil(math.sqrt(num))), 2):
        if (num % i) == 0:
            print(num, "is not a prime number")
            print(i, "times", num // i, "is", num)
            break
    else:
        print(num, "is a prime number")

# if input number is less than
# or equal to 1, it is not prime
else:
    print(num, "is not a prime number")

如果我们不需要使用它们,我们的首选方法不应该是 while 循环,也就是说,我们可以使用列表理解:

def prime(n):
    z = []  
    [z.append(i) for i in range(1, n+1) if (n/i).is_integer()]
    [print("Prime") if len(z) == 2 else print("Not Prime")]

prime(101)

但是让我们循环一下您得到的 for 循环:

for i in range (1, n+1):
    if (n/i).is_integer():
        z.append(i)
        i=i+1

i = i + 行没有达到您想要的目的,循环将从 1 to n+1 开始迭代,无论

现在 while 循环:

while i < int(len(range(1, n+1))):
   if (n/i).is_integer():
       z.append(i)
       # i=i+1 does not go inside if statement
   i += 1

现在您确实需要递增 i,但是如果递增仅在满足 if 条件时发生,那么如果不满足 if 条件,您将卡在同一个 i 上循环。 也尝试使用 i += 1 意味着同样的事情

我能想到的最pythonic的方式如下:

def isPrime(n):
    return all(n % i for i in range(2, int(n ** 0.5) + 1)) and n > 1

for i in range(1, 20):
    print(isPrime(i))

解释:

  • all 确保给定表达式中的每个项目 returns True

  • n % i returns True if n != 0(允许偶数为负数)

  • int(n ** 0.5) 等同于 sqrt(n) 并且 range 总是 returns 数字直到 n - 1 你必须加 1

  • n > 1 确保 n 不是 1

您的代码中的问题是您的 i = i + 1 在错误的范围内
你的程序检查 (n/i).is_integer() which returns False as n / 2 是否不是整数

改进您的代码:

您可以使用 n % i == 0 而不是 (n/i).is_integer(),returns 余数等于 0
接下来你 必须 i = i + 1 放在外部范围

就我个人而言,我从来都不是 i = i + 1 的粉丝。使用 i += 1

我认为最好的方法是使用上面显示的代码。

希望对您有所帮助!

编辑:

你可以让它打印 'Prime' 或 'Not Prime' 如下:

def isPrime(n):
    print('Prime' if all(n % i for i in range(2, int(n ** 0.5) + 1))
                 and n > 1 else 'Not Prime')

for i in range(1, 20):
    isPrime(i)