python-3.x - python中嵌套循环中的`break`跳过原始循环的下一次迭代
问题描述
我希望有一个简单的解决方案。我似乎无法理解为什么会发生这种情况。网上的一切都表明这不应该是我从 Python 3.8 看到的行为。
我正在 projecteuler.net 上解决问题 3。您必须找到一个巨大数字的素数分解,并将它们相乘。
我的想法是首先找到小于原始数字一半的每个因子(不相关,但这在数学上有效并且可以节省时间)。然后我会简单地遍历因子列表以删除任何不是素数的。
当我遇到任何不是素数的因素时,我会使用一个 break 来退出嵌套循环,该循环会检查并删除非素数,但它随后也会完全跳过检查下一个因素。本质上,它的行为类似于continue
外循环上的语句。
我尝试了很多修改,包括尝试和例外,但没有什么能阻止break
跳过下一个因素。
这是带有额外打印功能的代码,用于调试目的:
import math as m
def prime_factor(n):
factors = []
for i in range(1,m.ceil(n/2)):
if n % i == 0:
factors.append(i)
print(factors)
for num in factors:
print('******', num, '******')
for i in range(2, num):
if num % i == 0:
print('NOT PRIME', num, 'NOT PRIME')
factors.remove(num)
break
print(factors)
return factors
prime_factors = prime_factor(100)
如果运行,这是该代码的输出:
[1, 2, 4, 5, 10, 20, 25]
****** 1 ******
****** 2 ******
****** 4 ******
NOT PRIME 4 NOT PRIME
****** 10 ******
NOT PRIME 10 NOT PRIME
****** 25 ******
NOT PRIME 25 NOT PRIME
[1, 2, 5, 20]
第一个列表包含所有因素。然后,它应该检查每个因素,但由于发现10不是因素,所以内循环被打破,然后在外循环中跳过20。
我真的希望有人发现这个问题足够有趣来帮助我解决它,因为除了尝试完全不同的方法之外,我不知所措。
感谢您的任何帮助。
解决方案
我可以看到问题是您指定的删除功能。
考虑这个
before remove: [1, 2, 4, 10, 20, 25] num : 4
after remove: [1, 2, 10, 20, 25] num : 4
您可以看到,在删除 4 之后, 10 采用它的索引(在本例中为 2)值,因此对于下一次迭代,它变为 20 而不是 10。
推荐阅读
- python-3.x - 无法使用装饰器打印结果
- angularjs - Angular 升级 - 如何从 Angular 模板导航到 Angularjs 中定义的状态?
- c# - 如何在类的方法中引用创建的类实例?
- ios - 无法让 Lambda 函数发回信息
- android - 使用 Rxjava 2 和 Retrofit 2 加载数据失败时应用程序崩溃
- c# - using 语句是否保留对它接收到的对象的引用?
- python - 删除 3rd 之后的所有内容。在 Python 中
- laravel - 过滤具有某些特定状态的事件
- reactjs - JWT LocalStorage 与 Cookie
- python - 如何在 Numpy getfromtxt 中指定 uint8 的数据类型?