1.3. Introdução À Lógica de Programação em Python
1.3. Introdução À Lógica de Programação em Python
Considere a seguinte situação: suponha que você foi contratado para trabalhar em uma empresa de
engenharia. Lá, sua primeira tarefa vai ser construir o algoritmo que calcula o volume de um
paralelepípedo, cujas características (base, largura e altura) serão apresentadas pelo usuário.
Se você voltar ao tempo de ensino fundamental, nas aulas de Matemática, vai lembrar que a equação
do volume de um paralelepípedo é:
Com esses 3 grupos definidos, fica fácil também construir o fluxograma desse algoritmo, conforme
apresentado:
Perceba que há um algoritmo com um processamento levemente mais complexo. Contudo, se você
seguir um passo a passo de entendimento e escrita dele, fica fácil entender o seu funcionamento.
Então, agora que o algoritmo foi descrito detalhadamente, que tal implementá-lo? Confira como fazer
isso na próxima página.
Primeiro, você pode criar uma célula no Jupyter Notebook para cada uma das fases listadas
anteriormente. A célula contendo a parte da entrada contém três linhas, conforme apresentado a
seguir:
Vencida a fase de entrada do algoritmo, siga para a parte de processamento. Ela contém uma linha de
código conforme apresentado a seguir:
Nessa única linha, foram feitas 2 operações de multiplicação e atribuído o valor resultante à variável
volume. Ela é um bom exemplo de uma expressão complexa contendo mais de uma operação sendo
executada em uma linha de código. Por isso, Python e muitas outras linguagens possibilitam a
construção de expressões com diversos operadores. Por fim, você pode apresentar o resultado por
meio das duas linhas a seguir:
6 print(volume)
Assim, nas duas linhas finais do trecho de código, é impressa em tela a mensagem 'O volume calculado
é:', e na linha a seguir é impresso o valor armazenado em volume. Bem simples, não é mesmo? Pronto,
como você fez essa tarefa super bem, vamos retornar à situação proposta, pois eles pedirão para que
você faça um cálculo mais complexo. Confira qual será essa próxima tarefa na página seguinte.
Sabendo que você estudou bastante e que um colega teve que assumir outras atividades, você
precisou continuar a implementação da fórmula de Bhaskara. Revendo seus livros de Matemática,
você se lembrou da fórmula que é apresentada a seguir:
Δ = b² - 4 a c x¹ = -b + √∆ __________ 2a
x² = +b + √∆ __________ 2a
Felizmente, como você vai continuar a implementação, a fase de entrada do algoritmo já está
implementada! Seu colega já fez a leitura dos valores de a, b e c e até já fez o primeiro passo do
processamento, calculando o valor de delta e armazenando o valor da raiz quadrada de delta na
variável raiz_delta. Assim, o próximo passo é calcular o valor de x’. Aí começarão os desafios.
Você sabe fazer no papel uma sequência de operações de multiplicação, divisão e soma, para chegar
ao resultado correto de x’ e de x” , mas como expressar isso em uma linha de código Python? Essa é
uma questão importante de se responder.
A seguir, você vai estudar como expressar uma sequência de operações e como Python as interpreta.
O mecanismo utilizado é chamado de precedência de operadores e define em que ordem as
operações serão executadas em uma dada expressão. Conheça, logo mais, a lista dos operadores
disponíveis em Python e descubra qual a precedência deles. Depois desse estudo, retornaremos essa
implementação e você vai conseguir entender cada pedaço de código. Vamos lá?
Operadores em Python
O primeiro grupo que será apresentado é o dos operadores aritméticos, que operam sobre duas
variáveis, ou seja, são binários, e retornam um terceiro valor resultante da operação. Acompanhe o
quadro a seguir, onde a primeira coluna (da esquerda) apresenta um operador aritmético válido em
Python, a segunda (do meio) contém a definição da operação aritmética e a terceira coluna (da direita)
apresenta a forma como são escritas as operações em uma expressão Python, sendo x e y variáveis
quaisquer.
A seguir temos uma tabela onde, para cada linha, existe um operador aritmético, uma operação, uma
expressão e, por fim, uma célula vazia. Assumindo que x é uma variável com valor 1.0 e y tem valor
4.0, qual o resultado das operações listadas a seguir? Preencha as células vazias e verifique suas
respostas.
Além disso, os operadores de soma (+) e de subtração (–) também podem ser utilizados de forma
unária, ou seja, apenas com um operando. O sinal de mais unário gera o mesmo valor do operando
em que é aplicado, já o de subtração unário troca o sinal do valor numérico. Por exemplo, caso a
variável x tenha valor -1, + x retorna -1 e –x retorna 1, ou seja, troca-se o sinal de x.
Já os operadores de atribuição, como o próprio nome anuncia, atribuem valores a variáveis. Além
disso, em suas versões mais complexas, eles servem para fazer uma operação aritmética com o valor
de uma variável e depois armazenar o resultado na própria variável. Pense nesse conceito como sendo
a atualização do valor armazenado em uma variável. A tabela a seguir apresenta 4 colunas, a primeira
(à esquerda) contém um operador de atribuição, a segunda coluna (ao lado) contém a descrição da
operação de atribuição efetuada quando se usa tal operador, a terceira (posterior) contém um
exemplo de como utilizá-lo e a quarta (à direita) apresenta a interpretação de como deve ser
entendido o exemplo. Essa interpretação também é uma expressão válida em Python!
Quando perguntam se você está com fome, só há duas respostas possíveis: sim ou não. Chamamos
valores dos tipos Sim ou Não, Verdadeiro ou Falso e 0 ou 1 de valores lógicos ou booleanos. Em Python,
variáveis do tipo bool armazenam valores booleanos, podendo ser True (verdadeiro) ou False (falso).
Assim, se você quiser que a variável x armazene um valor verdadeiro, você deve escrever x = True,
caso contrário x = False.
Sabendo que há variáveis booleanas, você vai aprender a usar operadores que as manipulam, os
chamados operadores lógicos. Eles testam condições lógicas e retornam um valor do tipo bool, uma
variável booleana. Em Python, eles são apenas 3 e são exatamente a tradução para inglês do que
fazem. Lembre-se de que variáveis booleanas só podem ser True ou False. Então, a aplicação desses
operadores também apenas retorna True ou False:
x and y: o operador and (e) testa se as variáveis x e y são verdadeiras. Caso as duas sejam verdadeiras,
ele retorna True. Se pelo menos uma delas for falsa, ele retorna False.
not x: o operador not (não) retorna a negação da variável x. Caso ela seja verdadeira, o operador
retorna False. Caso seja falsa, ele retorna True.
Geralmente, esses operadores são utilizados quando é necessário alguma decisão a partir da
comparação de dois valores quaisquer. Quando você estiver estudando desvios condicionais, eles
serão muito uteis! A tabela a seguir apresenta 4 colunas: a primeira (à esquerda) contém um operador
relacional, a segunda coluna (ao lado) contém a descrição da operação de comparação efetuada
quando se usa tal operador, a terceira (posterior) contém um exemplo de como utilizá-lo e a quarta
(à direita) apresenta a interpretação de como deve ser entendido o exemplo. Conheça cada um e
compreenda como podem ser aplicados.
A seguir temos uma tabela onde, para cada linha, existe um operador relacional, uma expressão e por
fim uma célula vazia. Assumindo que x é uma variável contendo o valor 2, e y é outra contendo 3,
calcule os resultados das operações relacionais de cada um dos operadores listados na tabela a seguir.
Operador Exemplo Valor calculado (True ou False)
== x == y False
!= x != y True
> x>y False
>= x >= y False
< x<y True
<= x <= y True
Um dado importante, discutido brevemente nas páginas anteriores, é que os computadores utilizam
o sistema binário, também chamado de base binária, para representar números. Nesse sistema,
qualquer valor numérico é armazenado como uma sequência de 0’s e 1’s. Já os humanos utilizam o
sistema decimal para tal representação. Sem aprofundar na Matemática necessária para converter
valores entre o sistema decimal e o sistema binário, temos a informação de que 4 (quatro) na base
binária é representado por 100 (cem), 14 (quatorze) é representado por 1110 (mil cento e dez), 25
(vinte e cinco) é 11001 (onze mil e um) e assim por diante.
Nos computadores, utiliza-se um número fixo de dígitos para representar um valor numérico. Assim,
em computadores que usam 16 bits para essa representação, deve-se adicionar zeros à esquerda até
que 16 dígitos sejam escritos. Por exemplo, 4 (quatro) passa a ser 0000000000000100, 14 (quatorze)
vira 0000000000001110 e assim por diante. Já os computadores mais modernos utilizam 32 ou 64
bits. Também é possível colocar um prefixo 0b caso você queira mostrar que está escrevendo um valor
binário, assim x = 0b10 é igual a x = 2.
Caso você queira profundar seus conhecimentos nesse processo de conversão, visite o link Como
funciona o sistema binário?, do Canaltech, indicado nas referências! Vamos então entender como
manipular esses valores no nível de representação binário?
Os operadores lógicos bit-a-bit operam sobre cada um dos dígitos, interpretando 0 como um estado,
e 1 como outro. 0 também pode ser interpretado como negativo (False), e 1 como positivo (True). A
partir desse entendimento, as duas tabelas a seguir, cujas colunas contêm um operador lógico bit a
bit, um exemplo e a interpretação da operação definida, apresentam o conjunto completo desses
operadores disponíveis em Python.
Como estamos acostumados a efetuar operações aritméticas há muito tempo, é fácil compreender a
função desses operadores em Python. Já para entender operadores bit a bit, você precisa passar por
diversos passos até que eles façam parte do seu repertório. Vamos definir um caminho para você
entender mais sobre esses operadores? Operadores bit a bit ainda são pouco comuns para você, mas
existe um caminho que pode ser percorrido para se aprofundar no assunto.
Em primeiro lugar, você deve aprofundar seu estudo sobre como converter valores do sistema decimal
para o sistema binário, e vice-versa. Quando você estiver entendendo isso profundamente, vai ficar
mais fácil de compreender e utilizar operadores bit a bit nos seus códigos Python!
Dando continuidade, conheça agora os operadores de identidade. De maneira geral, eles testam se as
variáveis com nomes diferentes se referem ao mesmo local de memória. Esses operadores serão mais
úteis quando você já estiver utilizando e se acostumando aos conceitos de Orientação a Objetos, até
lá eles não têm muita utilidade, mas devem ser informados. Após essa informação, entenda quais são
esses operadores e como eles são interpretados em Python.
Nos dois quadros a seguir temos uma coluna (à esquerda) que contém um operador de identidade,
um exemplo (no meio) e a interpretação da operação definida (à direita).
Precedência de operadores
Você acabou de conhecer a diversa gama de operadores de Python. Com esses operadores, é possível
escrever expressões cada vez mais complexas em seus programas, mas para isso é necessário ter
cuidado. Por exemplo, analise a expressão a seguir e pense qual seria o resultado correto para ela:
x=2+3*5
A variável x será inicializada com o valor 17 ou 25? Se você respondeu 17, você usou a convenção que
afirma que a operação de multiplicação tem maior prioridade sobre a soma, logo ela ocorre primeiro.
Se você respondeu 25, você usou a convenção que assegura que a primeira operação a aparecer na
expressão é a que deve ocorrer primeiro, logo você somou 2 + 3 e depois multiplicou por 5. Se você
chegou a outro resultado, você pode ter utilizado alguma convenção não prevista, mas o ponto que
deve ser destacado aqui é que, seja você ou seja o Python, todos precisam de convenções para decidir
como expressões são computadas.
Perceba na tabela, a seguir, a precedência de operadores em Python dentre aqueles que você já
conheceu. Assim, quanto mais ao topo desta tabela o operador estiver, maior é a prioridade
(precedência), logo, mais cedo ele será executado em uma expressão. A tabela a seguir possui 3
colunas, uma indicando a precedência de um conjunto de operadores (à esquerda), outra indicando
que operadores têm tal precedência (no meio) e a última descrevendo o nome desses operadores (à
direita).
Agora, você entendeu a razão pela qual, em Python, a expressão x = 2 + 3 * 5 resulta em 17. Ora, e se
você quisesse utilizar os mesmos termos mas forçar que a soma 2 + 3 ocorra antes da multiplicação?
Para fazer isto, deve utilizar parênteses (), pois servem para quebrar a precedência normal em Python.
O uso de parênteses diz que todas as computações existentes em uma expressão, que estão
localizadas entre parênteses, ocorrerão antes das que estão fora dos parênteses. Assim, sua nova
expressão deve ficar:
x = (2 + 3) * 5
Parênteses são o mecanismo utilizado para se quebrar a precedência de operadores, mas preste
atenção, pois toda expressão dentro dos parênteses segue a precedência de operadores usuais. Logo,
se houvesse uma multiplicação e uma soma dentro dos parênteses, a multiplicação ocorreria primeiro.
Assim, para fixar esse conhecimento, perceba que as expressões a seguir são expressões válidas em
Python:
x = (2 + 3 * 8) * 5
x = (2 + 3) * (8 * 5)
Você já estudou bastante, mas é importante retornar ao desenvolvimento do algoritmo que foi pedido
a você na sua empresa. Vamos revisá-lo para que você se lembre do que havia sido pedido. Para isso,
tome como ponto de partida a fórmula de Bhaskara, que é novamente apresentada a seguir:
Δ = b² - 4 a c x¹ = -b + √∆ __________ 2a x² = +b + √∆
__________ 2a
Além disso, partindo de um código que já faz a leitura dos valores de a, b e c, também faz o primeiro
passo do processamento, calculando o valor de delta e armazenando o valor da raiz quadrada de delta
na variável raiz_delta, aí você tem que calcular o valor de x’ e x”. Agora que você já estudou os
operadores e a precedência de operadores, perceba, seguindo as regras definidas pelo Python, como
é fácil completar a fase de processamento do algoritmo proposto. Assim, basta você adicionar a linha
a seguir para calcular o valor de x’:
Nesta linha, fizemos uso dos parênteses para controlar a sequência da execução das operações. Da
mesma forma, é preciso calcular o valor de x”, conforme o trecho do seguinte código:
x_duas_linhas = (b + raiz_delta) / (2 * a)
Já nesta linha, foi definida a mesma sequência de passos e somente trocado o sinal de b. Foi
importante estudar tudo isso antes de construir esse código, não foi? Mas que prática você pode ter
na hora de escrever expressões complexas? Vamos discutir isso na próxima página.
Legibilidade de código-fonte é um conceito importante que deve ser seguido para escrever bons
programas. Um primeiro passo é escrever uma expressão longa e complexa, mas de uma forma que
um colega que for ler seu código possa compreender tudo o que foi escrito. Então, fique atento e veja
como fazer isso no boxe a seguir:
Sempre que você escrever uma expressão longa e complexa, não escreva tudo em uma linha de
código. Divida essa expressão em pedaços menores, para que possa ser entendido individualmente,
por exemplo: relembre o caso da fórmula de Bhaskara, uma parte importante dela é calcular o valor
de ∆ (delta), correto? Se você colocar esse cálculo dentro da expressão da raiz, ela ficará bem grande,
mas se você calcular o valor de delta separado, armazená-lo em uma variável e depois utilizá-lo na
expressão de cálculo da raiz, seu código ficará muito mais legível e menos propenso a falhas, não é
mesmo? Tente aplicar essa lógica em seus códigos!
Bem, até aqui, você pôde aprender diversos elementos relacionados a operadores em Python.
Partindo de expressões simples, contendo apenas operadores aritméticos, agora você sabe como
encadear esses e outros operadores para que possa elaborar algoritmos mais complexos. Fazendo
isso, você vai poder automatizar tarefas do dia a dia, seja em casas ou no trabalho.
Ah, no mais, vale destacar que você foi apresentado aos principais grupos de operadores em Python
e a cada uma das suas características. Depois, você estudou a precedência de operadores em Python
para entender como antecipar qualquer erro de construção de expressões, pois, como foi estudado,
pode acontecer de o programador entender a expressão de uma forma e o Python a interpretá-la de
outra, não é mesmo?
Referências
• CANAL TECH. Como funciona o sistema binário? Disponível em:
https://canaltech.com.br/produtos/como-funciona-o-sistema-binario/. Acesso em: 20 maio
2021.
• DATA FLAIR. Python Operator – Types of Operators in Python. Disponível em: https://data-
flair.training/blogs/python-operator/. Acesso em: 31 maio 2020.
• DVMEDIA. Abstração, Encapsulamento e Herança: Pilares da POO em Java . Disponível em:
https://www.devmedia.com.br/abstracao-encapsulamento-e-heranca-pilares-da-poo-em-
java/26366. Acesso em: 31 maio 2020.
• DVMEDIA. Como criar minha primeira classe em Python. Disponível em:
https://www.devmedia.com.br/como-criar-minha-primeira-classe-em-python/38912.
Acesso em: 31 maio 2020.
• PANDA. Conversão de Decimal para Binário. Disponível em:
https://panda.ime.usp.br/panda/static/pythonds_pt/03-EDBasicos/08-
DecimalParaBinario.html. Acesso em: 20 maio 2021.
• PYTHON. Operator – Standard Operators as functions. Disponível em:
https://docs.python.org/3/library/operator.html. Acesso em: 31 maio 2020.
• W3SCHOOLS. Python Classes and Objects. Disponível em:
https://www.w3schools.com/python/python_classes.asp. Acesso em: 31 maio 2020.
• W3SCHOOLS. Python Operators. Disponível em:
https://www.w3schools.com/python/python_operators.asp. Acesso em: 31 maio 2020.