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""):
我知道这看起来应该很简单,但此时我已经无计可施了。我已经在 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""):