Operadores - ferramentas de manipulação de dados

Avatar do usuário
bernardino
Site Admin
Mensagens: 682
Registrado em: 28 Ago 2020, 15:11

Operadores - ferramentas de manipulação de dados

Mensagem por bernardino »

Bem-vindo à seção três, na qual falaremos sobre operadores Python.

Python como uma calculadora

Agora, vamos mostrar a você um lado completamente novo da função print(). Você já sabe que a função é capaz de mostrar os valores dos literais passados a ela por argumentos.

Na verdade, ele pode fazer algo mais. Confira o trecho:

Código: Selecionar todos

print(2+2)
Redigite o código no editor e execute-o. Você consegue adivinhar o resultado?
calculadora.png
calculadora.png (7.46 KiB) Exibido 51 vezes
Você deve ver o número quatro. Sinta-se à vontade para experimentar outros operadores.

Sem levar isso a sério, você acabou de descobrir que o Python pode ser usado como uma calculadora. Não é muito prático, e definitivamente não é de bolso, mas mesmo assim uma calculadora.

Levando isso mais a sério, agora estamos entrando na província de operadores e expressões.
Algumas pessoas acham que foco significa dizer sim para a coisa em que você vai se focar.
Mas não é nada disso.
Significa dizer não às centenas de outras boas ideias que existem.
Você precisa selecionar cuidadosamente.”

Steve Jobs
Avatar do usuário
bernardino
Site Admin
Mensagens: 682
Registrado em: 28 Ago 2020, 15:11

Re: Operadores - ferramentas de manipulação de dados

Mensagem por bernardino »

Operadores básicos

Um operador é um símbolo da linguagem de programação, capaz de operar com os valores.

Por exemplo, assim como na aritmética, o sinal de + (mais) é o operador que é capaz de adicionar dois números, dando o resultado da adição.

Nem todos os operadores Python são tão óbvios quanto o sinal de mais, então vamos ver alguns dos operadores disponíveis no Python, e vamos explicar quais regras regem o uso e como interpretar as operações que realizam.

Vamos começar com os operadores que estão associados às operações aritméticas mais amplamente reconhecidas:

Código: Selecionar todos

+
-
*
/
//
%
**
A ordem de aparência não é acidental. Falaremos mais sobre isso depois de passar por todos eles.

Lembre-se: os dados e os operadores, quando conectados, formam expressões. A expressão mais simples é um literal em si.

Exponenciação

Veja o exemplo a seguir no editor:
exponenciacao.png
exponenciacao.png (14.98 KiB) Exibido 44 vezes
Nota: Recebemos os asteriscos duplos com espaços em nossos exemplos. Não é obrigatório, mas melhora a legibilidade do código.

Os exemplos mostram uma característica muito importante de praticamente todos os operadores numéricos do Python.

Execute o código e observe cuidadosamente os resultados que produz. Você pode ver alguma regularidade aqui?

Lembre-se: É possível formular as seguintes regras com base neste resultado:
  • Quando os dois ** argumentos são inteiros, o resultado também é um número inteiro;
  • Quando pelo menos um argumento ** é um float, o resultado também é um float.
Esta é uma distinção importante para se lembrar.

Multiplicação

Um sinal de * (asterisco) é um operador de multiplicação.

Execute o código abaixo e verifique se nossa regra de número inteiro vs. flutuante ainda está funcionando.
multiplicacao.png
multiplicacao.png (14.05 KiB) Exibido 40 vezes

Divisão

Um sinal / (barra) é um operador de divisão.

O valor na frente da barra é um dividendo, o valor atrás da barra, um divisor.

Execute o código abaixo e analise os resultados.
divisao.png
divisao.png (14.83 KiB) Exibido 38 vezes
Você verá que há uma exceção à regra.

O resultado produzido pelo operador de divisão é sempre um float, independentemente de parecer ou não ser um flutuante à primeira vista: 1 / 2, ou se parece com um inteiro puro: 2 / 1.

