使用 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)
我将要执行一个函数,其目的是 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 你必须加 1n > 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)