Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于早期输入数据类型打印的额外行_Python_Python 3.x_While Loop - Fatal编程技术网

Python 基于早期输入数据类型打印的额外行

Python 基于早期输入数据类型打印的额外行,python,python-3.x,while-loop,Python,Python 3.x,While Loop,我的问题是这个程序如何处理意外输入。除非输入字符串,否则它似乎工作正常 当一个人向硬币中输入一个字符串时,会出现消息“请输入一个有效的输入”,并再次运行main,这是预期的。然后,当硬币中的一个金额输入正确时,程序会输出正确的输入,但每次输入错误的字符串时,程序似乎都会“记住”并打印“感谢您的惠顾,您已支付:0 CAD”。因此,例如,将发生以下终端会话: 请选择硬币的硬币价值(不允许使用硬币):asd 请输入有效的输入 请选择硬币的硬币价值(不允许使用硬币):嗯 请输入有效的输入 请选择硬币的硬

我的问题是这个程序如何处理意外输入。除非输入字符串,否则它似乎工作正常

当一个人向硬币中输入一个字符串时,会出现消息“请输入一个有效的输入”,并再次运行main,这是预期的。然后,当硬币中的一个金额输入正确时,程序会输出正确的输入,但每次输入错误的字符串时,程序似乎都会“记住”并打印“感谢您的惠顾,您已支付:0 CAD”。因此,例如,将发生以下终端会话:

请选择硬币的硬币价值(不允许使用硬币):asd
请输入有效的输入
请选择硬币的硬币价值(不允许使用硬币):嗯
请输入有效的输入
请选择硬币的硬币价值(不允许使用硬币):100
感谢您的惠顾,您已支付:100加元
感谢您的惠顾,您已支付:0加元
感谢您的惠顾,您已支付:0 c CAD

我只想看到关于100c的声明我不明白是什么导致代码“记住”字符串输入。下面是代码,我真的很难理解为什么会发生这种情况。当运行
coinamount()
中的else语句时,程序是否应该像我刚刚运行代码一样有效地“重新启动”,因为用户输入将被重新分配一个新的提示

coins = [0, 5, 10, 25, 100]

def coinamount(total):
    coin = (input("Please select a coin value in pennies (No toonies   allowed): "))

    if coin == "q":
        print("Quitting...")

    elif coin.isnumeric():
        coin = int(coin)
        total += coin

    else:
        print("Please enter a valid input")
        main()

    return total


def verification(coin):
    if coin in coins:
        print("Thank you for your patronage, you paid:", coin, "c CAD")

    elif coin == 200:
        print("I told you we don't accept toonies...")
        main()

    else:
        print("Please enter a valid coin amount")
        main()


def main():
    tab = 0
    tabplus = coinamount(tab)
    verification(tabplus)

main()

您正在混淆循环和递归。当您的程序现在运行时,它正在执行以下操作:

main()
 |
 ---> coinamount()
        |
        ---> main()
              |
              ---> coinamount()
                     |
                     ---> ...
这不是你想要的。有点不清楚您的程序应该做什么,但我可以想象它是一个更重要的
main
调用
coinamount
coinamount
循环,直到它得到一个有效输入并将该有效输入返回到
main

如果您希望main继续运行直到用户按下q,那么也可以在main中添加一个循环

一种可能的实施方式如下:

coins = [0, 5, 10, 25, 100]

def coinamount(total):
    while True:
        coin = (input("Please select a coin value in pennies (No toonies allowed): "))
        if coin == "q":
            print("Quitting...")
            return coin
        elif coin.isnumeric():
            coin = int(coin)
            total += coin
            return total
        else:
            print("Please enter a valid input")

def verification(coin):
    if coin in coins:
        print("Thank you for your patronage, you paid:", coin, "c CAD")
    elif coin == 200:
        print("I told you we don't accept toonies...")
    else:
        print("Please enter a valid coin amount")


def main():
    tabplus = coinamount(0)
    while tabplus != "q":
        verification(tabplus)
        tabplus = coinamount(tabplus)

main()
这是因为您(错误地)对任务使用了递归。请不要。