0

所以这是我的代码

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."

谁能告诉我为什么会这样

4

2 回答 2

0

问题在于表达式s == a or c or e(及其变体)没有达到您的预期。

它是这样评估的:(s == a) or bool(c) or bool(e). 由于ce始终是“真”值(非空字符串),因此or表达式最终始终为真。

有一些替代解决方案:

  1. 您可以在当前版本的表达式中分发相等测试,从而产生s == a or s == c or s == e,但这是很多重复的文本。

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

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

使用第三种解决方案,无需计算变量c, d, e, or f(您甚至可以将"yes"and"no"文字直接放在测试中,也允许aandb离开!)。它将匹配更多的输入文本(例如"yEs"),但这可能是一个特性,而不是一个错误。

于 2013-08-06T08:02:52.077 回答
0

这是新程序员经常遇到的问题;计算机的行为不是人们所期望的,而是它被告知的方式。

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

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

Python 也为此提供了另一种语法(尽管操作并不完全相同),基于包含检查:

if s in (a, c, e):

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

于 2013-08-06T07:41:47.477 回答