TransWikia.com

Programa com expressões de booleana entra no bloco do if todas as vezes

Stack Overflow em Português Asked by kdz on November 13, 2021

    prefixes = "JKLMNOPQ"
    suffix = "ack"
    for letter in prefixes:
        if letter[0] == "Q"or"O":
            print(letter+"uack")
            continue
        print(letter+suffix)

Resposta esperada:

Jack
Kack
Lack
Mack
Nack
Ouack
Pack
Quack

Resposta adquirida:

Juack
Kuack
Luack
Muack
Nuack
Ouack
Puack
Quack

Não entendi o porque de or quando usado retorna tudo como True ao em vez de selecionar as variáveis que eu digitei no código.

2 Answers

Outra forma de fazer seria:

prefixes = 'JKLMNOPQ'
for prefix in prefixes:
    suffix = 'uack' if prefix in {'Q', 'O'} else 'ack'
    print(prefix + suffix)

Veja funcionando no Repl.it | Ideone | GitHub GIST

Basicamente substituindo as duas comparações com == pelo operador in e a verificação por uma condição inline, ou ternário, se preferir. Eu particularmente acho esta forma mais legível para humanos.

Answered by Woss on November 13, 2021

O or não funciona como imagina, o correto seria:

prefixes = "JKLMNOPQ"
for letter in prefixes:
    if letter[0] == "Q" or letter[0] == "O":
        print(letter + "uack")
    else:
        print(letter + "ack")

Veja funcionando no ideone. E no repl.it. Também coloquei no GitHub para referência futura.

Você estava comparando a expressão letter[0] == "Q" que pode ser verdadeiro ou falso de acordo com o valor de letter[0]. Como tem um or a única forma da decisão ser tomada sem avaliar mais nada é quando esta expressão seja verdadeira, porque é certo que o bloco deve ser executado. E até aí está certo. O or também é o adequado aí. O problema está na segundo expressão do or que não retorna o que você espera.

Qual o resultado booleano de "O"? Por definição, todos os valores que não sejam considerados zerados ou vazios são falsos, todos os outros valores são verdadeiros, então "O" é verdadeiro. Então toda vez que a primeira expressão der falsa e ele vai tentar a segunda esta é sempre verdadeira, e portanto faz tudo ser verdadeiro.

O que de fato você queria fazer é letter[0] == "O" porque aí a expressão pode dar verdadeira no momento certo, mas dará falsa em grande parte dos casos.

As outras mudanças eu fiz porque é mais legível e óbvio

Answered by Maniero on November 13, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP