5 回答
TA贡献1805条经验 获得超10个赞
因为or运算符通过检查第一个条件来工作,如果第一个条件不为真,则检查第二个条件。
你的左边or是真的(len(message) == 0),所以右边不被执行(message[0] == message[-1])。因此,您不会得到范围异常。
如果交换顺序,message[0] == message[-1]位于运算符的左侧,因此执行时不会检查字符串是否为空。
您将在此示例中看到
def condition_1():
print('condition_1 executed')
return True
def condition_2():
print('condition_2 executed')
return True
if condition_1()or condition_2():
print('one condition is true')
你会得到condition_1 executed。如果更改condition_1 为 return false,您将同时得到condition_1 executed和condition_2 executed。
TA贡献1805条经验 获得超9个赞
第一个程序工作的原因是它首先检查len
消息的 0 是否为 0,如果是,True
则立即进入 if 语句,而第二个程序首先检查第一个字母是否等于最后一个字母,并且由于空字符串如果失败则没有索引 0。
TA贡献1830条经验 获得超9个赞
最近,当我浏览cs61a时,我在课程网站上发现了一些非常有用的信息,我决定涵盖重要部分并将链接放在这里,供其他可能提出这个问题的人作为参考。
这个问题基本上是由Python处理表达式的顺序引起的,即Short Circuiting。例如,当您在 Python 中键入以下内容时:
1 / 0 or True
我们会得到 a ZeroDivisionError
,因为 1 除以 0 在数学中是无效的。听起来很合理,对吧?但是运行这段代码我们会得到什么呢?
True or 1 / 0
True
既然它只是交换了和 的顺序1 / 0
,也许我们会得到相同的结果?答案是否定的,运行代码后,我们得到了True
相反的结果,这就是短路的工作原理!
当运算符到达允许他们对表达式做出结论的操作数时,就会发生短路。在这种情况下,or
一旦到达第一个真值就会短路,因为它知道至少有一个值是真而不执行1 / 0
(尽管它是无效的)。同样,and
当第一个值为 false 时会短路,因为它知道并非所有值都是 true。
这是备忘单:
操作员 | 支票 | 从左到右评估 |
---|---|---|
和 | 如果所有值都是 true | 第一个假值 |
或者 | 如果至少有一个值为 true | 第一个真实值 |
TA贡献1848条经验 获得超10个赞
这是因为第二个程序中出现“IndexError:字符串索引超出范围”错误。第一个程序首先比较 len(message) 并且已经有一个“True”。虽然您的第二个程序首先将第一个字符与最后一个字符进行比较。所以这个问题。
TA贡献1845条经验 获得超8个赞
如果至少一个条件为真,“或”语句为 True。当“or”的左侧为 true 时,右侧不会执行,因此第二个程序中出现空字符串错误,但第一个程序中的空字符串没有错误
添加回答
举报