6

我正在 codecademy 上学习 python,我目前的任务是:

编写一个函数,shut_down,它接受一个参数(你可以使用任何你喜欢的东西;在这种情况下,我们将使用 s 作为字符串)。当它得到"Yes""yes""YES"作为参数并且"Shutdown aborted!"时, shut_down 函数应该返回"Shutting down... " 当它得到"No""no""NO"时。

如果它得到的不是这些输入,该函数应该返回“对不起,我不明白你”。

对我来说似乎很容易,但不知何故我还是做不到。

我为测试该功能而编写的代码:

def shut_down(s):
    if s == "Yes" or s == "yes" or s == "YES":
        return "Shutting down..."
    elif s == "No" or "no" or "NO":
        return "Shutdown aborted!"
    else:
        return "Sorry, I didn't understand you."

i = input("Do you want to shutdown?")
print(i) #was to test the input
print(shut_down(i)) #never returns "Sorry, I didn't understand you"

它适用于“否”和“是”,但不知何故,如果我在任何“是”之前放置一个空格,或者即使我只是输入“a”,它也会打印“关机中止!” 虽然它应该打印“对不起,我不明白你”。

我究竟做错了什么?

4

3 回答 3

12

你忘了写s == "no"你的第一个elif:

def shut_down(s):
    if s == "Yes" or s == "yes" or s == "YES":
        return "Shutting down..."
    elif s == "No" or "no" or "NO":             # you forgot the s== in this line
        return "Shutdown aborted!" 
    else:
        return "Sorry, I didn't understand you."

做这个:

def shut_down(s):
    if s == "Yes" or s == "yes" or s == "YES":
        return "Shutting down..."
    elif s == "No" or s == "no" or s == "NO":       # fixed it 
        return "Shutdown aborted!"
    else:
        return "Sorry, I didn't understand you."

这是因为:

elif s == "No" or "no" or "NO":  #<---this
elif s == "No" or True or True:  #<---is the same as this

由于这是公认的答案,我将详细说明以包括标准做法:比较字符串的约定不考虑大小写(equalsIgnoreCase)是这样使用.lower()

elif s.lower() == "no":
于 2013-07-27T21:11:13.280 回答
6

lower您可以使用该函数返回s小写的副本并与之比较, 而不是检查不同的大写组合。

def shut_down(s):
    if s.lower() == "yes":
        return "Shutting down..."
    elif s.lower() == "no":       
        return "Shutdown aborted!"
    else:
        return "Sorry, I didn't understand you."

这更清洁,更容易调试。或者,您可以使用upperalso 并与 and 进行"YES"比较"NO"


如果由于匹配案例而这没有帮助,nO那么我将使用以下in语句:

def shut_down(s):
    if s in ("yes","Yes","YES"):
        return "Shutting down..."
    elif s in ("no","No","NO"):       
        return "Shutdown aborted!"
    else:
        return "Sorry, I didn't understand you."
于 2013-07-27T21:14:47.983 回答
4

Python 将非空字符串评估为True,因此您的elif条件始终评估为True

>>> bool('No')
True

>>> bool('NO')
True

or用一个值做一个布尔True值总是会返回True,所以它永远不会达到else条件并卡在那个条件上elif

您需要测试使用条件。

elif choice == 'no' or choice == 'NO' or choice == 'No':

编辑- 正如 glglgl 在评论中指出的那样,==绑定比 更难or,因此您的条件被评估为(s == 'No') or 'no' or 'NO'而不是s == ('No' or 'no' or 'NO'),在这种情况下,else即使用户输入'NO'.

于 2013-07-27T21:12:43.090 回答