[英]Issues about if-statement and empty string in Python
我正在学习如何使用 python,昨天我收到一个问题,描述如下:
修改 first_and_last function,使其在字符串的第一个字母与字符串的最后一个字母相同时返回 True,如果不同则返回 False。
通过尝试解决这个问题,我发现有2个几乎相同的程序,但一个可以正确运行,另一个调用错误: string index out of range
程序1 (这个可以正确运行)
def first_and_last(message):
if len(message) == 0 or message[0] == message[-1]:
return True
else:
return False
print(first_and_last("else"))
print(first_and_last("tree"))
print(first_and_last(""))
程序2 (这叫报错)
def first_and_last(message):
if message[0] == message[-1] or len(message) == 0:
return True
else:
return False
print(first_and_last("else"))
print(first_and_last("tree"))
print(first_and_last(""))
我只想知道这两个程序有什么区别,以及为什么它们返回不同的结果。 感谢您的帮助!
因为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
更改为返回 false,您将同时condition_1 executed
和condition_2 executed
。
这是因为您的第二个程序中出现“IndexError:字符串索引超出范围”错误。 第一个程序首先比较 len(message) 并且已经有一个“True”。 而您的第二个程序首先将第一个字符与最后一个字符进行比较。 所以这个问题。
第一个程序工作的原因是因为它首先检查消息的len
是否为 0,如果为True
,它立即进入 if 语句,而第二个程序首先检查第一个字母是否等于最后一个字母,因为如果失败,空字符串没有索引 0。
如果至少有一个条件为真,则“或”语句为真。 当“或”的左侧为真时,右侧不会执行,因此您在第二个程序中出现空字符串错误,但在第一个程序中没有空字符串错误
最近在go上cs61a的时候,在课程网站上找到了一些很有用的资料,决定把最重要的部分都覆盖了,把链接放在这里,以供其他可能想出这个问题的人参考。
这个问题基本上是Python处理表达式的顺序造成的,即Short Circuiting。 例如,当您在 Python 中键入以下内容时:
1 / 0 or True
我们会得到一个ZeroDivisionError
,因为 1 除以 0 在数学中是无效的。 听起来很合理,对吧? 但是运行这段代码时我们得到了什么?
True or 1 / 0
由于它只是交换了True
和1 / 0
的顺序,也许我们会得到相同的结果? 答案是否定的,运行代码后,我们得到的是True
,这就是短路的工作原理!
当运算符到达一个允许他们对表达式做出结论的操作数时,就会发生短路。 在这种情况下, or
会在它达到第一个真值时立即短路,因为它知道至少有一个值是真而不执行1 / 0
(尽管它是无效的)。 同样, and
会在第一个值为 false 时短路,因为它知道并非所有值都是 true。
这是备忘单:
操作员 | 支票 | 从左到右计算直到 |
---|---|---|
和 | 如果所有值都为真 | 第一个错误值 |
要么 | 如果至少有一个值为真 | 第一个真值 |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.