我正在做一个看起来很简单的练习,但是我遇到了一个"and"orperator。我想我很清楚它是如何工作的:
print("0 and 0 : ", (0 and 0))
print("0 and 1 : ", (0 and 1))
print("1 and 0 : ", (1 and 0))
print("1 and 1 : ", (1 and 1))
print((0 and 1) == (1 and 0))
这给了我预期的结果:
0 and 0 : 0
0 and 1 : 0
1 and 0 : 0
1 and 1 : 1
True
但是当我运行这段代码时:
A = '00111000111000111000111000'
B = '00001110001110001110001110'
for i in range(len(A)):
s1s2 = (A[i] and B[i])
s2s1 = (B[i] and A[i])
print(f"s1={A[i]}, s2={B[i]}, s1 and s2 = {s1s2} ; s2 and s1 = {s2s1} :", (s1s2) == (s2s1))
我最终在我的控制台使用Python3.9在VSCode上无意义的结果(我也试过在线):
s1=1, s2=0, s1 and s2 = 0 ; s2 and s1 = 1 : False
s1=0, s2=1, s1 and s2 = 1 ; s2 and s1 = 0 : False
同样的问题出现在"or"
A = '00111000111000111000111000'
B = '00001110001110001110001110'
for i in range(len(A)):
s1s2 = (A[i] or B[i])
s2s1 = (B[i] or A[i])
print(f"s1={A[i]}, s2={B[i]} || s1 or s2 = {s1s2} ; s2 or s1 = {s2s1} || s1s2 == s2s1 : ", (s1s2) == (s2s1))
返回无意义的东西:
s1=1, s2=0 || s1 or s2 = 1 ; s2 or s1 = 0 || s1s2 == s2s1 : False
s1=0, s2=1 || s1 or s2 = 0 ; s2 or s1 = 1 || s1s2 == s2s1 : False
我试图在运行循环之前将字符串A和B转换为列表,但它给了我相同的结果。你知道这是怎么回事吗?我错过了什么或做错了什么?
and
返回计算结果为False
的第一个值,或者在它们都不为假的情况下返回最后一个值。对于每个非空(""
)字符串,Python中字符串的布尔值为True。这意味着即使'0'
被认为是True,而0
(整数)不是。
考虑到这两个因素,当您逐个char执行s1 and s2
时,它的值将是s2
,因为它是最后一个并且所有值都被计算为True。
让我们看一个稍微不同的例子:
0 and None -> 0
None and 0 -> None
'1' and '0' -> '0'
'0' and '1' -> '1'
为什么?在前两种情况下,0
(一个整数)和None
都是假的,所以返回第一个。在后两种情况下,您有非空字符串,它们都为真,因此返回第二个字符串。
有几种方法可以将第二个结果固定为与整数比较相同的结果。最简单的方法是根据需要将每个位转换为整数:
A = '00111000111000111000111000'
B = '00001110001110001110001110'
for a, b in zip(A, B):
a = int(a)
b = int(b)
s1s2 = (a and b)
s2s1 = (b and a)
print(f"s1={a}, s2={b}, s1 and s2 = {s1s2} ; s2 and s1 = {s2s1} :", (s1s2) == (s2s1))
另一种方法是直接处理整数并使用位篡改。这需要您显式地设置位数,因为像int(A).bit_length()
这样的东西将丢弃任何前导零:
N = 26
A = 0b00111000111000111000111000
B = 0b00001110001110001110001110
for i in range(N - 1, -1, -1):
a = (A & (1 << i)) >> i
b = (B & (1 << i)) >> i
s1s2 = (a and b)
s2s1 = (b and a)
print(f"s1={a}, s2={b}, s1 and s2 = {s1s2} ; s2 and s1 = {s2s1} :", (s1s2) == (s2s1))
在这两种情况下都可以省略>> i
,因为它不影响(X & (1 << i))
选择的位的真值。还有,1 << i == 2**i
.
您正在对非空字符串进行AND或or操作。这些总是计算为True
。