两个带逻辑运算符的语句

时间:2015-12-07 10:37:17

标签: python

我有以下代码:

fhand=open('mbox-short.txt')
count=0
for line in fhand:
    words=line.split()
    print(words)
    if len(words)==0: continue
    if words[0]!='From': continue
    print(words[2])

此代码打印有效输出(我试图从mbox.txt文件中获取已发送电子邮件的日期)。当我尝试将两个“if”语句组合如下时:

if words[0]!='From' and len(words)==0: continue

我收到此错误:

['From', 'stephen.marquard@uct.ac.za', 'Sat', 'Jan', '5', '09:14:16', '2008']
Sat
['Return-Path:', '<postmaster@collab.sakaiproject.org>']
Traceback (most recent call last):
  File "untitled.py", line 7, in <module>
    print(words[2])
IndexError: list index out of range

我发现问题发生在Return-Path行,但为什么要考虑这个问题?并且组合的if语句不应该与两个分开的if语句具有相同的输出吗?

2 个答案:

答案 0 :(得分:2)

您遇到的问题是您翻了测试的顺序。您现在正在尝试检查第一个值之后测试的长度:

if words[0]!='From' and len(words)==0: continue

Python从左到右检查条件,因此它首先检查if words[0]!='From'然后测试len(words)==0,但是如果words为空,则第一个测试尝试访问不存在的索引并创建您的错误。

您需要使用此订单,并使用or运算符作为deceze指出,因为您只关心其中一个True,而不是两者。< / p>

if len(words)==0 or words[0]!='From': continue

答案 1 :(得分:2)

不同的输出显示两种解决方案不相同:您选择了错误的运算符。

原件会发生什么?如果满足第一个条件,则执行show: function (id) { var url = '/api/contacts/'; return $http({ url: url+id, method: "GET" }); }, 。如果没有,则测试第二个并且适当地循环continue

此行为由一个运算符重复。但这是continue运算符。如果你按照正确的顺序进行,那么everthing就可以了:

or

让我们看看会发生什么:条件的第一部分被执行。如果if len(words)==0 or words[0]!='From': continue 为真,则跳过后半部分(称为短路)和循环len(words)==0 d。这很好,因为如果长度为0,continue会导致错误。

仅当长度 0时,才执行第二次测试。

请注意,有几种方法可以测试列表的空白:

  • words[0]
  • len(words) == 0
  • not len(words)

如果列表为空,则这两个表达式均为not words,否则为True