Python:for循环中的错误

Python: Error in for loop

看,我今天开始学习Python,我陷入了困境。我正在解决一个非常简单的问题,我完成了它,但有一个问题。

首先,让我来谈谈这个问题和制约因素。问题是:

给定一个整数,n,执行以下条件操作:

  • 如果nodd,打印Weird
  • 如果neven且在2 to 5的包含范围内,打印Not Weird
  • 如果neven且在6 to 20的包含范围内,打印Weird
  • 如果neven且大于20,则打印Not Weird
  • 这是我的代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    n = input("")
    if n%2!=0 :
        print ("Weird")
    elif n%2==0 :
        for n in range(3,4,5) :
                print ("Not Weird")
    elif n%2==0 :
        for n in range(6,21) :
                print ("Weird")
    else :
        if (n%2==0 & n>20) :
            print ("Not Weird")

    我编译了代码,除了输入1820,一切都很好。我必须得到Weird作为输出,但我得到Not Weird。有人能帮我吗?


    你被要求专门用于循环吗?如果没有,你可以试试这个!

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    n = int(input(""))

    if n%2==1:
        print("Weird")
    elif n%2==0 and n in range(3, 6):
        print("Not Weird")
    elif n%2==0 and n in range(6, 21):
        print("Weird")
    elif n%2==0 and n>20:
        print("Not Weird")


    那么,让我们一行一行地浏览您的代码,看看在输入18的情况下会发生什么:

    1
    2
     if n%2!=0 :
         print ("Weird")

    18模数2等于0,因此无法达到此打印语句。

    下一步:

    1
    2
    3
     elif n%2==0 :
         for n in range(3,4,5) :
             print ("Not Weird")

    你好,这一个匹配!因此,执行for报表。在if/elif/else链中,不会达到值18的其他语句,因为您在这里找到了匹配项。

    然而,你不会看到你所期望的,因为for声明并不像你想象的那样。您认为它将查看n,对于列表[3,4,5]中的n值,将打印Not Weird值。

    这不是for所做的。相反,n将依次更改为范围内的每个值,循环内的代码将在n设置为该值的情况下执行。现在,你想知道为什么,如果是这样的话,你不会看到三次打印的Not Weird?原因是range是一个函数,它不返回所提供数字的列表,它返回一组从(在您的示例中)3开始到4结束的数字,但只取第五个数字。巧合的是,这使得range只有1个值(值3),这就是Not Weird只出现一次的原因。

    下面是您的代码的更正和注释版本:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if n%2 != 0:
        print ("Weird")
    else:
        #Don't need elif, there are only two cases odd, or not.
        #But, inside this branch we have three possibilities.
        if n in [2, 3, 4, 5]:
            #I just enumerate here, instead of using range.  You forgot about 2, BTW
            print ("Not Weird")
        elif n in range(6,21)
            # Note the use of if (or elif), not for.
            print ("Weird")
        else:
            print ("Not Weird")


    您提供的代码有很多问题。

    最明显的是,在if…else链的两个分支中重复了相同的条件。第二种情况,

    1
    2
    elif n%2==0:
        for n in range(6,21) :

    永远不会执行。

    此外,在这些分支中使用for循环是不正确的。这些应该是条件。当您想重复一个动作时,可以使用循环,但这里有一个变量,您想问一个关于它的问题。这是一个"如果":

    1
    2
    3
    elif n%2==0 :
        if n in range(3,4,5) :
                print ("Not Weird")

    但这导致了下一个bug,即使用range。如前所述,您要指定从3开始的数字范围,最多可运行4个(不包括在内),步骤为5。这就是包含3的范围。要指定从2到6的包含范围,您需要编写

    1
    2
    3
    elif n%2==0 :
        if n in range(2,7):
                print ("Not Weird")

    范围在底端包含,在顶端排除。乍一看,这似乎有点违反直觉,但在使用零索引时,这通常是您想要的。例如,您希望范围(10)有10个成员,并且以零开始,因此包含所有以10为基数的数字。你也可以这样写

    1
    2
    3
    elif n%2==0 :
        if 2 <= n <= 6:
                print ("Not Weird")

    这是我的偏好。


    你的主要问题是你在你的for循环中不断地重新定义n,因此在第一个for循环之后的每个条件语句中,你的n不是最初给出的。

    在您的两个n=18n=20案例中,第一个条件n%2!=0是错误的,因此测试第二个条件。n%2==0True,所以执行for n in range(3,4,5):循环。这个循环的第一次(也是唯一一次)迭代将n设置为3,并打印"不奇怪"。由于n现在是3,所以代码中的其余条件都不是True,因此它们不会执行。

    考虑到您的要求,以下内容将简单得多:

    1
    2
    3
    4
    5
    6
    7
    8
    def isweird(n):
        if n%2 or n in range(6,21):
            return 'Weird'
        if n in range(2,6) or n > 20:
            return 'Not Weird'

    for n in range(23):
        print(n, isweird(n))

    输出:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    0 None
    1 Weird
    2 Not Weird
    3 Weird
    4 Not Weird
    5 Weird
    6 Weird
    7 Weird
    8 Weird
    9 Weird
    10 Weird
    11 Weird
    12 Weird
    13 Weird
    14 Weird
    15 Weird
    16 Weird
    17 Weird
    18 Weird
    19 Weird
    20 Weird
    21 Weird
    22 Not Weird

    您的范围(3、4、5)有问题。列表(范围(3,4,5))是[3]。。可能不是您期望的…范围是开始、停止、步骤。

    您可以在[3,4,5]或范围(3,6)中对n执行此操作。


    你有两个条件相同的elif,它不应该。更改或删除一个elif

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    n = input("")
    if n%2!=0 :
        print ("Weird")
    elif n%2==0 :
        if n>20:
            print ("Not Weird")
        for n in range(3,4,5) :  #range shouldn't be like this. But for your understanding i leave it as it is
                print ("Not Weird")
        for n in range(6,21) :
                print ("Weird")

    最后的其他也不需要