# Variáveis, operadores e entrada

Tipos, atribuição, precedência, conversões, input e formatação de resultados.

Página: https://resumos.rgo.pt/cadeiras/ct-iadp/variaveis-operadores/

Uma variável associa um nome a um valor. Em `quantidade = 3`, o nome é `quantidade` e o valor é o inteiro 3. A instrução calcula primeiro o lado direito e só depois faz a associação.

## Atribuição não é uma equação

```
quantidade = 3
quantidade = quantidade + 2
```

A segunda instrução lê o valor anterior, calcula 5 e associa esse valor ao nome. Não afirma que 3 é igual a 5. `quantidade += 2` exprime a mesma atualização neste caso.

`=` atribui; `==` compara. `3 == 3` produz `True`. `3 == "3"` produz `False`, porque o segundo valor é texto.

## Tipos e conversões

| Tipo | Exemplo | Uso |
| --- | --- | --- |
| `int` | `3` | Contagens inteiras |
| `float` | `2.5` | Medidas e valores aproximados |
| `str` | `"Porto"` | Texto |
| `bool` | `True` | Resultado de uma condição |
| `NoneType` | `None` | Ausência de um valor definido |

`type(valor)` identifica o tipo. `int("12")` converte texto num inteiro. `float("2.5")` converte texto num real aproximado. `str(12)` produz texto. `int(2.9)` produz 2, por truncatura em direção a zero; não arredonda.

Os tipos pertencem aos valores. Um nome pode receber valores de tipos diferentes, mas mudar o significado do mesmo nome dificulta seguir o programa.

## Nomes e linhas do programa

Um nome pode conter letras, algarismos e `_`, mas não pode começar por um algarismo. `total` e `Total` são nomes diferentes. Palavras reservadas, como `if` e `for`, não podem ser nomes de variáveis.

`#` começa um comentário até ao fim da linha, exceto dentro de uma string. Uma instrução longa pode ocupar várias linhas físicas dentro de parênteses. A instrução continua a ser uma única linha lógica:

```
total = (
    quantidade * preco
    + portes
)
```

A indentação no início da linha define os blocos. Dentro de uma expressão entre parênteses, podes distribuir os operandos por linhas para facilitar a leitura.

## Mais representações numéricas

`1.2e3` significa 1,2 vezes 10 ao cubo e vale `1200.0`. `1e-3` vale `0.001`. A letra `e` indica uma potência de dez, não o número de Euler. Um complexo como `2 + 3j` tem parte real 2 e parte imaginária 3; `.real` e `.imag` permitem lê-las. A unidade imaginária em Python escreve-se `j`, não `i`.

`min` e `max` escolhem extremos, `abs` calcula o valor absoluto ou módulo e `round` arredonda. O arredondamento de empates usa normalmente o valor par mais próximo, mas números decimais representados como float podem não ser empates exatos.

## Operadores e precedência

| Operação | Expressão | Resultado |
| --- | --- | --- |
| Potência | `2 ** 3` | `8` |
| Divisão | `7 / 2` | `3.5` |
| Divisão pelo chão | `7 // 2` | `3` |
| Resto | `7 % 2` | `1` |
| Multiplicação | `3 * 2` | `6` |
| Texto repetido | `"ab" * 2` | `"abab"` |
| Texto concatenado | `"a" + "b"` | `"ab"` |

Com divisor positivo, `//` arredonda em direção a menos infinito: `-7 // 2` vale -4 e `-7 % 2` vale 1. Confere a identidade `a == (a // b) * b + a % b`, para `b` diferente de zero.

As potências precedem multiplicações e divisões, que precedem somas e subtrações. Parênteses tornam a intenção explícita. `-2 ** 2` vale -4; `(-2) ** 2` vale 4. `2 ** 3 ** 2` significa `2 ** (3 ** 2)` e vale 512.

## Ler valores e mostrar resultados

`input` devolve sempre uma string. Ler `"3"` não cria o inteiro 3. Converte antes de calcular. Nos dados de entrada do bloco, a quantidade ocupa a primeira linha e o preço a segunda.

```python
quantidade = int(input("Quantidade: "))
preco = float(input("Preço por unidade: "))
total = quantidade * preco
print(f"Total: {total:.2f} euros")
```

O cálculo é `3 × 2,5 = 7,5`. A expressão `:.2f` escreve duas casas decimais, por isso o total aparece como `7.50 euros`. Formatar não altera o valor guardado em `total`.

`print(a, b)` separa os valores por um espaço. `print(a, b, sep=";")` usa um ponto e vírgula. `end=""` evita a mudança de linha. Numa f-string, cada expressão entre chavetas é calculada e inserida no texto.

## Valores aproximados

Os `float` usam uma representação binária finita. Algumas frações decimais não têm representação exata, por isso `0.1 + 0.2 == 0.3` é falso. Para conferir um resultado aproximado, escolhe uma tolerância adequada às unidades.

```python
from math import isclose
print(0.1 + 0.2)
print(isclose(0.1 + 0.2, 0.3, abs_tol=1e-12))
```

A primeira linha pode expor os dígitos da aproximação; a segunda escreve `True`. Para cálculos de cêntimos que exigem exatidão, uma alternativa é guardar quantias como inteiros de cêntimos. Não arredondes cada passo sem que o enunciado o peça, porque os erros de arredondamento podem acumular-se.

## Exercícios

Prever uma expressão

Quanto vale 2 + 3 \* 4 \*\* 2?

Primeira pista

A potência é calculada antes da multiplicação.

Mais uma pista

Calcula primeiro 4 ao quadrado, depois multiplica por 3.

Ver solução

4 ao quadrado é 16; 3 vezes 16 é 48; somar 2 dá 50.

#### Erros frequentes

Calcular tudo da esquerda para a direita ou usar 5 vezes 4 ao quadrado.

[Voltar à explicação](https://resumos.rgo.pt/cadeiras/ct-iadp/variaveis-operadores/#operadores-e-preced%C3%AAncia)

Distinguir chão de truncatura

Quanto vale -7 // 2?

Primeira pista

A divisão pelo chão arredonda em direção a menos infinito.

Mais uma pista

O quociente real é -3,5. Qual é o inteiro imediatamente abaixo?

Ver solução

O resultado é -4. Com resto 1, a identidade é -7 = (-4) × 2 + 1.

#### Erros frequentes

Responder -3 por confundir // com int(-3.5).

[Voltar à explicação](https://resumos.rgo.pt/cadeiras/ct-iadp/variaveis-operadores/#operadores-e-preced%C3%AAncia)

Converter antes de somar

Uma entrada é o texto 12. Queres acrescentar duas unidades e obter o número 14. Qual é a expressão adequada?

Primeira pista

input devolve uma string.

Mais uma pista

O cálculo tem de acontecer entre dois números.

Ver solução

Converte com int e soma 2. A conversão exige que o texto represente um inteiro válido.

*   **int(entrada) + 2.** Converte o texto para inteiro antes da soma.
*   **entrada + "2".** Concatena texto e produz 122.
*   **entrada + 2.** Tenta somar string e inteiro e dá TypeError.

#### Erros frequentes

Confundir concatenar algarismos com somar quantidades.

[Voltar à explicação](https://resumos.rgo.pt/cadeiras/ct-iadp/variaveis-operadores/#ler-valores-e-mostrar-resultados)
