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.
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_counte_internalsão válidos;1st_frameé um erro de sintaxe.Os nomes diferenciam maiúsculas de minúsculas:
Widthewidthsão duas variáveis diferentes.Evite reutilizar nomes embutidos como
list,str,id()ouprint()– sombreá-los não gera um erro, mas o embutido original se torna inacessível pelo restante do script.Convenção:
snake_casepara variáveis e funções,ALL_CAPSpara constantes que você não pretende alterar,CamelCasepara 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
TrueouFalse(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 implicitamenteNone.
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.