Python 为什么这句话是真的

Python 为什么这句话是真的,python,if-statement,Python,If Statement,par_list在此之前的某些代码中启动。对于我正在测试它的部分,“日历”不会出现。那么为什么它将if语句计算为True while cake: print "Length of par_list = ", len(par_lst) for rows in par_lst: if "calendar" or "Calendar" in rows: print "you shouldn't be here" writ

par_list
在此之前的某些代码中启动。对于我正在测试它的部分,
“日历”
不会出现。那么为什么它将if语句计算为
True

while cake:
    print "Length of par_list = ", len(par_lst)

    for rows in par_lst:
        if "calendar" or "Calendar" in rows:
            print "you shouldn't be here"
            writer.writerow(rows)

这是因为您的代码应该是:

if "calendar" in rows or "Calendar" in rows:
在Python中,非空字符串的计算结果总是
True
。此外,您当前的代码与此基本相同:

if ("calendar") or ("Calendar" in rows):
这意味着此条件将始终返回
True
,因为
“日历”
将始终为
True
。事实上,它甚至永远不会到达
(“日历”成行)
部分

作为一个论证,考虑一下:

>>> bool("calendar" or "Calendar" in rows)
True
>>>
注意,即使我还没有定义
,我也没有得到
名称错误
。相反,代码返回
True
。这是因为,正如我上面所说的,它甚至从未进入到行中的
“日历”部分。实际上,它所做的只是计算
“calendar”
,它是一个非空字符串,返回
True

if "calendar" or "Calendar" in rows:
相当于

if "calendar" or ("Calendar" in rows):
由于
“日历”
是真实的,因此该条件通过

if "calendar" or "Calendar" in rows:
这总是正确的<代码>“calendar”
是一个非零长度字符串,这是真的,并且
'd与
中的“calendar”成行
始终是真的。事实上,行中的
“Calendar”甚至从未计算过,因为
“Calendar”
为true

你想要:

if "calendar" in rows or "Calendar" in rows:
这并不是最有效的,因为它实际上会搜索
两次。要仅搜索一次,请尝试:

if (row.lower() = "calendar" for row in rows):
然而,这实际上可能并不比搜索行两次快:第一次是因为它是一个显式循环,第二次是因为它在测试前将每一行小写。它的优点是可以匹配任何情况,不仅是“日历”或“日历”,还可以匹配“日历”或“日历”或其他任何情况

现在,我觉得这可能仍然不是你想要的。除非其中一行正好是字符串
“calendar”
(在任何情况下),否则该值始终为false。例如,如果您从文件中读取了列表,它可能包含行尾,这将阻止此测试匹配。或者字符串中可能有其他文本,您只想测试每一行是否包含该单词。在这种情况下,写下:

if any("calendar" in row.lower() for row in rows):
哪一个“如果”???有三个if语句?将代码简化为合理的测试用例。