python - Python无限循环与for else
问题描述
我正在编写一个计算素数的函数。我尝试使用嵌套在 while 循环中的 for-break-else 框架。但是,我得到了一个无限循环。我知道这else
不是正确的缩进。在我继续else
前进并使其与问题并行后for,
,问题就解决了。但是,我很难理解为什么else
块的原始位置会给我无限循环。有人可以帮我吗?谢谢。
def count_primes(num):
primes = [2]
x = 3
if num < 2:
return 0
else:
while x <= num:
for y in range(3,x,2):
if x%y ==0:
x += 2
break #jump out the for loop
else:
primes.append(x)
x +=2
return primes
解决方案
在您的函数中,您将变量 x 初始化为 3,但在 for 循环中,您将循环范围定义为从 y = 3 到 x = 3。您应该记住范围函数range(a,b)从a 到 ( b-1)。因此,您的循环试图循环 3 到 2,这是不可能的,因此您永远不会执行其中的代码。这就是为什么你有一个无限循环,因为它总是试图运行循环,然后不能,然后回到 while 循环,而不增加 x。
为了您的代码的目的,我会将 x 初始化为 5 以执行循环:
def count_primes(num):
primes = [2]
x = 5
if num < 2:
return 0
else:
while x <= num:
for y in range(3, x, 2):
if x % y == 0:
x += 2
break # jump out the for loop
else:
primes.append(x)
x += 2
return primes
但是经过测试,很明显您的代码不会给您正确的答案。用 num = 100 测试你的函数会得到以下结果,这是不正确的(例如 21 不是质数):
>>> count_primes(100)
[2, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 119, 121, 123, 125, 127, 129]
为了与您尝试实现的逻辑保持一致,这是返回列表或素数的另一种解决方案:
def count_primes(num):
if num <= 1:
return []
primes = [2]
x = 3
while x <= num:
is_prime = True
for prime_numbers in primes:
if x % prime_numbers == 0:
is_prime = False
break
if is_prime:
primes.append(x)
x += 2
return primes
用 num = 100 对其进行测试,可以得到低于 100 的素数的正确列表:
>>> count_primes(100)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
推荐阅读
- python-3.x - 根据条件填充多个数据框列中的空值
- python - Python 中的 ElasticNetCV 与 R 中的 cvglmnet
- azure-application-insights - 当两个不同的应用程序提供相同的版本时,连续导出如何工作?
- snowflake-cloud-data-platform - 变体列不存储具有 NaN 值的元素
- css - 如何使 Docusaurus 与本地 CSS 文件一起使用?
- javascript - 如何使用 mongoose 为已创建的文档编写子文档
- c# - 如何在 Unity 中显示一个概述的 GUI 框?
- python - 如何减少执行此三元组计数功能所需的复杂性/时间?
- reactjs - ReactJs 添加多个带上下文的减速器
- javascript - 如何使用 React 操作 HTML 元素并设置它们的样式