2.2. Variáveis e tipos básicos#

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

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

O lado direito de = é avaliado primeiro, depois o resultado é associado ao nome do lado esquerdo. Ler um nome que nunca foi atribuído lança NameError.

Uma variável é apenas uma etiqueta. Aponta para um valor – o valor vive algures, e o mesmo valor pode ter qualquer número de etiquetas.

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

As variáveis são etiquetas que apontam para valores. Reatribuir uma variável move a etiqueta; não altera o valor para o qual a etiqueta apontava.#

2.2.1. Regras de nomenclatura#

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

  • Os nomes são sensíveis a maiúsculas/minúsculas: Width e width são duas variáveis diferentes.

  • Evite reutilizar nomes incorporados como list, str, id() ou print() – sombreá-los não gera um erro, mas o incorporado original fica inacessível pelo resto do script.

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

2.2.2. Tipos básicos#

Cada valor em Python tem um tipo que determina as operações que suporta. Os quatro tipos que escreverá com mais frequência são:

  • int – números inteiros, positivos ou negativos. Os inteiros MicroPython crescem tanto quanto a memória permite. Os literais são escritos como dígitos simples: 0, 42, -7. Os literais hexadecimal (0x1A), octal (0o17) e binário (0b1010) também são válidos e úteis para registos 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âmara são IEEE 754 de 32 bits – precisos até cerca de sete algarismos significativos.

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

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

Existe também um quinto valor que vale conhecer de imediato:

  • None – o valor único do tipo NoneType. Usado para significar «sem valor» ou «ainda não definido». Funções que não devolvem explicitamente nada devolvem implicitamente None.

2.2.3. Verificar e converter tipos#

A função incorporada type() devolve o tipo de qualquer valor:

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

Cada tipo também funciona como função de conversão. Passe-lhe um valor de um tipo diferente e obtém de volta o valor equivalente do novo tipo – quando a conversão está 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)

As conversões que não estão bem definidas lançam 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 em qualquer momento. O seguinte é legal:

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

O Python não associa uma variável a um tipo. O código que depende de x ser um inteiro simplesmente espera um inteiro no ponto onde o usa; se obtiver outra coisa, terá um TypeError em tempo de execução.

Nota

Reatribuir x não altera o valor para o qual a antiga associação apontava. Se dois nomes partilham 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]

Mutar um valor partilhado é diferente: um método como list.append altera o valor para o qual a associação aponta, por isso todos os outros nomes que apontam para esse mesmo valor verão a alteração.