Isso é um problema? Sim, o limite continua igual. Às vezes acontece que você realmente precisa de uma divisão que forneça um valor inteiro, não um valor flutuante.

Felizmente, o Python pode ajudá-lo com isso.

Divisão de número inteiro (divisão arredondada)

Um sinal // (barra dupla) é um operador de divisão inteira. Difere do padrão / operador em dois detalhes:
  • seu resultado não possui a parte fracionária ‒ está ausente (para inteiros), ou é sempre igual a zero (para flutuantes); isso significa que os resultados são sempre arredondados;
  • ele está de acordo com a regra integer vs. float.
Execute o exemplo abaixo e veja os resultados:
divisao2.png
divisao2.png (14.56 KiB) Exibido 38 vezes
Como você pode ver, a divisão de inteiro por inteiro dá um resultado inteiro. Todos os outros casos produzem floats.

Vamos fazer alguns testes mais avançados.

Observe o trecho a seguir:
divisao3.png
divisao3.png (9.7 KiB) Exibido 38 vezes
Imagine que usamos / em vez de // - você poderia prever os resultados?

Sim, seria 1.5 em ambos os casos. Isso é claro.

Mas que resultados devemos esperar com a // divisão?

Execute o código e veja por si mesmo.

O que obtemos são dois uns - um inteiro e um flutuador.

O resultado da divisão do número inteiro é sempre arredondado para o valor inteiro mais próximo que é menor que o resultado real (não arredondado).

Isso é muito importante: o arredondamento sempre vai para o número inteiro menor.

Observe o código abaixo e tente prever os resultados mais uma vez:
divisao4.png
divisao4.png (10.52 KiB) Exibido 38 vezes
Nota: alguns valores são negativos. Obviamente, isso afetará o resultado. Mas como?

O resultado é dois pares negativos. O resultado real (não arredondado) é -1.5 em ambos os casos. No entanto, os resultados são sujeitos a arredondamento. O arredondamento vai em direção ao valor inteiro menor, e o valor inteiro menor é -2, portanto: -2 e -2.0.

Observação

A divisão inteira também pode ser chamada de divisão de piso. Você definitivamente vai encontrar esse termo no futuro.

Restante (módulo)

O próximo operador é bastante peculiar, porque não tem equivalente entre os operadores aritméticos tradicionais.

Sua representação gráfica em Python é o sinal de % (percentual), que pode parecer um pouco confuso.

Tente pensar nisso como uma barra (operador de divisão) acompanhada de dois pequenos círculos engraçados.

O resultado do operador é o restante após a divisão do número inteiro.

Em outras palavras, é o valor que falta depois de dividir um valor por outro para produzir um quociente inteiro.

Nota: o operador às vezes é chamado de módulo em outras linguagens de programação.

Dê uma olhada no snippet - tente prever o resultado e execute-o:
restante.png
restante.png (8.52 KiB) Exibido 36 vezes
Como você pode ver, o resultado é dois. É por isso que:
  • 14 // 4 dá 3 → este é o quociente inteiro;
  • 3 * 4 dá 12 → como resultado da multiplicação de quociente e divisor;
  • 14 - 12 dá 2 → este é o restante.
Este exemplo é um pouco mais complicado:

Código: Selecionar todos

print(12 % 4.5)
Qual é o resultado?

3.0 – não 3 mas 3.0. A regra ainda funciona:
  • 12 // 4.5 dá 2.0,
  • 2.0 * 4.5 dá 9.0,
  • 12 - 9.0 dá 3.0.
Como não dividir

Como você provavelmente sabe, a divisão por zero não funciona.

Não tente:
  • realizar uma divisão por zero;
    realizar uma divisão inteira por zero;
    encontre o resto de uma divisão por zero.
Adição

O operador de adição é o sinal de + (mais), que está totalmente de acordo com os padrões matemáticos.

