Python:如果似乎满足条件但未触发

Python: If condition appears to be met but isn't triggering

我知道这看起来应该很简单,但此时我已经无计可施了。我已经在 python 中编写了一个计算器,但由于某种原因,结尾的 if-else 语句仅触发 else 段。

import sys
import re

#setting values
x = 0
n = '+'
y = 0
#valid input flag
valid = True
#continue operations flag
run = True
again = "k"

#addition function
def add(x, y):
    return x + y

#subtraction function
def subtract(x, y):
    return x - y

#multiplication function
def multiply(x, y):
    return x * y

#division function
def divide(x, y):
    return x / y

#continuation loop
while run == True:
    #Prompt for and accept input
    equation = raw_input("Please insert a function in the form of 'operand' 'operator' 'operand' (x + y): ")
    equation.strip()
    #Divide input into 3 parts by spaces
    pieces = re.split('\s+', equation)

    #set part 1 = x as float
    x = pieces[0]
    try:
        x = float(x)
    except:
        print "x must be a number"
        valid = False

    #set part 2 = operator
    if valid == True:
        try:
            n = pieces[1]
        except:
            print "Please use valid formating (x [] y)."
            valid = False

    #set part 3 = y as float
    if valid == True:
        y = pieces[2]
        try:
            y = float(y)
        except:
            print "y must be a number"
            valid = False

    #If input is valid, do requested calculations
    while valid == True:
        if n == '+' :
            print equation + " =", add(x,y)

        elif n == '-' :
            print equation, " =", subtract(x,y)

        elif n == '*' :
            print equation, "*", y, " =", multiply(x,y)

        elif n == '/' :
            if y == 0:
                print "You cannot divide by zero."

            else:
                print equation, " =", divide(x,y)

        else:
            print "Please use an appropriate operator ( + - * / )."

#play again
    again = raw_input("Play again? ")
    print again

    if again == ("yes", "y", "YES", "Yes","yes"):
        run = True
        print "yes'd"

    else:
        print "no'd"
        run = False

当我 运行 这段代码时,我遇到了两个不同的问题: 如果我输入一个有效的输入(即:2 + 2),那么我的输出是

"2 + 2 = 4.0"

"2 + 2 = 4.0"

"2 + 2 = 4.0"

永远重复。

如果输入无效,我会收到 "Play again? " 提示,但是 无论我输入什么,else 语句都会触发。 (例如,如果我在 "Play again? " 中输入 "yes",它将打印: "yes"(<-- 这是来自 "print again" 行) "no'd" (<-- 这是来自 "else: print "no'd" )

目前我不知道如何解决这两个问题中的任何一个,因此将不胜感激。

编辑:谢谢大家,我希望我能勾选你们所有人帮助我理解我做错的不同事情。

while valid == True:中,你永远不会改变valid的值,所以它总是True并且循环是无限的。我不明白为什么它甚至是一个循环 - 将它更改为 if 就像它上面的块一样,它会按预期运行。

此外,在 if again == ("yes", "y", "YES", "Yes","yes"): 中,将 == 更改为 in,它将按预期运行。

也许您应该替换此代码:

while valid == True:
    if n == '+' :
        print equation + " =", add(x,y)

    elif n == '-' :
        print equation, " =", subtract(x,y)

    elif n == '*' :
        print equation, "*", y, " =", multiply(x,y)

    elif n == '/' :
        if y == 0:
            print "You cannot divide by zero."

        else:
            print equation, " =", divide(x,y)

    else:
        print "Please use an appropriate operator ( + - * / )."

有了这个...

if valid:

或者...

while valid == True:
    # Insert your previous code here.
    break

您也可以在循环的底部简单地将 valid 设置为 false。那行得通。

我认为在这种情况下有效总是正确的。您还编写了 while valid 为 true,这意味着它将不断迭代循环,直到 valid 等于 false。似乎在 while 循环的这段代码中,valid 没有切换为 false。

while valid == True: 应该是 if valid == True

第二个问题:

if again == ("yes", "y", "YES", "Yes","yes"): 应该是:

again = again.lower();
if again == "yes" or again == "y":

你的回答是循环的因为

while valid == True:

用 if 语句替换循环


你得到 "no'd" 因为

if again == ("yes", "y", "YES", "Yes", "yes"):

这里你将字符串等同于元组,而不是检查字符串是否包含在元组中。试试这个:

if again in ("yes", "y", "YES", "Yes""):