2
respostas

Operação de conjuntos usando OR e AND em vez de | e &

Olá, fiquei com uma dúvida.... Fui tentar reproduzir o exercício do Guilherme na segunda aula de Sets e Dicionários, mas em vez de usar o I e o &, usei as palavras reservadas or e and do Python que utilizamos antes em outros contextos. Fiquei muito surpreso em perceber que o Python considerou and = I e or = &, o que deveria ter sido o contrário. Por que isso aconteceu? Segue abaixo uma cópia do teste que eu fiz:

num1 = {23, 33, 43, 53, 63} num2 = {23, 23, 33, 34, 35, 36, 43, 53, 63, 63}

num3 = num1 or num2 num4 = num1 | num2 num5 = num1 and num2 num6 = num1 & num2

Obrigado!

print(num3) print(num4) print(num5) print(num6)

2 respostas

Na verdade são operações distintas.

Nessa parte estão sendo feitas as analises de grupos:

num1 = {1, 2, 3, 4, 4}
num2 = {4, 5, 5, 6, 7, 8, 9}

uniao = num1 | num2
intercessao = num1 & num2

print(f'uniao > {uniao}')  # resultado da união dos sets, removendo as duplicadas
print(f'intercessão > {intercessao}')  # resultado da intercessão, removendo as duplicadas

E já nessa parte está sendo feita uma analise ternária simplificada:

# como bool(num1) = True, o Python não precisa continuar o teste e retorna num1
a = num1 or num2

# como bool(num1) = True, o Python tem que continuar o teste para ter certeza que ambos são verdade
# e como bool(num2) = True, o Python termina o teste e retorna num2
b = num1 and num2

# imprime os sets sem as duplicatas
print(a)
print(b)

A analise ternária que está sendo feita pode ser escrita/traduzida assim:

# 'a = num1 or num2'
if num1 == True:
    num1
else:
    num2

# 'b = num1 and num2'
if (num1 == True and num2 == True):
    num2
else:
    False

No caso, os símbolos | e & servem exclusivamente para operações com sets, e não podem ser substituídos por and/or com a mesma finalidade, trata-se de outra coisa.

Por exemplo, usa-se o or de forma declaratória com qualquer tipo de variável, como espécie de fallback caso o elemento seja "falsy".

a = None  # False
b = 0  # False
c = 123  # True
d = a or b or c
print(res)  # 123