Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回意外值的素数的Python while循环_Python - Fatal编程技术网

返回意外值的素数的Python while循环

返回意外值的素数的Python while循环,python,Python,我试图找到列表中最大的素数(升序)。我创建了一个while循环,它通过将列表中的一个数字除以每个小于自身的数字来检查该数字是否为素数,并在找到一个因子不小于自身(大于1)的数字时“中断”循环。此循环嵌套在另一个while循环中,该循环向后遍历列表 当我运行代码时,它不断返回数字8(显然不是素数) 我试着在纸上一步一步地阅读代码,插入变量值并进行数学运算。我一定是算错了什么 factors = [2, 3, 4, 6, 8] b = 1 y = len(factors) - 1 x = facto

我试图找到列表中最大的素数(升序)。我创建了一个while循环,它通过将列表中的一个数字除以每个小于自身的数字来检查该数字是否为素数,并在找到一个因子不小于自身(大于1)的数字时“中断”循环。此循环嵌套在另一个while循环中,该循环向后遍历列表

当我运行代码时,它不断返回数字8(显然不是素数)

我试着在纸上一步一步地阅读代码,插入变量值并进行数学运算。我一定是算错了什么

factors = [2, 3, 4, 6, 8]
b = 1
y = len(factors) - 1
x = factors[y]
z = x - b

while y >= 0:
    while b < x:
        if x % z == 0:
            break
        else:
            if b == x-1:
                print(f'The number {x} is the largest prime in the list')
                break #need to end the outer loop here
            else:
                b +=1   
    y -= 1
    b = 1
print('There were no prime numbers in the list')

你能查一下下面的代码吗

def prime_numbers(numbers):
    for i in numbers:
        for j in range(2, i):
            if i % j == 0:
                break
        else:
            yield i


try:            
    print(f"{max(prime_numbers([2, 3, 5, 6, 8]))} is the largest prime number.")
except ValueError:
    print("There are no prime numbers in the list.")

代码中的几个主要问题:

  • 您没有在每次迭代中更新
    x
    (外循环)和
    z
    (内循环)的值。您将要为
    z
    添加:
  • 其他:
    b+=1
    z=x-b
    
    对于
    x

    y-=1
    x=系数[y]
    b=1
    
  • 这个任务有那么多的变量,这使得阅读和理解起来很困难。例如,您可以一起去掉
    z
    ,只需从2开始
    b
    ,然后向上

  • 由于两个循环都在一个已知范围内迭代(列表中的外部循环,内部循环直到
    x
    ),因此最好对
    循环使用
    ,而不是
    while
    。这也将更好地安排变量。例如:

  • factors=[2,3,4,6,8]
    对于系数[:-1]中的数字:
    对于范围内的b(2,编号):
    如果编号%b==0:
    打破
    elif b==数字-1:
    print(f'number{number}是列表中最大的素数')
    break#您应该将整个代码放在一个函数中,然后返回此处
    print('列表中没有素数')
    
    请注意,除了循环定义的变量外,我们不使用任何其他变量。这使代码更具可读性

    因子[:-1]
    意味着我们正在以相反的顺序循环列表


    python的一个很好的小特性是添加一个。仅当循环耗尽而未满足任何
    break
    语句时,才会执行此
    else
    。这在我们的例子中是完美的,因为如果内部循环耗尽,那么这个数字肯定是一个素数。因此,它可以是:

    factors=[2,3,4,6,8]
    对于系数[:-1]中的数字:
    对于范围内的b(2,编号):
    如果编号%b==0:
    打破
    其他:
    print(f'number{number}是列表中最大的素数')
    中断#这将中断外部循环
    其他:
    print('列表中没有素数')
    

    请注意,在外循环中也使用了相同的技术,就好像内循环耗尽而未命中
    else
    块中的
    中断
    ,这意味着找不到素数,所以我们要打印找不到的消息。

    既然可以使用
    print
    s或调试器,为什么要在纸上打印呢?因为我在自学,不知道这些选项。是否有建议的资源让我开始?在每次迭代开始时为所有变量添加
    print(x)
    (将
    x
    更改为所需的变量)。不管怎样,您的问题之一是在每次迭代时更新
    y
    b
    ,而不是
    x
    ,您确定要将
    z
    设置为7吗?这意味着在第一个模中只考虑7的倍数check@MikeSperry如果我们要进行优化,那么在
    sqrt(x)
    之前检查就足够了,而不是
    x/2
    谢谢您的详细解释和建议。我最初尝试使用for循环,但我必须在代码中的某个地方退出,因为它没有按预期工作。我欣赏你所有的示例代码;“我现在要回去自己玩了。”撒拉比尔,非常欢迎你!很高兴能为您提供帮助,我希望这将使您步入正确的改进轨道:)
    def prime_numbers(numbers):
        for i in numbers:
            for j in range(2, i):
                if i % j == 0:
                    break
            else:
                yield i
    
    
    try:            
        print(f"{max(prime_numbers([2, 3, 5, 6, 8]))} is the largest prime number.")
    except ValueError:
        print("There are no prime numbers in the list.")