Novamente, dê uma olhada no snippet do programa abaixo:
adicao.png
adicao.png (10.34 KiB) Exibido 14 vezes
O resultado não deve ser surpreendente. Execute o código para verificá-lo.

O operador de subtração, os operadores unários e binários

O operador de subtração é obviamente o sinal - (menos), embora você deva notar que esse operador também tem outro significado - ele pode alterar o sinal de um número.

Esta é uma grande oportunidade para apresentar uma distinção muito importante entre operadores unários e binários.

Ao subtrair aplicações, o operador menos espera dois argumentos: o esquerdo (um minuendo em termos aritméticos) e o direito (um subtraendo).

Por esta razão, o operador de subtração é considerado um dos operadores binários, assim como os operadores de adição, multiplicação e divisão.

Mas o operador menos pode ser usado de uma forma diferente (unária) ‒ dê uma olhada na última linha do trecho abaixo:
menos.png
menos.png (11.66 KiB) Exibido 11 vezes
A propósito: também há um operador + unário. Você pode usá-lo assim:

Código: Selecionar todos

print(+2)
O operador preserva o sinal de seu único argumento - o correto.

Embora essa construção seja sintaticamente correta, usá-la não faz muito sentido e seria difícil encontrar uma boa lógica para isso.

Dê uma olhada no snippet acima - você consegue adivinhar o resultado?
Algumas pessoas acham que foco significa dizer sim para a coisa em que você vai se focar.
Mas não é nada disso.
Significa dizer não às centenas de outras boas ideias que existem.
Você precisa selecionar cuidadosamente.”

Steve Jobs
Avatar do usuário
bernardino
Site Admin
Mensagens: 682
Registrado em: 28 Ago 2020, 15:11

Re: Operadores - ferramentas de manipulação de dados

Mensagem por bernardino »

Operadores e suas prioridades

Até agora, tratamos cada operador como se não tivesse nenhuma conexão com os outros. Obviamente, uma situação tão simples e ideal é uma raridade na programação real.

Além disso, muitas vezes você encontrará mais de um operador em uma expressão e, em seguida, as coisas não serão mais tão simples.

Considere a seguinte expressão:

Código: Selecionar todos

2 + 3 * 5
Você provavelmente se lembra da escola que as multiplicações precedem as adições.

Você certamente se lembra que primeiro deve multiplicar 3 por 5 e, mantendo o 15 na memória, adicione-o a 2, obtendo assim o resultado de 17.

O fenômeno que faz com que alguns operadores ajam antes de outros é conhecido como a hierarquia de prioridades.

O Python define com precisão as prioridades de todos os operadores e assume que os operadores de prioridade mais alta executam suas operações antes dos operadores de prioridade mais baixa.

Então, se você sabe que * tem uma prioridade mais alta que +, o cálculo do resultado final deve ser óbvio.

Operadores e suas ligações

A ligação do operador determina a ordem das computações executadas por alguns operadores com igual prioridade, colocados lado a lado em uma expressão.

A maioria dos operadores do Python tem ligação do lado esquerdo, o que significa que o cálculo da expressão é realizado da esquerda para a direita.

Este exemplo simples vai mostrar como ele funciona. Dê uma olhada:

Código: Selecionar todos

print(9 % 6 % 2)
Há duas maneiras possíveis de avaliar essa expressão:
  • da esquerda para a direita: primeiro 9 % 6 dá 3, e então 3 % 2 dá 1;
  • da direita para a esquerda: primeiro 6 % 2 dá 0 e depois 9 % 0 causa um erro fatal.
Execute o exemplo e veja o que você obtém.
expressao.png
expressao.png (8.23 KiB) Exibido 10 vezes
O resultado deve ser 1. Este operador tem ligação do lado esquerdo. Mas há uma exceção interessante.

Repita o experimento, mas agora com exponenciação.

Use este trecho de código:
exponenciacao2.png
exponenciacao2.png (8.41 KiB) Exibido 10 vezes
Os dois resultados possíveis são:
  • 2 ** 2 → 4; 4 ** 3 → 64
  • 2 ** 3 → 8; 2 ** 8 → 256
