Python Tipos de Dados
Nas aulas anteriores apareceram valores bem diferentes: o texto "Ana", o número 29, o preço 7.5. Você já viu que "2" + "3" dá "23" e que 2 + 3 dá 5. A diferença está no tipo de cada valor: todo valor no Python tem um tipo, e é o tipo que decide o que dá para fazer com ele. Esta aula é o mapa dos tipos que você vai usar o tempo todo.
- O que é o tipo de um valor e por que ele importa.
- Os cinco tipos básicos:
str(texto),int(inteiro),float(decimal),bool(verdadeiro/falso) eNone(nada). - Como o Python descobre o tipo só pela escrita do valor.
- Que quem tem tipo é o valor, e não a variável.
- Por que o mesmo
+soma números e junta textos. - Um primeiro olhar nas coleções: listas, tuplas, dicionários e conjuntos.
- Os
TypeErrorreais de misturar tipos que não combinam.
Os programas desta aula foram rodados com o Python 3.14 na máquina fictícia da Ana (usuária ana, computador notebook), com python3 arquivo.py.
A ideia: cada coisa no seu tipo de embalagem
Na padaria, cada coisa vem num tipo de embalagem: o leite em caixa, os ovos em bandeja, o pão em saco de papel. A embalagem diz o que dá para fazer: você despeja o leite, mas não despeja os ovos; você conta os ovos, mas não conta o leite (você mede). Ninguém tenta fatiar a caixa de leite.
No Python, o tipo é a embalagem do valor. Com um número (int), dá para fazer conta. Com um texto (str), dá para juntar, procurar uma letra, pôr em maiúsculas. Quando você tenta fazer com um valor uma coisa que o tipo dele não permite, o Python para e avisa com um TypeError, "erro de tipo".
1. Os cinco tipos básicos
| Tipo | Nome em inglês | O que guarda | Exemplos |
|---|---|---|---|
str | string, "cordão" de caracteres | Texto | "Ana", 'pão', "42", "" |
int | integer, "inteiro" | Número inteiro, positivo ou negativo | 29, 0, -5, 1000000 |
float | floating point, "ponto flutuante" | Número com casas decimais | 1.65, 7.5, -0.25, 3.0 |
bool | boolean, de George Boole, um matemático | Verdadeiro ou falso | True, False |
NoneType | none, "nenhum" | A ausência de valor | None (o único valor desse tipo) |
nome = "Ana" idade = 29 altura = 1.65 cliente_vip = True apelido = None print(nome, idade, altura, cliente_vip, apelido) print(type(nome)) print(type(idade)) print(type(altura)) print(type(cliente_vip)) print(type(apelido))
$ python3 td-basicos.py Ana 29 1.65 True None <class 'str'> <class 'int'> <class 'float'> <class 'bool'> <class 'NoneType'>
A função type() responde qual é o tipo de um valor; a resposta vem no formato <class 'nome-do-tipo'> ("classe" é o nome que o Python dá a um tipo). Ela é o assunto da próxima aula, Descobrindo o Tipo. Agora, cada tipo com calma.
- str —
"Ana" - Tudo o que está entre aspas é texto, mesmo que pareça um número:
"42"é umstr. Um texto pode até ser vazio,"". Aulas: Strings e as seguintes. - int —
29 - Números sem ponto decimal. Não têm limite de tamanho:
2 ** 100(2 elevado a 100) dá1267650600228229401496703205376, sem erro. Aula: Números. - float —
1.65 - Números com ponto. Basta o ponto para ser
float:3.0éfloat,3éint. As contas comfloatàs vezes têm um errinho na última casa (0.1 + 0.2dá0.30000000000000004), explicado em Números. - bool —
True - Só existem dois valores:
True(verdadeiro) eFalse(falso), com a primeira letra maiúscula e sem aspas. São a resposta das comparações:5 > 3dáTrue. Aula: Booleanos. - None —
None - "Nada", "ainda não tem". A Ana não tem apelido, então
apelido = None. Não é zero nem texto vazio: é a ausência de valor. Aula: O Valor None.
2. O Python descobre o tipo pela escrita
Você nunca disse ao Python "isto é um inteiro". Ele descobre olhando como o valor foi escrito:
| Escrita | Tipo | Pista |
|---|---|---|
7 | int | Só algarismos |
7.0 | float | Tem ponto |
"7" | str | Tem aspas |
True | bool | A palavra True ou False, sem aspas |
None | NoneType | A palavra None, sem aspas |
Para o Python, 7, 7.0 e "7" são três coisas diferentes. Os dois números valem o mesmo; o texto, não:
print(7 == 7)
print("7" == 7)
print(type(7), type("7"), type(7.0))
$ python3 td-aspas.py True False <class 'int'> <class 'str'> <class 'float'>
O == pergunta "é igual?" (aula Comparações). O texto "7" não é igual ao número 7: um é um desenho do algarismo, o outro é a quantidade sete.
3. Quem tem tipo é o valor, não a variável
Na aula Variáveis, a variável era uma etiqueta presa a um valor. O tipo pertence ao valor. A etiqueta pode ser presa a um valor de outro tipo, e aí o tipo "da variável" muda junto:
caixa = 10 print(caixa, type(caixa)) caixa = "dez" print(caixa, type(caixa))
$ python3 td-mudar.py 10 <class 'int'> dez <class 'str'>
Por isso se diz que o Python tem tipagem dinâmica: o tipo é conferido na hora em que o programa roda, valor por valor. E também tipagem forte: o Python não converte um tipo em outro por conta própria quando eles não combinam; ele prefere dar erro (seção 4). Em C ou Java, ao contrário, a variável tem um tipo fixo, declarado antes.
4. O tipo decide o que o operador faz
O mesmo sinal faz coisas diferentes conforme o tipo dos valores:
print(3 + 4)
print("3" + "4")
print(3 * 4)
print("3" * 4)
print(7 / 2)
print(10 / 2)
print(3 + 0.5)
$ python3 td-mais.py 7 34 12 3333 3.5 5.0 3.5
| Linha | Tipos | O que aconteceu |
|---|---|---|
3 + 4 | int + int | Soma: 7 |
"3" + "4" | str + str | Junta os textos: "34" |
3 * 4 | int * int | Multiplica: 12 |
"3" * 4 | str * int | Repete o texto 4 vezes: "3333" |
7 / 2 | int / int | A divisão com / sempre dá float: 3.5 |
10 / 2 | int / int | Mesmo exata, dá float: 5.0 |
3 + 0.5 | int + float | Números se misturam bem; o resultado é float: 3.5 |
int e float são parentes: os dois são números e se misturam nas contas. Já texto e número não se misturam (seção "Quando dá errado"). As contas têm aula própria: Operadores Aritméticos.
Missão: a Ana vendeu 15 pães de manhã e 27 à tarde, mas o programa mostra Total: 1527. Mude o tipo dos dois valores (sem mudar o print) para aparecer Total: 42.
manha = "15"
tarde = "27"
print("Total:", manha + tarde)
manha = 15
tarde = 27
print("Total:", manha + tarde)
5. Um primeiro olhar nas coleções
Além dos tipos básicos, que guardam um valor, o Python tem tipos que guardam vários: as coleções. Cada uma tem o seu grupo de aulas no Nível 2; aqui é só para você reconhecer quando encontrar:
compras = ["pão", "leite", "café"]
ponto = (10, 20)
precos = {"pão": 0.75, "leite": 5.9}
sabores = {"coco", "milho"}
print(type(compras))
print(type(ponto))
print(type(precos))
print(type(sabores))
$ python3 td-colecoes.py <class 'list'> <class 'tuple'> <class 'dict'> <class 'set'>
| Tipo | Escrita | O que é | Aula |
|---|---|---|---|
list (lista) | ["pão", "leite"] | Vários valores em ordem; pode mudar | Listas |
tuple (tupla) | (10, 20) | Vários valores em ordem; não muda | Tuplas |
dict (dicionário) | {"pão": 0.75} | Pares "chave: valor", como um cardápio com preços | Dicionários |
set (conjunto) | {"coco", "milho"} | Valores sem repetição e sem ordem | Conjuntos |
Formas diferentes de escrever o mesmo valor
| Você quer… | Escreva | Evite |
|---|---|---|
| Um texto | "pão" ou 'pão' | Misturar as duas aspas no mesmo texto |
| Uma quantidade inteira | 12 | "12" (é texto) e 12.0 (é float, sem necessidade) |
| Um preço, um peso | 7.5 | 7,5 (vira dois valores) e "7.5" (é texto) |
| Sim ou não | True / False | "sim", 1/0, ou true minúsculo (dá NameError) |
| "Não tem" | None | 0 ou "", que são valores de verdade |
Acontece o tempo todo: o input() sempre devolve str (aula input()). Para transformar um tipo em outro existem int(), float(), str() e bool(), assunto da aula Conversão de Tipos.
Quando dá errado
print(4 + "3")
$ python3 td-err1.py
Traceback (most recent call last):
File "/home/ana/td-err1.py", line 1, in <module>
print(4 + "3")
~~^~~~~
TypeError: unsupported operand type(s) for +: 'int' and 'str'
"Tipos de operando não suportados para +: int e str". Um operando é cada valor de uma conta. O Python não sabe somar um número com um texto, e não tenta adivinhar se você queria 7 ou "43". Com o texto na frente ("3" + 4), a mensagem muda para a que você viu em print(), can only concatenate str (not "int") to str, mas o problema é o mesmo. Como consertar: deixe os dois do mesmo tipo: 4 + 3 (números) ou "4" + "3" (textos).
print("pão" - "p")
$ python3 td-err2.py
Traceback (most recent call last):
File "/home/ana/td-err2.py", line 1, in <module>
print("pão" - "p")
~~~~~~^~~~~
TypeError: unsupported operand type(s) for -: 'str' and 'str'
Desta vez os dois são do mesmo tipo, e mesmo assim deu erro: o tipo str sabe juntar (+) e repetir (*), mas não sabe "tirar" (-). Para tirar letras de um texto existe o método replace() (aula Métodos de Texto).
print("ab" * 2.5)
$ python3 td-err3.py
Traceback (most recent call last):
File "/home/ana/td-err3.py", line 1, in <module>
print("ab" * 2.5)
~~~~~^~~~~
TypeError: can't multiply sequence by non-int of type 'float'
"Não dá para multiplicar uma sequência por um não inteiro do tipo float". Repetir um texto "duas vezes e meia" não faz sentido; o número de repetições tem de ser um int. (Uma sequência é um valor com itens em ordem, como o texto, que é uma sequência de letras.)
print(len(42))
$ python3 td-err4.py
Traceback (most recent call last):
File "/home/ana/td-err4.py", line 1, in <module>
print(len(42))
~~~^^^^
TypeError: object of type 'int' has no len()
A função len() (de length, "comprimento") conta os itens de um valor: len("Ana") dá 3, três letras. Um número não tem itens para contar: "um objeto do tipo int não tem len()". Se você queria contar os algarismos, o número precisaria virar texto antes: len(str(42)) (aula Conversão de Tipos).
Missão: o programa para com TypeError. Conserte o print para mostrar Estoque: 12 bolos, mantendo estoque como número.
estoque = 12
print("Estoque: " + estoque + " bolos")
estoque = 12
print("Estoque:", estoque, "bolos")
Referência rápida
| Tipo | Exemplo | type() responde | Para quê |
|---|---|---|---|
| Texto | "Ana" | <class 'str'> | Nomes, recados, qualquer texto |
| Inteiro | 29 | <class 'int'> | Quantidades, contagens, idades |
| Decimal | 7.5 | <class 'float'> | Preços, pesos, medidas |
| Booleano | True, False | <class 'bool'> | Sim/não, resultado de comparações |
| Nada | None | <class 'NoneType'> | "Ainda não tem valor" |
| Lista | ["pão", "leite"] | <class 'list'> | Vários valores em ordem |
| Tupla | (10, 20) | <class 'tuple'> | Vários valores fixos |
| Dicionário | {"pão": 0.75} | <class 'dict'> | Pares chave: valor |
| Conjunto | {"coco", "milho"} | <class 'set'> | Valores sem repetição |
| Mensagem | Causa provável |
|---|---|
TypeError: unsupported operand type(s) for +: 'int' and 'str' | Número + texto |
TypeError: can only concatenate str (not "int") to str | Texto + número |
TypeError: unsupported operand type(s) for -: 'str' and 'str' | Conta que o tipo não sabe fazer |
TypeError: can't multiply sequence by non-int of type 'float' | Texto vezes número com casas decimais |
TypeError: object of type 'int' has no len() | len() num número |
"15" + "27" deu 1527, sem erro | Números guardados como texto |
Exercícios
1. Qual é o tipo?
Qual é o tipo de 3.0? (o nome curto, em minúsculas)
2. E este?
Qual é o tipo de "3"?
3. Qual é a saída?
O que mostra print("ab" * 3)?
4. Qual é o resultado de 8 / 2?
5. Qual destes valores é um bool?
6. A Ana ainda não sabe o telefone de um cliente. Qual valor combina melhor?
Missão final: a ficha do produto
Missão: monte a ficha do sonho de padaria com uma variável de cada tipo: produto com o texto "Sonho" (já está pronta), quantidade com o inteiro 6, preco com o decimal 2.5 e em_promocao com True. Depois mostre o tipo de cada uma com print(type(...)), como já é feito com produto.
produto = "Sonho" print(type(produto))
produto = "Sonho" quantidade = 6 preco = 2.5 em_promocao = True print(type(produto)) print(type(quantidade)) print(type(preco)) print(type(em_promocao))
Resumo
- Todo valor tem um tipo, e o tipo decide o que dá para fazer com ele.
- Os básicos:
str(texto, entre aspas),int(inteiro),float(com ponto),bool(True/False) eNone(nada). - O Python descobre o tipo pela escrita:
7,7.0e"7"são três tipos diferentes. - Quem tem tipo é o valor; a variável só aponta para ele e pode passar a apontar para um valor de outro tipo.
+soma números e junta textos;*multiplica números e repete textos;/sempre dáfloat.intefloatse misturam nas contas; texto e número não:TypeError.- Coleções guardam vários valores:
list,tuple,dict,set(aulas no Nível 2).