【问题标题】:What is wrong with this code? Python 'while not' script这段代码有什么问题? Python'虽然不是'脚本
【发布时间】:2015-10-20 05:14:21
【问题描述】:

我想让程序检查代码是否是“w”、“W”、“d”或“D”,然后从那里引导用户,但事实上,它总是无效() 即使输入是“w”、“W”、“d”或“D”。而且我不想使用'while code is equal to 'w', 'W', 'd' or 'D' continue on',因为即使在程序运行时有效,它也会导致程序重新开始完成后从头开始。

另外,我不允许使用 if 语句做简单的方法

if code == 'W' or code == 'w' or code == 'D' or code == 'd':
    prevbalance = float(input('Enter your previous balance: $'))
else:
    invalid()

这里是问题区域:

code = input('Enter your transaction code: ')
while not code == 'W' or code == 'w' or code == 'D' or code == 'd':
    invalid()
prevbalance = float(input('Enter your previous balance: $'))

如果有帮助,这里是整个程序:

def invalid():
    input('Invalid transaction code. Please select another code.')
    main()

def deposit(prevbalance, amount, code):
    Wbalance = ''
    Dbalance = prevbalance + amount
    balance(Wbalance, Dbalance, code)

def withdrawal(prevbalance, amount, code):
    Dbalance = ''
    Wbalance = prevbalance - amount
    if amount > prevbalance:
        print('~~ERROR~~  You cannot withdrawal more than you have')
        input('           Please try a lower amount back at the main menu')
        main()
    else:
        balance(Wbalance, Dbalance, code)

def balance(Wbalance, Dbalance, code):
    if code == "W" or code == "w":
        print('Your new balance is: $',format(Wbalance, ',.2f'),)
    else:
        print('Your new balance is: $',format(Dbalance, ',.2f'),)

def main():
    name = input('Enter your name: ')
    ID = input('Enter your account ID: ')
    code = input('Enter your transaction code: ')
    while not code == 'W' or code == 'w' or code == 'D' or code == 'd':
        invalid()
    prevbalance = float(input('Enter your previous balance: $'))
    amount = float(input('Enter your transaction amount: $'))
    if code == "W" or code == "w":
        withdrawal(prevbalance, amount, code)
    elif code == "D" or code == "d":
            deposit(prevbalance, amount, code)

main()
input('Press ENTER to continue...')

【问题讨论】:

  • Invalid 函数应该将控制权返回给调用点,而不是调用main()
  • while code.lower().strip() not in 'wd'?
  • 查看此线程中的解决方案。 stackoverflow.com/questions/21122540/… input 关键字可能不是你想的那样

标签: python while-loop


【解决方案1】:

not 不会分布在您的所有条件中。您需要添加括号:

while not (code == 'W' or code == 'w' or code == 'D' or code == 'd'):

或者更好的是,使用in 运算符:

while code not in ('W', 'w', 'D', 'd'):

【讨论】:

  • while code not in 'WwDd': 也会接受wD ?
【解决方案2】:

在您的 while 条件下,not 只会否定 code=='W' 而不会否定其他条件。

所以你可能需要这样做:

while code not in ('W', 'w', 'D', 'd'):

【讨论】:

    【解决方案3】:

    这是一个运算符优先级问题。如下:

    while not code == 'W' or code == 'w' or code == 'D' or code == 'd':
    

    “not”运算符比“or”绑定得更紧密,所以它等价于:

    while (not code == 'W') or code == 'w' or code == 'D' or code == 'd':
    

    这不是预期的。你可以用括号来修复它:

    while not (code == 'W' or code == 'w' or code == 'D' or code == 'd'):
    

    或者使用德摩根定律:

    while code != 'W' and code != 'w' and code != 'D' and code != 'd':
    

    但我建议如下:

    while code not in ('W', 'w', 'D', 'd'):
    

    希望对您有所帮助。

    【讨论】:

    • 非常感谢!!我很困惑为什么它不起作用。我已经尝试过'!=',但是它也不起作用,尽管我可能把它弄错了。不管怎样,再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 2018-09-09
    相关资源
    最近更新 更多