【问题标题】:for looping in python 3 not doing what I want it to do在python 3中循环没有做我想做的事
【发布时间】:2017-01-30 19:15:56
【问题描述】:

我尝试为我的小孩编写此代码来练习简单的数学 我想给用户解决 3 个问题,但程序运行随机次数的问题。我做错了什么? 谢谢

import random

for i in range(3):             # number of problems          

    for n in range(999):
        num1 = random.randrange(11)
        num2 = random.randrange(11)
        if num1<num2:
            break
        else:
            sum = eval(input("how much is {} - {} = ".format(num1,num2)))
            if sum == num1 - num2:
                print ("Good job!")
                break      

        for x in range(5):           #nr of wrong tries     
            if sum != num1 - num2:
                sum = eval(input("Try again {} - {} = ".format(num1,num2)))
            else:
                print ("Good job!")
                break

【问题讨论】:

  • 你没有解释你的问题是什么。您希望您的程序做什么,而它正在做什么?
  • 嗨,就像我说的那样,我希望程序向用户提供 3 个不同的问题,如下所示:2-2 有多少= 3-2 有多少= 6-1 有多少=但它会给出 2 个或 1 个或 0 个问题,有时还会给出 3 个问题
  • 如果 num1 &lt; num2 为真,您将跳出内部 for 循环,因此它会运行 3 个或更少的问题。使用continue 而不是break,或者更好的是,使用while 循环。 while 循环用于循环直到满足条件,而for 循环用于知道要循环多少次。

标签: python python-3.x for-loop


【解决方案1】:

以下应该可以工作

import random

for i in range(3):             # number of problems          
    num1 = random.randrange(11)
    num2 = random.randrange(11)

    while num1<num2:
        num1 = random.randrange(11)
        num2 = random.randrange(11)

    sum = input("how much is {} - {} = ".format(num1,num2))

    for x in range(5):           #nr of wrong tries     
        if sum != num1 - num2:
            sum = input("Try again {} - {} = ".format(num1,num2))
        else:
            print ("Good job!")
            break

我刚刚用while 替换了不需要的for 循环和if 语句。

【讨论】:

  • 对你所做的事情的更多解释将对提问者有用。
【解决方案2】:

您的主要问题是程序的结构,它令人困惑,这就是您在这里的原因,而且容易出错,也是您在这里的原因。

试试这样的伪代码:

loop three times
  num1 = -1
  num2 = 0
  while(num1 < num2)
    assign random numbers to num1 and num2
  end loop

  input = ask user what num2 - num1 is

  if input == num2 - num1
    print 'yay'
  else
    print 'boo'
  end if

end loop

这会清理一切并消除这些中断。

【讨论】:

    【解决方案3】:

    如果num1 &lt; num2 为真,您将跳出内部for 循环,因此它将运行3 个或更少的问题,具体取决于num1 &lt; num2True 的次数。最快的解决方法是将break 块内的break 更改为continue

    但是,当你不知道要循环多少次,只想在满足某个条件时停止时,最好使用while 循环。在您的情况下,您想循环到num1 &gt; num2,然后提出问题。

    更好的解决方案是生成一个介于 1-10 之间的随机数 num1,然后生成一个介于 0-num1 之间的随机数 num2,这将始终确保 num1 大于 @987654334 @。

    最后的笔记:

    • 使用int 将输入转换为整数,而不是eval
    • sum 是一个内置函数,因此请使用其他名称,以免影响它。

    这是一个有效的例子:

    import random
    
    for i in range(3):
        num1 = random.randrange(1, 11)  # Has to be greater than 0 so num2 can be less.
        num2 = random.randrange(num1)
    
        # Use 'int' to convert to int, not 'eval'!
        # Also, 'sum' is a built-in function. Don't shadow it, use another name.
        result = int(input("how much is {} - {} = ".format(num1, num2)))  
    
        for x in range(5):  # nr of wrong tries     
            if result != num1 - num2:
                result = int(input("Try again {} - {} = ".format(num1, num2)))
            else:
                print("Good job!")
                break
    

    您可以通过添加try-catch 块来对此进行扩展,以确保输入确实是一个数字。如果您输入除数字以外的任何其他内容,程序将崩溃。 Here 是验证输入的方法。

    【讨论】:

    • 感谢您的回复 Ted Klein Bergman,您的回答很到位,信息量很大,并且按我的预期工作,谢谢
    猜你喜欢
    • 2020-11-26
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多