两组类似的python代码似乎有不同的行为

时间:2017-06-02 13:17:22

标签: python

试图弄清楚为什么我在这里得到两个不同的结果(一个是错误的)。以下是运行的代码:

hta = 2.13
visitor_team_ratings = [21.53]
home_team_ratings = [None]
difference = []

for a, b in zip(visitor_team_ratings, home_team_ratings):
    if a and b:
        difference.append(a - (b + float(hta)))
    else:
        difference.append('NO RATING')
print(difference)

这打印出“没有评价”,但我很难理解为什么会这样做。 None与空列表不同,为什么python会下降到else语句。

这是抛出错误的类似代码。与上面的工作代码相同的变量/列表:

if visitor_team_ratings and home_team_ratings:
    difference.append((visitor_team_ratings[0] - (home_team_ratings[0] + float(hta))))
else:
    difference.append('NO RATING')
print(difference)

错误是:TypeError: unsupported operand type(s) for +: 'NoneType' and 'float'

我不确定我理解为什么一个有效而另一个无效。而那个有效的,我甚至不确定我理解它为什么这样做。我一直在我的程序中使用第一个代码块...

4 个答案:

答案 0 :(得分:2)

问题主要在于:

[None]

在第一个版本中,当你写

home_team_ratings = [None]

if a and b b,因为它来自None。因此home_team_ratings条件为假。

在第二个版本中

if

这种情况属实,因为两个列表都不为空。 但是if visitor_team_ratings and home_team_ratings: 会引发异常,因为您试图将(home_team_ratings[0] + float(hta))添加到浮点数。

答案 1 :(得分:2)

None中查看列表。

然而,如果您使用:if visitor_team_ratings and home_team_ratings:̀。然后你看一下列表中的元素。 (对应于第一个区块的if visitor_team_ratings[0] and home_team_ratings[0]:a

编辑我应该详细说明:

b

这是导致问题的原因。如果你看一下这个元素,那就是home_team_ratings = [None] 所以条件不会是真的。但是如果查看列表,那么None将为True,因为两个列表都不为空。但是,if之后会发出错误,因为它是home_team_ratings[0]:

答案 2 :(得分:0)

在第一个示例中,import numpy as np import cv2 import gtk import pygtk import gobject count=0 loop=0 cascPath = 'haarcascade_frontalface_default.xml' faceCascade = cv2.CascadeClassifier(cascPath) cap = cv2.VideoCapture('sample.mp4') print (cap.isOpened()) 的计算结果为False,因为if a and b为False。在第二个示例中,列表bool(None)的计算结果为True,因为它不是空的

答案 3 :(得分:0)

在第一个块中,您循环遍历列表的元素。在循环内部,您正在评估天气元素(a和b两者)是否真实。显然,没有什么是不正确的,因为它移动到了其他部分。

在第二部分中,您将评估两个列表是否为真。列表不为空,因此如果执行部分。