为什么我不应该在Python中将“ else”和“ if”置于同一级别

问题描述

当我将其他级别与if放在同一级别时,当我调用函数时该程序无法正常工作。 (jupyter笔记本中的小星星)。但是当我将“ else”拉低一个级别时,一切都还好。该函数旨在返回存在并包含给定数字的质数的数量。这是我的代码

def count_primes(num):

    primes = list(range (3,num,2))

    digit = 3

    if num < 2:
       return 0

    while digit <= num:
          for x in range (3,digit,2):
        
              if digit % x == 0:
                 primes.remove(digit)
                 digit += 2
                 break
          else:
                 digit += 2

    primes.insert(0,2)

print (primes)   
return len(primes)  

解决方法

这是因为您不想在for循环中获取else。您只需要返回一次质数。

例如,如果我编写程序只是为了检查数字是否为质数-

    if num > 1:
   # check for factors
   for i in range(2,num):
       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 num > 1:
   # check for factors
   for i in range(2,"is a prime number")

PS:如果人数不超过一个,我将不包括在内。

我不想打印数字不是素数。因为如果将else放入循环中,它将在每次失败时运行。

,

首先考虑if和else符合的情况。当您的数字为3时,永远不会输入for循环。回想一下,对于范围(起点,终点,步长),起点是包含在内的,终点不是包含在内的。您要告诉您的程序从3开始并且不包括3结束。您的初始程序将检查3

另一方面,如果将else与for放在一行,然后跳过for循环的内部,对于digit = 3,它将执行。似乎似乎并没有玩弄它,您可以完全跳过else子句,而只将其作为数字+ = 2。

总而言之,如果您的初始代码从3或更大的质数开始(如果语句将始终失败,则将导致相同的问题),则您的初始代码将永远不会迭代“数字”。而将其拉回一个级别将确保始终对数字进行迭代,而不管它是3还是更大的素数。

def count_primes(num):

    # Changed it to num + 1 so that it includes num value in output if it is prime.
    primes = list(range (3,num + 1,2))

    digit = 3

    if num < 2:
        return 0

    while digit <= num:
        for x in range (3,digit,2):
        
            if digit % x == 0:
                primes.remove(digit)
                digit += 2
                break
        digit += 2

    primes.insert(0,2)

    print (primes)   
    return len(primes)