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.

Three labels pointing at three boxed values; reassigning a label moves the arrow, not the value.

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.