所以这是我的代码
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."
任何人都可以告诉我为什么会发生这种情况
答案 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)
。由于c
和e
始终是“truthy”值(非空字符串),因此or
表达式始终为真。
有一些替代解决方案:
您可以在当前版本的表达式中分发相等性测试,结果为s == a or s == c or s == e
,但这是重复的文本。
另一种方法是使用in
运算符来测试值是否在容器中:s in (a, c, e)
。那打字少了,但它仍然进行了三次测试。
更好的解决方案可以让您完全避免多项测试。相反,您可以进行完全不区分大小写的单个测试:s.lower() == a
。
使用第三种解决方案,无需计算变量c
,d
,e
或f
(您甚至可以放置"yes"
和"no"
文字直接在测试中,允许a
和b
也消失!)。它将匹配更多的输入文本(例如"yEs"
),但这可能是一个功能,而不是一个错误。