python使用逻辑运算符和位运算符结果不同

问题:

img

两次的运算结果为什么不一样?第二个是正确答案

import datetime
sum=0
start=datetime.date(2000,1,1)
end=datetime.date(2020,10,1)
days=datetime.timedelta(days=1)
while(start<=end):
    if start.day==1 | start.weekday()==0:
        sum+=2
    else:
        sum+=1
    start+=days
print(sum

img


import datetime
sum=0
start=datetime.date(2000,1,1)
end=datetime.date(2020,10,1)
days=datetime.timedelta(days=1)
while(start<=end):
    if start.day == 1 or start.weekday() == 0:
        sum+=2
    else:
        sum+=1
    start+=days
print(sum)

img

如果对第一个代码加上括号也能得到答案,这是为什么?

import datetime
sum=0
start=datetime.date(2000,1,1)
end=datetime.date(2020,10,1)
days=datetime.timedelta(days=1)
while(start<=end):
    if (start.day==1) | (start.weekday()==0):
        sum+=2
    else:
        sum+=1
    start+=days
print(sum

img

if start.day==1 or start.weekday()==0:

这个是 比较
start.day 为 1 或者 start.weekday() 为 0
结果为 8879

if (start.day==1) | (start.weekday()==0):

结果为 8879


if start.day==1 | start.weekday()==0:
或者可以解读为:
if start.day== (1 | start.weekday() )==0:

因为 | 有优先权。结果变成:
start.day== (1 | start.weekday() )==0
start.day== true ==0
而答案永远都是否。
7580 刚好是 2000,1,1 -- 2020,10,1 (包含开始和结束日期)

| 是逻辑运算用的,优先度是最高的。所以1和start。weekday()会先被放到一起运算。
但是or会把前后两个语句在判断的时候用到整体