繁体   English   中英

关于 Python 中 if 语句和空字符串的问题

[英]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 executedcondition_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

由于它只是交换了True1 / 0的顺序,也许我们会得到相同的结果? 答案是否定的,运行代码后,我们得到的是True ,这就是短路的工作原理!

当运算符到达一个允许他们对表达式做出结论的操作数时,就会发生短路。 在这种情况下, or会在它达到第一个真值时立即短路,因为它知道至少有一个值是真而不执行1 / 0 (尽管它是无效的)。 同样, and会在第一个值为 false 时短路,因为它知道并非所有值都是 true。

这是备忘单:

操作员 支票 从左到右计算直到
如果所有值都为真 第一个错误值
要么 如果至少有一个值为真 第一个真值

这里还有网站: cs61a/fa20/lab/lab01/short-circuiting

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM