Expressões



Uma expressão é uma combinação de valores, variáveis e operadores. Se você digitar uma expressão na linha de comando, o interpretador avalia e exibe o resultado:

>>> 2 + 3
5

Embora expressões contenham valores, variáveis e operadores, nem toda expressão contém todos estes elementos. Um valor por si só é considerado uma expressão, do mesmo modo que uma variável:

>>> x = 10
>>> 17
17
>>> x
10
>>> 
Avaliar uma expressão não é exatamente a mesma coisa que imprimir um valor:
>>> texto = "Hello Word"
>>> texto
'Hello Word'
>>> print(texto)
Hello Word
>>> 

Reparem que na 2a. linha, é avaliado a variável texto e mostrado seu conteúdo mostrado a seguir, explicitando que é string Já na 4a. linha, é solicitado que imprima o conteúdo da variável texto e em seguida é mostrado o que a expressão ped.


Quando Python exibe o valor de uma expressão, usa o mesmo formato que você usaria para entrar com o valor. No caso de strings, isso significa que as aspas são incluídas mas o comando print imprime o valor da expressão, que, neste caso, é o conteúdo da string.

  • N.T.: Python aceita aspas simples ou duplas para delimitar strings. Num script, uma expressão sozinha é um comando válido, porém sem efeito.

O script:

22
3.2
"Alo"
2 + 2

não produz qualquer saída.

Como você mudaria o “script” para exibir os valores destas quatro expressões?

Operadores e operandos




Operadores são símbolos especiais que representam computações como adição e multiplicação.

Os valores que o operador usa são chamados operandos.

Todas as expressões seguintes são válidas em Python e seus significados são mais ou menos claros:

20+32   hora-1   hora*60+minuto   minuto/60   5**2  (5+9)*(15-7)


Em Python, os símbolos +, -, / e o uso de parênteses para agrupamento têm o mesmo significado que em matemática.

O asterisco (*) é o símbolo para multiplicação e ** é o símbolo para potenciação.


Quando um nome de variável aparece no lugar de um operando, ele é substituído pelo valor da variável, antes da operação ser executada.

>>> x = 25.2
>>> y = 10.3
>>> print(x,y)
(25.2, 10.3)
>>> print x , y
25.2 10.3
>>> 


>>> x = 25.2
>>> y = 10.3
>>> print x
25.2
>>> print x + y
35.5
>>> print x, print y
 File "<stdin>", line 1
   print x, print y
                ^
SyntaxError: invalid syntax
>>> print x; print y
25.2
10.3


Adição, subtração, multiplicação e potenciação fazem o que se espera, mas você pode ficar surpreso com a divisão.

A operação seguinte tem um resultado inesperado:

>>> minuto = 59
>>> minuto/60
0

O valor de minuto é 59 e, em aritmética convencional, 59 dividido por 60 é 0,98333, não 0.

A razão para a discrepância é que Python está realizando uma divisão inteira.


Quando ambos os operandos são inteiros, o resultado tem de ser também um inteiro.

Por convenção, a divisão inteira sempre arredonda para baixo, mesmo em casos como este, em que o inteiro seguinte está muito próximo:

>>> minuto*100/60
98

De novo, o resultado é arredondado para baixo, mas agora pelo menos a resposta é aproximadamente correta.

A alternativa é usar a divisão em ponto flutuante, o que veremos no capítulo 3.


Que tal arredondar um número? Utilize o comando round

Ordem dos operadores


Quando mais de um operador aparece em uma expressão, a ordem de avaliação depende das regras de precedência.

Python segue as mesmas regras de precedência para seus operadores matemáticos que a matemática.

O acrônimo PEMDAS é uma maneira prática de lembrar a ordem das operações:


P: Parênteses têm a mais alta precedência e podem ser usados para forçar uma expressão a ser avaliada na ordem que você quiser.

Já que expressões entre parênteses são avaliadas primeiro, 2 * (3-1) é 4, e (1+1)**(5-2) é 8.


Você também pode usar parênteses para tornar uma expressão mais fácil de ler, como em (minuto * 100) / 60, ainda que isso não altere o resultado.

E: Exponenciação ou potenciação tem a próxima precedência mais alta, assim 2**1+1 é 3 e não 4, e 3*1**3 é 3 e não 27.

MDAS: Multiplicação e Divisão têm a mesma precedência, que é mais alta do que a da Adição e da Subtração, que também têm a mesma precedência.

Assim 2*3-1 dá 5 em vez de 4, e 2/3-1 é -1, não 1 (lembre-se de que na divisão inteira, 2/3=0).


Operadores com a mesma precedência são avaliados da esquerda para a direita.

Assim, na expressão minuto*100/60, a multiplicação acontece primeiro, resultando em 5900/60, o que se transforma produzindo 98.

Se as operações tivessem sido avaliadas da direita para a esquerda, o resultado poderia ter sido 59*1, que é 59, que está errado.


Operações com strings




De maneira geral, você não pode executar operações matemáticas em strings, ainda que as strings se pareçam com números.

O que segue é inválido (assumindo que mensagem é do tipo string):


mensagem-1   "Alô"/123   mensagem*"Alô"   "15"+2


Interessante é o operador +, que funciona com strings, embora ele não faça exatamente o que você poderia esperar.

Para strings, o operador + representa concatenação, que significa juntar os dois operandos ligando-os pelos extremos. Por exemplo:


fruta = "banana"
assada = " com canela"
print fruta + assada

A saída deste programa é banana com canela. O espaço antes da palavra com é parte da string e é necessário para produzir o espaço entre as strings concatenadas.


O operador * também funciona com strings; ele realiza repetição. Por exemplo, "Legal"*3 é "LegalLegaLegal".

Um dos operadores tem que ser uma string; o outro tem que ser um inteiro.


Por um lado, esta interpretação de + e * faz sentido pela analogia entre adição e multiplicação.

Assim como 4*3 equivale a 4+4+4, não é de estranhar que "Legal"*3 seja o mesmo que "Legal"+"Legal"+"Legal".

Por outro lado, uma diferença significativa separa concatenação e repetição de adição e multiplicação.

Você saberia mencionar uma propriedade da adição e da multiplicação que não ocorre na concatenação e na repetição?

Composição


Até agora, vimos os elementos de um programa (variáveis, expressões, e instruções ou comandos) isoladamente, sem mencionar como combiná-los.


Uma das características mais práticas das linguagens de programação é a possibilidade de pegar pequenos blocos e combiná-los numa composição.

Por exemplo, nós sabemos como somar números e sabemos como exibi-los; acontece que podemos fazer as duas coisas ao mesmo tempo:


>>> print 17 + 3
20

Na realidade, a soma tem que acontecer antes da impressão, assim, as ações não estão na realidade acontecendo ao mesmo tempo.

O ponto é que qualquer expressão envolvendo números, strings, e variáveis pode ser usada dentro de um comando print.


Exemplo:

>>> hora = 16
>>> minutos = 22
>>> print "O numero de minutos desde a meia-noite é ",hora*60+minutos
O numero de minutos desde a meia-noite é  982
>>> 


Esta possibilidade pode não parecer muito impressionante agora, mas você verá outros exemplos em que a composição torna possível expressar cálculos e tarefas complexas de modo limpo e conciso.

  • Atenção:
    • Existem limites quanto ao lugar onde você pode usar certos tipos de expressão.
    • Por exemplo, o lado esquerdo de um comando de atribuição tem que ser um nome de variável, e não uma expressão.


  • Assim, o seguinte não é válido:
    • minuto+1 = hora.