python帮助无法弄清楚为什么有一段代码错误(代码学院)

时间:2013-08-06 07:23:50

标签: python-2.7

所以这是我的代码

a="yes"
b="no"
c=a[0].upper() + a[1:]
d=b[0].upper() + b[1:]
e=a.upper()
f=b.upper()
def shut_down(s):
    if s == a or c or e:
        return "Shutting down..."
    if s == b or d or f:
        return "Shutdown aborted"
    else:
        return"yeah"

所以当我调用函数它没有正确执行(它没有运行所有的if语句)我是python的新手,不知道为什么这是,但当我重做像下面的工作它按预期工作

a="yes"
b="no"
c=a[0].upper() + a[1:]
d=b[0].upper() + b[1:]
e=a.upper()
f=b.upper()
def shut_down(s):
    if s == a: 
        return "Shutting down..."
    if s== e:
        return "Shutting down..." 

    if s ==c:
        return "Shutting down..."
    if s == b:
        return "Shutdown aborted!"
    if s == d:
        return "Shutdown aborted!"
    if s == f:
        return "Shutdown aborted!"

else:
    return "Sorry, I didn't understand you."

任何人都可以告诉我为什么会发生这种情况

2 个答案:

答案 0 :(得分:0)

这是新程序员常遇到的问题;计算机不会表现出期望的方式,而是告诉的方式。

相等比较并非分布在所有or项中,而是仅在第一项上执行。您必须自己提供所有条款:

if s == a or s == c or s == e:

Python还有一个替代语法(虽然操作不是完全相同),基于包含检查:

if s in (a, c, e):

在这种情况下,我们只有in的两个操作数,并且不需要跨元组元素的分布。

答案 1 :(得分:0)

问题在于表达式s == a or c or e(及其变体),它不符合您的意图。

评估如下:(s == a) or bool(c) or bool(e)。由于ce始终是“truthy”值(非空字符串),因此or表达式始终为真。

有一些替代解决方案:

  1. 您可以在当前版本的表达式中分发相等性测试,结果为s == a or s == c or s == e,但这是重复的文本。

  2. 另一种方法是使用in运算符来测试值是否在容器中:s in (a, c, e)。那打字少了,但它仍然进行了三次测试。

  3. 更好的解决方案可以让您完全避免多项测试。相反,您可以进行完全不区分大小写的单个测试:s.lower() == a

  4. 使用第三种解决方案,无需计算变量cdef(您甚至可以放置"yes""no"文字直接在测试中,允许ab也消失!)。它将匹配更多的输入文本(例如"yEs"),但这可能是一个功能,而不是一个错误。