Porque usar os operadores 'and' e 'or' nessa situação causa um erro? Qual a diferença entre &, && e 'and' (e |, || e 'or') ?
Porque usar os operadores 'and' e 'or' nessa situação causa um erro? Qual a diferença entre &, && e 'and' (e |, || e 'or') ?
No Python (e na maioria das linguagens) temos dois tipos de operadores lógicos: aqueles que trabalham apenas com o valor verdade do operando e aqueles que trabalham bit a bit (bitwise) no operando.
Se você checar o valor verdade dos números, verá que 0 é falso e 1 e 2 são verdadeiro. Assim, podemos entender esse exemplo:
print(1 and True) # True
print(2 and True) # True
print(1 and 0) # 0 (que é falso)
print(1 or 2) # 1 (que é verdadeiro)
Isso acontece pois os operadores and
e or
só levam isso em consideração, se é falso ou verdadeiro.
Já os operadores bitwise, levam todos os bits do operando em consideração, ou seja, como
1 = 00000000000000000000000000000001
2 = 00000000000000000000000000000010
Poderíamos fazer o OU e o E, bit a bit, ficando assim:
1 = 00000000000000000000000000000001
2 = 00000000000000000000000000000010
1&2 = 00000000000000000000000000000000 ( que vale 0)
1|2 = 00000000000000000000000000000011 ( que vale 3)
Verificando no Python temos:
print(1 | 2) # 3
print(1 & 2) # 0
No caso do exercício, como já temos valores booleanos, creio que não faria diferença trocar os operadores bitwise (&,|) pelos outros operadores (and,or). A questão do erro que aparece é outra: a precedência dos operadores, ou seja, qual é executado primeiro. Por isso, colocamos os parênteses e tudo continua funcionando.
Espero ter ajudado, Abraços!