par_list
。对于我正在测试它的部分,"calendar"
没有出现。那为什么它会将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)
答案 0 :(得分:11)
那是因为你的代码应该是这样的:
if "calendar" in rows or "Calendar" in rows:
在Python中,非空字符串总是评估为True
。此外,您当前的代码与此基本相同:
if ("calendar") or ("Calendar" in rows):
这意味着此条件将始终返回True
,因为"calendar"
始终为True
。事实上,它永远不会进入("Calendar" in rows)
部分。
作为演示,请考虑以下事项:
>>> bool("calendar" or "Calendar" in rows)
True
>>>
请注意,即使我甚至没有定义rows
,我也没有得到NameError
。相反,代码返回True
。那是因为,正如我上面所说,它甚至没有进入"Calendar" in rows
部分。事实上,它只是评估"calendar"
,它是一个非空字符串,返回True
。
答案 1 :(得分:3)
if "calendar" or "Calendar" in rows:
这总是如此。 "calendar"
是一个非零长度的字符串,它是真的,而or
'与"Calendar" in rows
的字符串始终为真。事实上,"Calendar" in rows
永远不会被评估,因为"calendar"
是真的。
你想:
if "calendar" in rows or "Calendar" in rows:
这不是最有效的,因为它实际上会搜索rows
两次。要只搜索一次,请尝试:
if (row.lower() = "calendar" for row in rows):
然而,实际上这可能不会比搜索两次行更快:第一,因为它是一个显式循环,第二,因为它在测试之前将每行小写。它确实具有匹配任何案例的优势,不仅仅是“日历”或“日历”,还有“日历”或“CALENDAR”等等。
现在,我觉得这可能不是你想要的。除非其中一行完全字符串"calendar"
(在任何情况下),否则这总是错误的。例如,如果您已从文件中读取列表,则它可能包含行结尾,这将使此测试不匹配。或者字符串中可能还有其他文本,您只想测试每行是否包含该字。在这种情况下,请写:
if any("calendar" in row.lower() for row in rows):
答案 2 :(得分:1)
if "calendar" or "Calendar" in rows:
相当于
if "calendar" or ("Calendar" in rows):
由于"calendar"
是真实的,条件会过去。