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

时间:2017-02-02 00:56:06

标签: python python-2.7 recursion control-flow

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

如果用户键入数字,程序通常会正确执行,但如果用户首先输入多个浮点数,则会显示消息,告知数字是奇数还是打印多次。为什么会这样?

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() 

3 个答案:

答案 0 :(得分:2)

问题是你使用了一个神秘的递归版本来循环你的程序。当您收到浮动时,请拨打 check_int ,打印信息,然后重复输入功能。这会使您在堆栈上的第一次调用停止返回。当你最终获得一个整数时,你会正常地离开 check_int ,但是然后返回 even_odd ,它仍然在等待处理浮动的奇偶校验。这就是产生额外输出线的原因。

当你以非整数形式拒绝某些东西时,你需要循环回输入,或者以后避免检查奇偶校验。

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()

如果你想循环直到你得到一个整数,那就把它写成一个独立的外循环。

答案 1 :(得分:2)

even_odd再次从check_int内调用(名称为y)。这就是你多次看到它的输出的原因。

我认为您认为在even_odd完成后继续使用check_int是必需的。这不是必需的。函数完成后,程序将自动从调用函数的位置继续。

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

答案 2 :(得分:0)

您的代码存在一些问题。

首先,你不需要一个elif。如果given_number % 2 !=0为假,则相反的条件将始终为True。因此!= 0的反面是0

此外,不要将函数作为回调传递。你写它的方式可能会导致程序崩溃。我建议你阅读更多关于loops的内容。

喝彩!

相关问题