Execute o código. O que você vê?

O resultado mostra claramente que o operador de exponenciação usa a associação do lado direito.

Isso tem um efeito interessante. Se o operador de exponenciação usar a associação pelo lado direito, você consegue adivinhar a saída do seguinte fragmento?

Código: Selecionar todos

print(-3 ** 2)
print(-2 ** 3)
print(-(3 ** 2))
Resposta

Código: Selecionar todos

-9
-8
-9
Lista de prioridades

Já que você é novo nos operadores Python, não queremos apresentar a lista completa de prioridades do operador agora.

Em vez disso, mostraremos um formulário truncado e o expandiremos de forma consistente ao apresentarmos novos operadores.

Veja a tabela abaixo:
prioridade.png
prioridade.png (20.52 KiB) Exibido 10 vezes
Nota: enumeramos os operadores em ordem das prioridades mais altas (1) às mais baixas (4).

Tente trabalhar com a seguinte expressão:

Código: Selecionar todos

print(2 * 3 % 5)
Ambos os operadores (* e %) têm a mesma prioridade, portanto, o resultado pode ser adivinhado apenas quando você sabe a direção da encadernação. O que você acha? Qual é o resultado?
Operadores e parênteses

Claro, você sempre pode usar parênteses, o que pode alterar a ordem natural de um cálculo.

De acordo com as regras aritméticas, subexpressões entre parênteses são sempre calculadas primeiro.

Você pode usar quantos parênteses precisar, e eles geralmente são usados para melhorar a legibilidade de uma expressão, mesmo que não alterem a ordem das operações.

Veja um exemplo de expressão com vários parênteses:

Código: Selecionar todos

print((5 * ((25 % 13) + 100) / (2 * 13)) // 2)
Tente calcular o valor impresso no console. Qual é o resultado da função print()?

Código: Selecionar todos

10.0
Algumas pessoas acham que foco significa dizer sim para a coisa em que você vai se focar.
Mas não é nada disso.
Significa dizer não às centenas de outras boas ideias que existem.
Você precisa selecionar cuidadosamente.”

Steve Jobs
Avatar do usuário
bernardino
Site Admin
Mensagens: 682
Registrado em: 28 Ago 2020, 15:11

Re: Operadores - ferramentas de manipulação de dados

Mensagem por bernardino »

TESTE DA SEÇÃO

Pergunta 1: Qual é a saída esperada do trecho a seguir?

Código: Selecionar todos

print((2 ** 4), (2 * 4.), (2 * 4))
Pergunta2: Qual é a saída do trecho a seguir?

Código: Selecionar todos

print((-2 / 4), (2 / 4), (2 // 4), (-2 // 4))
Pergunta 3: Qual é a saída esperada do trecho a seguir?

Código: Selecionar todos

print((2 % -4), (2 % 4), (2 ** 3 ** 2))
Algumas pessoas acham que foco significa dizer sim para a coisa em que você vai se focar.
Mas não é nada disso.
Significa dizer não às centenas de outras boas ideias que existem.
Você precisa selecionar cuidadosamente.”

Steve Jobs
Avatar do usuário
bernardino
Site Admin
Mensagens: 682
Registrado em: 28 Ago 2020, 15:11

Re: Operadores - ferramentas de manipulação de dados

Mensagem por bernardino »

Resposta 1

Código: Selecionar todos

print((2 ** 4), (2 * 4.), (2 * 4))
Resposta 2

Código: Selecionar todos

-0.5 0.5 0 -1
Resposta 3

Código: Selecionar todos

-2 2 512
Continuar a leitura: 2.4 Seção 4 - Variáveis
Algumas pessoas acham que foco significa dizer sim para a coisa em que você vai se focar.
Mas não é nada disso.
Significa dizer não às centenas de outras boas ideias que existem.
Você precisa selecionar cuidadosamente.”

Steve Jobs
Responder