Operadores lógicos do Python: Uma introdução prática
O Python oferece três operadores lógicos: and, or e not. Esses operadores, também conhecidos como operadores booleanos, avaliam várias condições e determinam o valor de verdade geral de uma expressão.
Na programação, frequentemente precisamos tomar decisões com base em várias condições. Por exemplo, talvez você queira executar uma determinada ação somente se várias condições forem atendidas simultaneamente. Como alternativa, talvez você queira acionar uma ação alternativa se uma das várias condições for atendida.
O Python oferece um conjunto de operadores lógicos - and, or, not - para que você possa lidar com esses cenários.
Neste tutorial, aprenderemos como funcionam os operadores lógicos do Python e como você pode usá-los na programação e na ciência de dados. Observe que usaremos as palavras em maiúsculas AND, OR e NOT para representar esses operadores conceitualmente. E vamos nos referir às palavras-chave do Python usando esta convenção: and, or, e not.
Se você está procurando um currículo de Python com curadoria, confira este programa de seis cursos de habilidades de programação em Python.
Antes de entrar em detalhes, vamos começar com uma resposta muito breve para você que está com pressa.
Resposta curta: O que são os operadores lógicos do Python?
Os operadores lógicos do Python (and, or, not) são palavras-chave especiais que atuam como conjunções em nosso código, conectando e avaliando várias condições em uma única expressão.
Considere este exemplo:
temperature =25
is_sunny = True
if temperature >20 and is_sunny:print("It's a perfect day for a picnic!")Tecnologia
Aqui, o operador and garante que a mensagem seja impressa somente se both condições forem atendidas: a temperatura está acima de 20 graus and e está ensolarado.
Vejamos outro exemplo usando o operador or:
has_umbrella = False
if is_sunny or has_umbrella:print("Let's go for a walk!")Tecnologia
Nesse caso, sairemos para uma caminhada se estiver ensolarado ou se tivermos um guarda-chuva.
Por fim, o operador not inverte o valor verdadeiro de uma condição:
if not is_sunny:print("Maybe we should stay indoors.")Tecnologia
Aqui, a mensagem é impressa somente se não estiver ensolarada.
Os operadores lógicos nos dão uma maneira concisa e poderosa de expressar condições complexas, permitindo que nossos programas tomem decisões com base em vários fatores. Agora, vamos dar uma olhada mais profunda e começar com o operador lógico and.
Python: Os and Operador
Na lógica booleana, a operação AND envolve a comparação de dois valores ou expressões. Ele produz um resultado verdadeiro somente se ambos os valores forem verdadeiros. Se um ou ambos os valores forem falsos, o resultado da operação AND será falso. Aqui está um resumo de como o AND se comporta:
Operação
Valor de saída
verdadeiro E verdadeiro
verdadeiro
verdadeiro E falso
falso
falso E verdadeiro
falso
falso E falso
falso
Você pode recriar essa tabela verdade com o operador and do Python:
options = True, False
for a inoptions:for b inoptions:print(f"{a} and {b} gives {a and b}")Tecnologia
True and True gives True
True and False gives False
False and True gives False
False and False gives False
Tecnologia
A variável options contém os dois valores booleanos. Os loops for aninhados iteram as opções duas vezes para criar todas as permutações de True e False.
Geralmente, as expressões usadas como operandos para and incluem operadores de comparação ou igualdade:
names ="James","Bob","David","Jane","Kate","Mary"for name innames:iflen(name)<5 and name[0]=="J":print(name)Tecnologia
O nome será impresso somente se tiver menos de cinco letras e começar com "J". Ambos os requisitos devem ser atendidos.
Os operadores de comparação e igualdade, como < e ==, são avaliados como True ou False.
No entanto, o operador Python and funciona em qualquer tipo de dados e não apenas nos booleanos True e False. O valor de saída também pode ser qualquer tipo de dados.
Vamos explorar o operador and do Python em mais detalhes nesta seção. Primeiro, discutiremos a veracidade.
Python: verdadeiro e falso
Todo objeto Python pode ser convertido em um tipo booleano usando o built-in bool(). Um objeto é verdadeiro se bool(object) retornar True. Para um objeto falso, bool(object) retorna False.
O operador and do Python analisa a veracidade de seus operandos. Se ambos os operandos forem verdadeiros, o operador and também retornará um valor verdadeiro. Se um ou ambos os operandos forem falsos, and retornará um valor falso. Vamos dar uma olhada em alguns exemplos:
if42and"python":print("Both operands are truthy")else:print("One or both operands are falsy")Tecnologia
Os tipos numéricos, como inteiros e floats, são verdadeiros se forem diferentes de zero e falsos quando iguais a zero. As sequências, assim como as cadeias de caracteres, são verdadeiras quando não são vazias e falsas quando são vazias.
Portanto, somente o primeiro dos três exemplos acima satisfaz a condição de que ambos os operandos devem ser verdadeiros para que o operador and seja avaliado como verdadeiro.
O operador and nem sempre retorna um valor booleano. Uma expressão que inclui and também pode ser avaliada como um dos operandos. Vamos nos aprofundar mais nisso usando os mesmos exemplos que usamos anteriormente. Em vez de usar as expressões and em uma instrução if, nós as avaliaremos diretamente:
print(42 and "python")print(42 and "")print(0 and "python")Tecnologia
Você consegue identificar o que está acontecendo com essas expressões?
Vamos começar com o último dos três exemplos, que tem 0 e "python" como os dois operandos. O operador and está procurando por dois operandos verdadeiros. Como a primeira é 0, ela é falsa. Não é necessário que o programa verifique o segundo operador, pois toda a expressão será falsa, independentemente do valor do segundo operando.
No entanto, o operador and não retorna False. Em vez disso, ele retorna o primeiro operando diretamente. Como o primeiro operando é falso, toda a expressão and é avaliada como falsa. Isso não causa nenhum problema no Python, pois em situações em que o Python requer um valor verdadeiro ou falso, ele pode usar a veracidade de um objeto.
No primeiro exemplo, o primeiro operando é 42, que é verdadeiro. O programa avalia o segundo operando e o retorna. Como o segundo operando é a cadeia de caracteres "python", que é verdadeira, a expressão inteira é avaliada como verdadeira.
No segundo exemplo, o primeiro operando também é 42. Como é verdadeiro, o programa avalia e retorna o segundo operando, que é a string vazia. A string vazia é falsa e, portanto, toda a expressão and é avaliada como falsa.
Quando o primeiro operando é verdadeiro, o operador and sempre retorna o valor do segundo operando, quer o segundo operando seja verdadeiro ou falso.
Quando o primeiro operando é falso, o Python não avalia o segundo operando. Isso é chamado de curto-circuito e é uma forma de avaliação preguiçosa. Você pode confirmar isso com o seguinte código:
O segundo operando é 5/0, que normalmente geraria um ZeroDivisionError. No entanto, a expressão 5/0 não é avaliada neste exemplo, pois o primeiro operando é falso. A exceção nunca é levantada.
Exemplo: A loja on-line dos programadores
Vamos considerar um exemplo simples que representa um aplicativo da vida real. As transações em uma loja on-line que fornece produtos para programadores são registradas e acessadas por meio de uma API. Os dados são convertidos em uma lista de dicionários. Cada item da lista representa uma transação e cada transação é um dicionário que contém informações relevantes:
data =[{"Item":"Python Book","Price":50,"Quantity":1,"Success": True},{"Item":"Coffee Machine","Price":125,"Quantity":1,"Success": False},{"Item":"Headphones","Price":250,"Quantity":1,"Success": True},{"Item":"Cables","Price":15.99,"Quantity":3,"Success": True},]Tecnologia
Cada transação inclui o nome e o preço do item, a quantidade incluída no pedido e se a transação foi bem-sucedida.
Vamos supor que precisamos de transações bem-sucedidas para itens com preço igual ou superior a US$ 100. Podemos usar o operador and para filtrar as linhas de que precisamos:
for item indata:if item["Success"] and item["Price"]>=100:print(item)Tecnologia
A saída desse código mostra a única transação que atende a ambos os requisitos. Para cada item da lista de transações, a instrução if verifica a veracidade de duas expressões:
Os valores associados à chave "Success" em cada dicionário são True ou False.
O operador maior que ou igual a em item["Price"] >= 100 também retorna True ou False.
O livro Python e os cabos não atendem ao requisito de preço, pois custam menos de US$ 100. A máquina de café está acima desse limite de preço, mas essa transação não foi bem-sucedida e, portanto, foi excluída da impressão.
Voltaremos a esse exemplo de loja on-line mais adiante neste tutorial.
Na seção a seguir, vamos nos concentrar no operador or.
Python: Os or Operador
O operador lógico OR na lógica booleana precisa de dois operandos. É avaliado como verdadeiro se pelo menos um dos operandos for verdadeiro:
Operação
Valor de saída
verdadeiro OU verdadeiro
verdadeiro
verdadeiro OU falso
verdadeiro
falso OU verdadeiro
verdadeiro
falso OU falso
falso
Podemos recriar essa tabela verdade usando o operador or do Python:
options = True, False
for a inoptions:for b inoptions:print(f"{a} or {b} gives {a or b}")Tecnologia
True or True gives True
True or False gives True
False or True gives True
False or False gives False
Tecnologia
Também podemos revisitar o exemplo com nomes de pessoas que exploramos anteriormente, mas substituindo o operador and por um or:
names ="James","Bob","David","Jane","Kate","Mary"for name innames:iflen(name)<5 or name[0]=="J":print(name)Tecnologia
A declaração if agora contém uma expressão or. Portanto, o loop for imprime todos os nomes que têm menos de cinco letras ou que começam com a letra "J". A string "Jane" atende a ambos os requisitos. Os outros nomes impressos atendem a um dos dois requisitos.
Python or operador: verdadeiro e falso
O operador or também procura valores verdadeiros e falsos, e não apenas os booleanos True e False. Vamos dar uma olhada em alguns exemplos:
if42 or [10,20,30]:print("At least one operand is truthy")else:print("None of the operands is truthy")Tecnologia
No primeiro exemplo, o número inteiro 42 e a lista não vazia [10, 20, 30] são verdadeiros. Como o operador or precisa que pelo menos um operando seja verdadeiro, a expressão inteira é avaliada como verdadeira.
No segundo exemplo, 42 é verdadeiro, mas a lista vazia [] é falsa, pois é uma sequência vazia. Como um dos dois operandos é verdadeiro, toda a expressão or é avaliada como verdadeira.
No exemplo final, tanto 0 quanto [] são falsos. Portanto, a expressão inteira é avaliada como falsa.
O operador or também usa curto-circuito ao avaliar a expressão para evitar avaliações desnecessárias. Vamos dar uma olhada em alguns exemplos para ilustrar esse ponto:
print(42 or [10,20,30])print(42 or [])print([] or 42)print([] or 0)Tecnologia
No primeiro exemplo, o primeiro operando é 42, que é verdadeiro. Como o site or exige que apenas um operando seja verdadeiro para determinar a veracidade final de toda a expressão, esse primeiro operando é retornado imediatamente. O segundo operando não é avaliado, pois seu valor não tem efeito sobre o resultado final. O operador or retorna o primeiro operando, 42, e não o booleano True. Em Python, qualquer valor verdadeiro tem o mesmo efeito que o booleano True em situações como as declarações if e while.
No segundo exemplo, o primeiro operando também é 42, e a expressão retorna esse número inteiro mesmo que o segundo operando seja falso.
No terceiro e quarto exemplos, o primeiro operando é a lista vazia, que é falsa. Portanto, o segundo operando é retornado em ambos os casos.
Exemplo: A loja on-line dos programadores
Vamos revisar as transações da loja on-line que vende produtos para programadores. Aqui estão as quatro transações de amostra que estamos usando neste exemplo:
data =[{"Item":"Python Book","Price":50,"Quantity":1,"Success": True},{"Item":"Coffee Machine","Price":125,"Quantity":1,"Success": False},{"Item":"Headphones","Price":250,"Quantity":1,"Success": True},{"Item":"Cables","Price":15.99,"Quantity":3,"Success": True},]Tecnologia
Você precisa identificar algumas transações para investigar melhor o comportamento do cliente. Você deseja encontrar as transações que falharam ou que incluem um item com preço abaixo de US$ 75. Como você tem duas condições e só exige que uma transação atenda a pelo menos uma delas, você pode usar o operador or:
for item indata:if item["Success"]== False or item["Price"]<75:print(item)Tecnologia
Esse loop for exibe as linhas que correspondem a pelo menos um dos requisitos. O livro Python e os cabos estão incluídos, pois seu preço é inferior a US$ 75. A máquina de café está incluída, pois a transação não foi bem-sucedida.
Há uma maneira alternativa de filtrar as transações malsucedidas, que exploraremos na seção a seguir.
Python: Os not Operador
O operador NOT é diferente de AND e OR, pois requer apenas um operando. NOT converte verdadeiro em falso e vice-versa. Aqui está a tabela verdade para NOT:
Operação
Valor de saída
NÃO verdadeiro
falso
NÃO falso
verdadeiro
Você pode replicar isso usando o operador not do Python:
options = True, False
for a inoptions:print(f"not {a} evaluates to {not a}")Tecnologia
not True evaluates to False
not False evaluates to True
Tecnologia
Python not operador: verdadeiro e falso
Assim como em and e or, o operando usado em not não precisa ser um booleano. Como qualquer objeto é verdadeiro ou falso, qualquer objeto pode ser usado com not.
if not "python":print("The `if` statement evaluated as `True`")else:print("The `if` statement evaluated as `False`")Tecnologia
Nas seções anteriores, usamos as transações de uma loja on-line. Neste exemplo, queremos exibir todas as transações malsucedidas. Uma opção é usar o operador de igualdade == para verificar se data["Success"] é igual a False. No entanto, você também pode usar o operador not:
data =[{"Item":"Python Book","Price":50,"Quantity":1,"Success": True},{"Item":"Coffee Machine","Price":125,"Quantity":1,"Success": False},{"Item":"Headphones","Price":250,"Quantity":1,"Success": True},{"Item":"Cables","Price":15.99,"Quantity":3,"Success": True},]for item indata:if not item["Success"]:print(item)Tecnologia
Como item["Success"] é igual a False para as transações malsucedidas, não item["Success"] retorna True. Portanto, o loop for imprime as transações malsucedidas:
Na seção a seguir, aprenderemos a combinar vários operadores lógicos em uma única expressão.
Python: Precendência do operador
Nos exemplos mostrados até agora, usamos apenas um dos operadores lógicos em cada instância. Nesta seção, veremos o que acontece quando combinamos mais operadores lógicos em uma única expressão.
Python: and tem precedência sobre or
Continuaremos a trabalhar nas transações da loja on-line que usamos anteriormente. Vamos tentar a seguinte declaração condicional:
data =[{"Item":"Python Book","Price":50,"Quantity":1,"Success": True},{"Item":"Coffee Machine","Price":125,"Quantity":1,"Success": False},{"Item":"Headphones","Price":250,"Quantity":1,"Success": True},{"Item":"Cables","Price":15.99,"Quantity":3,"Success": True},]
for item indata:if item["Price"]>100 or item["Quantity"]>2 and item["Success"]:print(item)Tecnologia
A instrução if contém dois operadores lógicos. Antes de investigarmos como o Python lida com essa expressão, vamos dar uma olhada em uma tradução em inglês da declaração if: Se o preço do item for superior a US$ 100 ou a quantidade vendida for maior que dois e a venda for bem-sucedida, imprima o item.
Essa frase é ambígua sem mais sinais de pontuação e ainda pode causar confusão mesmo se adicionarmos mais vírgulas na frase. Por exemplo, a transação com a máquina de café deve ser incluída? O preço do item está acima do limite exigido, mas a transação não foi bem-sucedida.
O Python resolveu essa ambiguidade dando ao operador and precedência sobre o operador or. Isso significa que a expressão and é avaliada primeiro, e seu resultado é usado na expressão or.
Portanto, a expressão item["Quantity"] > 2 and item["Success"] é avaliada primeiro. Essa expressão retorna um valor verdadeiro somente para a transação que inclui cabos. Ele é avaliado como falso para os itens restantes.
O valor da expressão and é então usado com o operador or. A expressão or retorna um valor verdadeiro para qualquer item que retorne verdadeiro para a expressão and - essa foi apenas a transação que incluiu cabos - e para itens com preço superior a US$ 100. Há dois itens com preços acima do limite: a máquina de café e os fones de ouvido.
Python: parênteses e operadores lógicos
No entanto, e se precisarmos de transações com itens com preços acima de US$ 100 ou com uma quantidade acima de dois, mas também quisermos garantir que a transação seja bem-sucedida? Nesse caso, queremos que a expressão or tenha precedência sobre a and para que seja avaliada primeiro. Você pode fazer isso usando parênteses ao redor da expressão or:
for item indata:if(item["Price"]>100 or item["Quantity"]>2) and item["Success"]:print(item)Tecnologia
Os parênteses adicionais dão precedência à expressão or. A transação da máquina de café não está mais incluída, pois ela avalia falsamente o segundo operando and.
Python: not tem precedência sobre and e or
O operador not tem precedência sobre and e or. Portanto, o not é avaliado antes dos outros dois operadores lógicos.
Vamos considerar a seguinte instrução if, que inclui not e and:
for item indata:if not item["Success"] and item["Price"]>100:print(item)Tecnologia
Como not é avaliado primeiro, essa expressão aplicará primeiro o operador not a item["Success"]. O valor da expressão not é então usado como o primeiro operando na expressão and. Somente a entrada da máquina de café satisfaz essa condição - essa é a única transação que falhou e tem um preço superior a US$ 100.
No entanto, podemos dar precedência ao operador and usando parênteses:
for item indata:ifnot(item["Success"] and item["Price"]>100):print(item)Tecnologia
Nesse caso, a expressão and é avaliada primeiro. Somente a entrada com fones de ouvido é avaliada em True, pois é a única transação bem-sucedida com um preço acima de US$ 100. No entanto, adicionamos um operador not antes da expressão entre parênteses. Portanto, o código gera as três transações restantes.
Em geral, se uma expressão se tornar muito complexa por ter muitos operadores, é melhor dividi-la para torná-la mais legível.
Conclusão
Os operadores lógicos do Python and, or e not são usados extensivamente em uma ampla gama de aplicativos de programação e ciência de dados. Esses operadores reproduzem o comportamento dos operadores lógicos booleanos AND, OR e NOT, amplamente usados em lógica e matemática.
No entanto, os operadores do Python podem aceitar qualquer objeto e não apenas valores booleanos. Os operadores and e or usam avaliação de curto-circuito e retornam um dos operandos como saída.
Os operadores lógicos do Python são ferramentas essenciais para filtrar dados, identificar recursos em conjuntos de dados e criar regras complexas para controlar o fluxo de um programa. Se você quiser saber mais sobre isso, confira este programa de carreira de nove cursos de Analista de dados com Python.
Perguntas frequentes sobre os operadores lógicos do Python
Posso usar o operador and para testar várias condições de uma vez?⌄
Sim, você pode encadear várias condições usando o operador and. Por exemplo: if x > 5 and x < 10 and x != 7.
Qual é a diferença entre o operador and e o operador AND (&) bit a bit?⌄
O operador and executa uma operação lógica AND em valores booleanos, retornando True somente se ambos os operandos forem True. O operador bit a bit AND (&) executa uma operação bit a bit AND na representação binária de valores inteiros.
Você acha que o Python tem os operadores && e || como algumas outras linguagens?⌄
Não, o Python usa as palavras-chave and e or em vez dos símbolos && e || para operações lógicas.
Aprenda sobre os conjuntos do Python: o que são, como criá-los, quando usá-los, funções incorporadas e sua relação com as operações da teoria dos conjuntos.
O operador de morsa do Python := permite que você atribua um valor a uma variável dentro de uma expressão, combinando atribuição e uso em uma única etapa.
Introdução às estruturas de dados do Python: saiba mais sobre tipos de dados e estruturas de dados primitivas e não primitivas, como strings, listas, pilhas etc.
Aumente o nível de suas habilidades de programação. Você aprenderá a otimizar o código, escrever funções e testes e usar as melhores práticas de engenharia de software.
Descubra os fundamentos da IA, aprenda a usar a IA de forma eficaz no trabalho e mergulhe em modelos como o chatGPT para navegar pelo cenário dinâmico da IA.
Na programação, frequentemente precisamos tomar decisões com base em várias condições. Por exemplo, talvez você queira executar uma determinada ação somente se várias condições forem atendidas simultaneamente. Como alternativa, talvez você queira acionar uma ação alternativa se uma das várias condições for atendida.
O Python oferece um conjunto de operadores lógicos -
and,or,not- para que você possa lidar com esses cenários.Neste tutorial, aprenderemos como funcionam os operadores lógicos do Python e como você pode usá-los na programação e na ciência de dados. Observe que usaremos as palavras em maiúsculas AND, OR e NOT para representar esses operadores conceitualmente. E vamos nos referir às palavras-chave do Python usando esta convenção:
and,or, enot.Se você está procurando um currículo de Python com curadoria, confira este programa de seis cursos de habilidades de programação em Python.
Antes de entrar em detalhes, vamos começar com uma resposta muito breve para você que está com pressa.
Resposta curta: O que são os operadores lógicos do Python?
Os operadores lógicos do Python (
and,or,not) são palavras-chave especiais que atuam como conjunções em nosso código, conectando e avaliando várias condições em uma única expressão.Considere este exemplo:
Aqui, o operador and garante que a mensagem seja impressa somente se
bothcondições forem atendidas: a temperatura está acima de 20 grausande está ensolarado.Vejamos outro exemplo usando o operador
or:Nesse caso, sairemos para uma caminhada se estiver ensolarado ou se tivermos um guarda-chuva.
Por fim, o operador
notinverte o valor verdadeiro de uma condição:Aqui, a mensagem é impressa somente se não estiver ensolarada.
Os operadores lógicos nos dão uma maneira concisa e poderosa de expressar condições complexas, permitindo que nossos programas tomem decisões com base em vários fatores. Agora, vamos dar uma olhada mais profunda e começar com o operador lógico
and.Python: Os
andOperadorNa lógica booleana, a operação AND envolve a comparação de dois valores ou expressões. Ele produz um resultado verdadeiro somente se ambos os valores forem verdadeiros. Se um ou ambos os valores forem falsos, o resultado da operação AND será falso. Aqui está um resumo de como o AND se comporta:
Operação
Valor de saída
verdadeiro E verdadeiro
verdadeiro
verdadeiro E falso
falso
falso E verdadeiro
falso
falso E falso
falso
Você pode recriar essa tabela verdade com o operador
anddo Python:A variável
optionscontém os dois valores booleanos. Os loopsforaninhados iteram as opções duas vezes para criar todas as permutações deTrueeFalse.Geralmente, as expressões usadas como operandos para and incluem operadores de comparação ou igualdade:
O nome será impresso somente se tiver menos de cinco letras e começar com
"J". Ambos os requisitos devem ser atendidos.Os operadores de comparação e igualdade, como
<e==, são avaliados comoTrueouFalse.No entanto, o operador Python
andfunciona em qualquer tipo de dados e não apenas nos booleanosTrueeFalse. O valor de saída também pode ser qualquer tipo de dados.Vamos explorar o operador
anddo Python em mais detalhes nesta seção. Primeiro, discutiremos a veracidade.Python: verdadeiro e falso
Todo objeto Python pode ser convertido em um tipo booleano usando o built-in
bool(). Um objeto é verdadeiro sebool(object)retornarTrue. Para um objeto falso,bool(object)retornaFalse.O operador
anddo Python analisa a veracidade de seus operandos. Se ambos os operandos forem verdadeiros, o operadorandtambém retornará um valor verdadeiro. Se um ou ambos os operandos forem falsos,andretornará um valor falso. Vamos dar uma olhada em alguns exemplos:Agora, vamos considerar este exemplo:
E vamos dar uma olhada neste último exemplo:
Os tipos numéricos, como inteiros e floats, são verdadeiros se forem diferentes de zero e falsos quando iguais a zero. As sequências, assim como as cadeias de caracteres, são verdadeiras quando não são vazias e falsas quando são vazias.
Portanto, somente o primeiro dos três exemplos acima satisfaz a condição de que ambos os operandos devem ser verdadeiros para que o operador
andseja avaliado como verdadeiro.O operador
andnem sempre retorna um valor booleano. Uma expressão que incluiandtambém pode ser avaliada como um dos operandos. Vamos nos aprofundar mais nisso usando os mesmos exemplos que usamos anteriormente. Em vez de usar as expressõesandem uma instruçãoif, nós as avaliaremos diretamente:Você consegue identificar o que está acontecendo com essas expressões?
Vamos começar com o último dos três exemplos, que tem
0e"python"como os dois operandos. O operadorandestá procurando por dois operandos verdadeiros. Como a primeira é0, ela é falsa. Não é necessário que o programa verifique o segundo operador, pois toda a expressão será falsa, independentemente do valor do segundo operando.No entanto, o operador
andnão retornaFalse. Em vez disso, ele retorna o primeiro operando diretamente. Como o primeiro operando é falso, toda a expressãoandé avaliada como falsa. Isso não causa nenhum problema no Python, pois em situações em que o Python requer um valor verdadeiro ou falso, ele pode usar a veracidade de um objeto.No primeiro exemplo, o primeiro operando é
42, que é verdadeiro. O programa avalia o segundo operando e o retorna. Como o segundo operando é a cadeia de caracteres"python", que é verdadeira, a expressão inteira é avaliada como verdadeira.No segundo exemplo, o primeiro operando também é
42. Como é verdadeiro, o programa avalia e retorna o segundo operando, que é a string vazia. A string vazia é falsa e, portanto, toda a expressãoandé avaliada como falsa.Quando o primeiro operando é verdadeiro, o operador
andsempre retorna o valor do segundo operando, quer o segundo operando seja verdadeiro ou falso.Quando o primeiro operando é falso, o Python não avalia o segundo operando. Isso é chamado de curto-circuito e é uma forma de avaliação preguiçosa. Você pode confirmar isso com o seguinte código:
O segundo operando é
5/0, que normalmente geraria umZeroDivisionError. No entanto, a expressão5/0não é avaliada neste exemplo, pois o primeiro operando é falso. A exceção nunca é levantada.Exemplo: A loja on-line dos programadores
Vamos considerar um exemplo simples que representa um aplicativo da vida real. As transações em uma loja on-line que fornece produtos para programadores são registradas e acessadas por meio de uma API. Os dados são convertidos em uma lista de dicionários. Cada item da lista representa uma transação e cada transação é um dicionário que contém informações relevantes:
Cada transação inclui o nome e o preço do item, a quantidade incluída no pedido e se a transação foi bem-sucedida.
Vamos supor que precisamos de transações bem-sucedidas para itens com preço igual ou superior a US$ 100. Podemos usar o operador
andpara filtrar as linhas de que precisamos:A saída desse código mostra a única transação que atende a ambos os requisitos. Para cada item da lista de transações, a instrução
ifverifica a veracidade de duas expressões:"Success"em cada dicionário sãoTrueouFalse.item["Price"] >= 100também retornaTrueouFalse.O livro Python e os cabos não atendem ao requisito de preço, pois custam menos de US$ 100. A máquina de café está acima desse limite de preço, mas essa transação não foi bem-sucedida e, portanto, foi excluída da impressão.
Voltaremos a esse exemplo de loja on-line mais adiante neste tutorial.
Na seção a seguir, vamos nos concentrar no operador
or.Python: Os
orOperadorO operador lógico OR na lógica booleana precisa de dois operandos. É avaliado como verdadeiro se pelo menos um dos operandos for verdadeiro:
Operação
Valor de saída
verdadeiro OU verdadeiro
verdadeiro
verdadeiro OU falso
verdadeiro
falso OU verdadeiro
verdadeiro
falso OU falso
falso
Podemos recriar essa tabela verdade usando o operador
ordo Python:Também podemos revisitar o exemplo com nomes de pessoas que exploramos anteriormente, mas substituindo o operador
andpor umor:A declaração
ifagora contém uma expressãoor. Portanto, o loopforimprime todos os nomes que têm menos de cinco letras ou que começam com a letra"J". A string"Jane"atende a ambos os requisitos. Os outros nomes impressos atendem a um dos dois requisitos.Python
oroperador: verdadeiro e falsoO operador or também procura valores verdadeiros e falsos, e não apenas os booleanos
TrueeFalse. Vamos dar uma olhada em alguns exemplos:Agora vamos considerar este exemplo:
E vamos considerar também este último exemplo:
No primeiro exemplo, o número inteiro
42e a lista não vazia[10, 20, 30]são verdadeiros. Como o operadororprecisa que pelo menos um operando seja verdadeiro, a expressão inteira é avaliada como verdadeira.No segundo exemplo,
42é verdadeiro, mas a lista vazia[]é falsa, pois é uma sequência vazia. Como um dos dois operandos é verdadeiro, toda a expressão or é avaliada como verdadeira.No exemplo final, tanto
0quanto[]são falsos. Portanto, a expressão inteira é avaliada como falsa.O operador
ortambém usa curto-circuito ao avaliar a expressão para evitar avaliações desnecessárias. Vamos dar uma olhada em alguns exemplos para ilustrar esse ponto:No primeiro exemplo, o primeiro operando é
42, que é verdadeiro. Como o siteorexige que apenas um operando seja verdadeiro para determinar a veracidade final de toda a expressão, esse primeiro operando é retornado imediatamente. O segundo operando não é avaliado, pois seu valor não tem efeito sobre o resultado final. O operador or retorna o primeiro operando,42, e não o booleanoTrue. Em Python, qualquer valor verdadeiro tem o mesmo efeito que o booleanoTrueem situações como as declaraçõesife while.No segundo exemplo, o primeiro operando também é
42, e a expressão retorna esse número inteiro mesmo que o segundo operando seja falso.No terceiro e quarto exemplos, o primeiro operando é a lista vazia, que é falsa. Portanto, o segundo operando é retornado em ambos os casos.
Exemplo: A loja on-line dos programadores
Vamos revisar as transações da loja on-line que vende produtos para programadores. Aqui estão as quatro transações de amostra que estamos usando neste exemplo:
Você precisa identificar algumas transações para investigar melhor o comportamento do cliente. Você deseja encontrar as transações que falharam ou que incluem um item com preço abaixo de US$ 75. Como você tem duas condições e só exige que uma transação atenda a pelo menos uma delas, você pode usar o operador
or:Esse loop
forexibe as linhas que correspondem a pelo menos um dos requisitos. O livro Python e os cabos estão incluídos, pois seu preço é inferior a US$ 75. A máquina de café está incluída, pois a transação não foi bem-sucedida.Há uma maneira alternativa de filtrar as transações malsucedidas, que exploraremos na seção a seguir.
Python: Os
notOperadorO operador NOT é diferente de AND e OR, pois requer apenas um operando. NOT converte verdadeiro em falso e vice-versa. Aqui está a tabela verdade para NOT:
Operação
Valor de saída
NÃO verdadeiro
falso
NÃO falso
verdadeiro
Você pode replicar isso usando o operador
notdo Python:Python
notoperador: verdadeiro e falsoAssim como em
andeor, o operando usado emnotnão precisa ser um booleano. Como qualquer objeto é verdadeiro ou falso, qualquer objeto pode ser usado comnot.Vejamos também este exemplo:
Os valores verdadeiros são convertidos para
Falsecom o operadornote os valores falsos são convertidos paraTrue.Ao contrário de
andeor, o operadornotsempre retorna um objeto booleano:Exemplo: A loja on-line dos programadores
Nas seções anteriores, usamos as transações de uma loja on-line. Neste exemplo, queremos exibir todas as transações malsucedidas. Uma opção é usar o operador de igualdade
==para verificar sedata["Success"]é igual aFalse. No entanto, você também pode usar o operadornot:Como
item["Success"]é igual aFalsepara as transações malsucedidas, nãoitem["Success"]retornaTrue. Portanto, o loop for imprime as transações malsucedidas:Na seção a seguir, aprenderemos a combinar vários operadores lógicos em uma única expressão.
Python: Precendência do operador
Nos exemplos mostrados até agora, usamos apenas um dos operadores lógicos em cada instância. Nesta seção, veremos o que acontece quando combinamos mais operadores lógicos em uma única expressão.
Python:
andtem precedência sobreorContinuaremos a trabalhar nas transações da loja on-line que usamos anteriormente. Vamos tentar a seguinte declaração condicional:
A instrução
ifcontém dois operadores lógicos. Antes de investigarmos como o Python lida com essa expressão, vamos dar uma olhada em uma tradução em inglês da declaraçãoif: Se o preço do item for superior a US$ 100 ou a quantidade vendida for maior que dois e a venda for bem-sucedida, imprima o item.Essa frase é ambígua sem mais sinais de pontuação e ainda pode causar confusão mesmo se adicionarmos mais vírgulas na frase. Por exemplo, a transação com a máquina de café deve ser incluída? O preço do item está acima do limite exigido, mas a transação não foi bem-sucedida.
O Python resolveu essa ambiguidade dando ao operador
andprecedência sobre o operadoror. Isso significa que a expressãoandé avaliada primeiro, e seu resultado é usado na expressãoor.Portanto, a expressão
item["Quantity"] > 2 and item["Success"]é avaliada primeiro. Essa expressão retorna um valor verdadeiro somente para a transação que inclui cabos. Ele é avaliado como falso para os itens restantes.O valor da expressão and é então usado com o operador
or. A expressãoorretorna um valor verdadeiro para qualquer item que retorne verdadeiro para a expressãoand- essa foi apenas a transação que incluiu cabos - e para itens com preço superior a US$ 100. Há dois itens com preços acima do limite: a máquina de café e os fones de ouvido.Python: parênteses e operadores lógicos
No entanto, e se precisarmos de transações com itens com preços acima de US$ 100 ou com uma quantidade acima de dois, mas também quisermos garantir que a transação seja bem-sucedida? Nesse caso, queremos que a expressão
ortenha precedência sobre aandpara que seja avaliada primeiro. Você pode fazer isso usando parênteses ao redor da expressãoor:Os parênteses adicionais dão precedência à expressão
or. A transação da máquina de café não está mais incluída, pois ela avalia falsamente o segundo operandoand.Python:
nottem precedência sobreandeorO operador
nottem precedência sobreandeor. Portanto, onoté avaliado antes dos outros dois operadores lógicos.Vamos considerar a seguinte instrução if, que inclui
noteand:Como
noté avaliado primeiro, essa expressão aplicará primeiro o operador not aitem["Success"]. O valor da expressãonoté então usado como o primeiro operando na expressão and. Somente a entrada da máquina de café satisfaz essa condição - essa é a única transação que falhou e tem um preço superior a US$ 100.No entanto, podemos dar precedência ao operador
andusando parênteses:Nesse caso, a expressão
andé avaliada primeiro. Somente a entrada com fones de ouvido é avaliada emTrue, pois é a única transação bem-sucedida com um preço acima de US$ 100. No entanto, adicionamos um operadornotantes da expressão entre parênteses. Portanto, o código gera as três transações restantes.Em geral, se uma expressão se tornar muito complexa por ter muitos operadores, é melhor dividi-la para torná-la mais legível.
Conclusão
Os operadores lógicos do Python
and,orenotsão usados extensivamente em uma ampla gama de aplicativos de programação e ciência de dados. Esses operadores reproduzem o comportamento dos operadores lógicos booleanos AND, OR e NOT, amplamente usados em lógica e matemática.No entanto, os operadores do Python podem aceitar qualquer objeto e não apenas valores booleanos. Os operadores
andeorusam avaliação de curto-circuito e retornam um dos operandos como saída.Os operadores lógicos do Python são ferramentas essenciais para filtrar dados, identificar recursos em conjuntos de dados e criar regras complexas para controlar o fluxo de um programa. Se você quiser saber mais sobre isso, confira este programa de carreira de nove cursos de Analista de dados com Python.