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.