为什么这个程序不止一次地打印消息?

Why does this program print the message more than once?

我是编程新手,我编写了一个简单的程序来确定用户输入的数字是偶数还是奇数。我还做了一个函数来检查输入的数字是否是整数而不是浮点数。

如果用户键入一个数字,该程序大部分都能正确执行,但如果用户首先输入多个浮点数,则该数字是奇数还是偶数的消息会打印多次。为什么会这样?

def check_int(x,y):
    if x != int(x):
        print "The number is not an integer"
        y()
    else:
        print "The number is an integer"

def even_odd():
    given_number = input("Please type an integer: ")
    check_int(given_number, even_odd)
    if (given_number % 2) != 0:
        print "The number is odd"
    elif (given_number % 2) == 0:
        print "The number is even"

even_odd() 

问题是您使用了神秘版本的递归来循环您的程序。当你收到一个浮点数时,你调用check_int,打印消息,然后递归到输入函数。这会使您在堆栈上的第一个调用挂起 return。当你最后得到一个整数时,你正常离开check_int,但是随后return变为even_odd,它仍在等待处理浮点数的奇偶校验。这就是产生额外输出行的原因。

当您拒绝某些内容作为 non-integer 时,您需要循环回到输入,否则避免稍后检查奇偶校验。

def check_int(x,y):
    return x != int(x)

def even_odd():
    given_number = input("Please type an integer: ")
    if check_int(given_number, even_odd):
        print "The number is not an integer"
    else:
        print "The number is an integer"
        # Check parity
        if (given_number % 2) != 0:
            print "The number is odd"
        elif (given_number % 2) == 0:
            print "The number is even"

even_odd()

如果您想循环直到得到一个整数,请将其写成一个单独的外部循环。

even_odd 再次从 check_int 中调用(在名称 y 下)。这就是为什么你会多次看到它的输出。

我想您认为这是在 check_int 完成后继续 even_odd 所必需的。这是没有必要的。当一个函数完成时,程序会自动从调用该函数的地方继续。

只需从 check_int 中删除 y 参数,删除行 y() 并将 check_int(given_number, even_odd) 更改为 check_int(given_number)

您的代码存在一些问题。

首先,您不需要 elif。如果 given_number % 2 !=0 为假,则相反的条件将始终为真。所以 != 0 的反义词是 0.

另外,不要将函数作为回调传递。您编写它的方式可能会使您的程序崩溃。我建议你阅读更多关于 loops.

的内容

干杯!