Porque usar os operadores 'and' e 'or' nessa situação causa um erro? Qual a diferença entre &, && e 'and' (e |, || e 'or') ?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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!