逻辑表达式:为啥“str1 in str2 or str2 not in str1”为我的打印语句返回 True?

Posted

技术标签:

【中文标题】逻辑表达式:为啥“str1 in str2 or str2 not in str1”为我的打印语句返回 True?【英文标题】:Logical Expressions: Why does "str1 in str2 or str2 not in str1" return True for my print statement?逻辑表达式:为什么“str1 in str2 or str2 not in str1”为我的打印语句返回 True? 【发布时间】:2021-02-04 13:12:28 【问题描述】:

首先,对于我的帖子中的愚蠢问题或任何错误,我深表歉意! (这是我的第一篇文章!)

其次,我试图在 Stack Overflow 和 RealPython 网站(逻辑表达式)上查找此问题的答案,但我似乎仍然无法理解为什么这段代码返回“True”最后一个(未注释的)函数调用?

我正在尝试回答电子书“使用 Python 进行计算和编程简介”中的以下问题 -

“编写一个函数 isIn,它接受两个字符串作为参数,如果其中一个字符串出现在另一个字符串中,则返回 True,否则返回 False。提示:您可能希望使用内置的 str 操作 in。”

如果有人能解释(用外行的话)为什么下面的代码将“True”返回到最后一个函数调用,我将非常感激 - 再次为这个愚蠢的问题道歉!

def isIn(string1, string2):
    """Input two strings 
       Returns 'True' if either strings are within each other
    """

    if string1 in string2 or string2 not in string1:
        return True
    else:
        return False

# isIn('hello', 'hello')           # Prints True
# isIn('hello', 'hello world')     # Prints True   
isIn('hello world', 'world hello') # Prints True

【问题讨论】:

它返回True,因为string2 不是in string1。你的意思是string1 in string2 or string2 in string1,没有not 感谢您的回复。我想包括“不在”表达,以尝试回答电子书中的问题,但我认为我做的不正确 - 道歉! 【参考方案1】:

为什么你的函数返回True

if语句if string1 in string2 or string2 not in string1由3部分组成:

    string1 in string2 or string2 not in string1

你有:

string1 = 'hello world'
string2 = 'world hello'

第 1 部分 (string1 in string2):

它的计算结果为 False,因为 'hello world' 不在 'world hello' 中

第 3 部分 (string2 not in string1):

计算结果为True,因为“hello world”中实际上不存在“world hello”

第二部分,or

or 会给你:

True 如果至少有一个表达式计算为 True False 如果所有表达式的计算结果为 False

所以你得到True

但如果你使用过and,你会得到False

如果有时您有疑问,请尝试以下打印:

# or:
print(True or True) # True
print(True or False) # True
print(False or False) # False

# and:
print(True and True) # True
print(True and False) # False
print(False and False) # false

回答您的评论:

不,“hello world”不在“world hello”中 那么,“世界你好”是什么?

'world'、'hello'、''(空格)和''(空字符串)。 以及所有可能的子字符串(源中的字符和连续字符 字符串,例如'h'、'he'、'hel'、'wo'等)。请注意,实际上所有项目 'world'、'hello'、'' 和 '' 都是 :-)

所以,所有这些都为真:

# string2 = 'world hello'
'world' in string2
'hello' in string2
' ' in string2
'' in string2
'h' in string2
'e' in string2
'llo' in string2
'llo 'wo' in string2
# etc.

在计算机科学中,字符串是一系列字符。 每个子序列都是一个子字符串。

所以现在,您应该对什么是字符串和什么是子字符串有了更好的理解,如果您有兴趣,可以/应该在互联网上搜索一些信息。

那么,in 表达式是什么? in 表达式,实际上,在处理字符串时,会告诉您您在另一个字符串中搜索的字符串的字符是否是这个 stringsubstring与否。

总之,字符序列“hello world”不在字符序列“world hello”中。

【讨论】:

这是一个非常彻底的解释 - 谢谢你这样分解它!我想更好地理解这部分答案:“第 1 部分(字符串 2 中的字符串 1):它的计算结果为 False,因为 'hello world' 不在 'world hello' 中” - 请原谅我在这里听起来很愚蠢,但字符串' hello world' 和 'world hello' 在我看来是一样的,除了它们是相反的,对吧?我会认为“in”运算符检测到这种反转?再次为我的不理解道歉! 不客气!我将在答案的末尾添加一个示例。 感谢您更新答案并添加示例!我已经修改了我的代码以包含一个“for”循环和“if”语句,即使单词被切换,它似乎也可以工作......我很可能需要对此进行更多实验 - 谢谢你的帮助! 【参考方案2】:

您的 If 语句正在检查 2 个条件:

    string1 in string2 :这是 False 因为 string1 是 'hello world' 并且它不存在于 string2 中。如果 string1 是 'hello' 或 'world' 或 'world hello' 或 ' ',它将返回 True,因为所有这些都存在于 string2 中。

    string2 not in string1 :它将检查 string1 中是否不存在 string2 您的函数由于这种情况而返回 True,字符串 1 中不存在“world hello”

【讨论】:

【参考方案3】:

除了@NoobCoder 的答案之外,由于第二个条件,您的程序正在返回 true:

"or string2 not in string1" 返回 TRUE,因为第二个字符串不在第一个字符串中。

那么,根据您的条件:Cond1 OR Cond2,如果其中任何一个返回 TRUE,那么您的最终答案将为 TRUE。

【讨论】:

【参考方案4】:

嘿 :D 我认为您可以使用 for 循环来检查 string1 是否包含 string2 中的单词 Idk 如何在此处放置 python 代码,因为我也是新手:\


但整个事情就像


对于 b(字符串、列表等)中的 a(变量):


for c in d:

然后编码其余部分

【讨论】:

for a in d 迭代可迭代的 d。我认为它并不能真正帮助检查 a 是否包含在 d 中。相反,它只是为 d 的每个元素运行循环体。

以上是关于逻辑表达式:为啥“str1 in str2 or str2 not in str1”为我的打印语句返回 True?的主要内容,如果未能解决你的问题,请参考以下文章

为啥表达式逻辑表达式`product.id === +id;`中的加号? [复制]

为啥 JavaScript 中没有逻辑异或?

HPCC-ECL 逻辑运算符 - 为啥 OR 不短路?

逻辑回归为啥用最大似然估计求解

为啥在verilog中要定义wire?

为啥这个表达不统一