为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

当年话下 2024-01-04 10:10:50
我正在学习如何使用python,昨天我得到了一个问题,描述如下:修改first_and_last函数,如果字符串的第一个字母与最后一个字母相同则返回True,如果不同则返回False。通过尝试解决这个问题,我发现有2个几乎相同的程序,但一个可以正确运行,另一个调用错误:字符串索引超出范围程序1(可以正确运行)def first_and_last(message):    if len(message) == 0 or message[0] == message[-1]:        return True    else:        return Falseprint(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 Falseprint(first_and_last("else"))print(first_and_last("tree"))print(first_and_last(""))我只想知道这两个程序有什么区别,以及为什么它们返回不同的结果。感谢您的帮助!
查看完整描述

5 回答

?
holdtom

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。


查看完整回答
反对 回复 2024-01-04
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

第一个程序工作的原因是它首先检查len消息的 0 是否为 0,如果是,True则立即进入 if 语句,而第二个程序首先检查第一个字母是否等于最后一个字母,并且由于空字符串如果失败则没有索引 0。



查看完整回答
反对 回复 2024-01-04
?
慕标琳琳

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第一个真实值
查看完整回答
反对 回复 2024-01-04
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

这是因为第二个程序中出现“IndexError:字符串索引超出范围”错误。第一个程序首先比较 len(message) 并且已经有一个“True”。虽然您的第二个程序首先将第一个字符与最后一个字符进行比较。所以这个问题。



查看完整回答
反对 回复 2024-01-04
?
精慕HU

TA贡献1845条经验 获得超8个赞

如果至少一个条件为真,“或”语句为 True。当“or”的左侧为 true 时,右侧不会执行,因此第二个程序中出现空字符串错误,但第一个程序中的空字符串没有错误



查看完整回答
反对 回复 2024-01-04
  • 5 回答
  • 0 关注
  • 172 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信