2.2. Variáveis e tipos básicos

Uma variável é um nome que você associa a um valor com o operador =. Após a atribuição, o nome pode ser usado em qualquer lugar onde o valor pode:

width = 320
height = 240
pixels = width * height
print(pixels)               # prints 76800

O lado direito de = é avaliado primeiro, e então o resultado é associado ao nome à esquerda. Ler um nome que nunca foi atribuído gera NameError.

Uma variável é apenas um rótulo. Ela aponta para um valor – o valor reside em outro lugar, e o mesmo valor pode ter qualquer número de rótulos.

Três rótulos apontando para três valores em caixas; reatribuir um rótulo move a seta, não o valor.

Variáveis são rótulos que apontam para valores. Reatribuir uma variável move o rótulo; isso não altera o valor para o qual o rótulo apontava antes.

2.2.1. Regras de nomenclatura

  • Os nomes começam com uma letra ou um underscore e podem conter letras, dígitos e underscores. frame_count e _internal são válidos; 1st_frame é um erro de sintaxe.

  • Os nomes diferenciam maiúsculas de minúsculas: Width e width são duas variáveis diferentes.

  • Evite reutilizar nomes embutidos como list, str, id() ou print() – sombreá-los não gera um erro, mas o embutido original se torna inacessível pelo restante do script.

  • Convenção: snake_case para variáveis e funções, ALL_CAPS para constantes que você não pretende alterar, CamelCase para nomes de classes.

2.2.2. Tipos básicos

Todo valor em Python tem um tipo que determina quais operações ele suporta. Os quatro tipos que você mais escreverá são:

  • int – números inteiros, positivos ou negativos. Os inteiros do MicroPython crescem tanto quanto a memória permitir. Os literais são escritos como dígitos simples: 0, 42, -7. Literais hexadecimais (0x1A), octais (0o17) e binários (0b1010) também são válidos e úteis para registradores e máscaras de bits.

  • float – números com ponto decimal ou expoente: 3.14, 1.0, -0.5, 2e6 (= 2.000.000,0). Todos os floats na câmera são IEEE 754 de 32 bits – precisos até cerca de sete algarismos significativos.

  • bool – um dos dois literais True ou False (observe a capitalização).

  • str – texto, escrito como caracteres entre aspas simples ou duplas: "hello", 'OpenMV'. Ambos os estilos de aspas são equivalentes; escolha o que permitir evitar escapar os caracteres de aspas que aparecem dentro da string.

Há também um quinto valor que vale a pena conhecer imediatamente:

  • None – o único valor do tipo NoneType. Usado para significar “nenhum valor” ou “ainda não definido”. Funções que não retornam nada explicitamente retornam implicitamente None.

2.2.3. Verificando e convertendo tipos

A função embutida type() retorna o tipo de qualquer valor:

>>> type(42)
<class 'int'>
>>> type(3.14)
<class 'float'>
>>> type("hello")
<class 'str'>

Cada tipo também funciona como uma função de conversão. Passe a ele um valor de um tipo diferente e você recebe de volta o valor equivalente do novo tipo – quando a conversão é bem definida:

>>> int("42")
42
>>> int(3.9)
3                           # truncates toward zero, not rounds
>>> float("1.5")
1.5
>>> str(255)
'255'
>>> bool(0), bool(1), bool("")
(False, True, False)

Conversões que não são bem definidas geram ValueError:

>>> int("hello")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid syntax for integer with base 10

2.2.4. Reatribuição e tipagem dinâmica

Um nome pode ser reatribuído a um valor de qualquer tipo a qualquer momento. O seguinte é válido:

x = 42
x = "now I'm a string"
x = 3.14

O Python não associa uma variável a um tipo. Código que depende de x ser um inteiro simplesmente espera um inteiro no ponto em que o utiliza; se receber outra coisa, você obtém um TypeError em tempo de execução.

Nota

Reatribuir x não altera o valor para o qual a associação antiga apontava. Se dois nomes compartilham o mesmo valor, reatribuir um não afeta o outro:

a = [1, 2, 3]
b = a                       # both point at the same list
a = "different now"
print(b)                    # still [1, 2, 3]

Modificar um valor compartilhado é diferente: um método como list.append altera o valor para o qual a associação aponta, de modo que todos os outros nomes que apontam para esse mesmo valor enxergam a alteração.