Tipos de Dados e Conversão de Tipos
Visão Geral
Perguntas
Que tipos de dados um programa armazena?
Como posso converter de um tipo para outro?
Objetivos
Explicar as principais diferenças entre inteiros e números de ponto flutuante.
Explicar as principais diferenças entre strings e números.
Usar funções embutidas para converter entre inteiros, números de ponto flutuante e strings.
Todo valor tem um tipo.
- Todo valor de um programa tem um tipo específico.
- Integer (
int): representa um número inteiro positivo ou negativo como 3 ou -512. - Número de ponto flutuante (
float): representa números reais como 3.14159 ou -2.5. - String de caracteres (geralmente chamado de “string”,
str): texto.- Escritas entre aspas simples ou duplas (desde que sejam do mesmo tipo).
- As aspas não são impressas quando usamos
print().
Use a função embutida type para descobrir o tipo de um valor.
- Use a função embutida
typepara descobrir qual é o tipo de um determinado valor. - Também funciona como variáveis.
- Mas lembre-se: o valor tem o tipo — a variável é só uma etiqueta.
print(type(52))
<class 'int'>
forma = 'redonda'
print(type(forma))
<class 'str'>
Tipos controlam que operações (ou métodos) podem ser executados em um dado valor.
- O tipo de um valor determina o que o programa pode fazer com ele.
print(5 - 3)
2
print('ola' - 'o')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-67f5626a1e07> in <module>()
----> 1 print('ola' - 'o')
TypeError: unsupported operand type(s) for -: 'str' and 'str'
Você pode usar os operadores + e * em strings.
- “Somar” caracteres de strings concatena (“junta”) elas:
nome_completo = 'Felipe' + ' ' + 'da Silva'
print(nome_completo)
Felipe da Silva
- Multiplicar uma string por um inteiro
Ncria uma nova string que consiste da string original repetidaNvezes.- Já que multiplicação é adição repetida.
separador = '=' * 10
print(separador)
==========
Strings têm um comprimento (mas números não).
- A função embutida
len(length) conta o número de caracteres em uma string.
print(len(nome_completo))
15
- Mas números não tem um comprimento (nem zero).
print(len(52))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-f769e8e8097d> in <module>()
----> 1 print(len(52))
TypeError: object of type 'int' has no len()
É necessário converter números para strings e vice-versa para poder fazer operações entre eles.
- Não é possível somar números e strings.
print(1 + '2')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-fe4f54a023c6> in <module>()
----> 1 print(1 + '2')
TypeError: unsupported operand type(s) for +: 'int' and 'str'
- Não é permitido porque é ambíguo:
1 + '2'deve ser3ou'12'? - Alguns tipos podem ser convertidos para outros tipos ao usar o nome do tipo como um função.
print(1 + int('2'))
print(str(1) + '2')
3
12
É possível misturar integers e floats livremente entre operações.
- Números inteiros e de ponto flutuante pode ser misturados em aritmética.
- Python 3 automaticamente converte integers para floats conforme o necessário.
print('meio é', 1 / 2.0)
print('três ao quadrado é', 3.0 ** 2)
meio é 0.5
três ao quadrado é 9.0
Variáveis só mudam de valor quando algo é assinalado a elas.
- Se fizermos uma célula em uma planilha depender de outra, e fizermos update da última, a primeira faz update automaticamente.
- Isso não acontece em linguagens de programação.
primeiro = 1
segundo = 5 * primeiro
primeiro = 2
print('primeiro é', primeiro, 'e segundo é', segundo)
primeiro é 2 e segundo é 5
- O computador lê o valor de
primeiroquando faz a multiplicação, cria um novo valor, e assinala parasegundo. - Depois disso,
segundonão lembra da onde veio o valor original.
Frações
Que tipo de valor é
3.4? Como você pode descobrir?Solução
É um número de ponto flutuante (normalmente abreviado de “float”). É possível descobrir usando a função embutida
type.print(type(3.4))<class 'float'>
Conversão Automática de Tipos
Que tipo é o valor
3.25 + 4?Solução
É um float: inteiros são automaticamente convertidos para floats conforme o necessário.
resultado = 3.25 + 4 print(resultado, 'é', type(resultado))7.25 is <class 'float'>
Escolha um Tipo
Que tipo de valor (inteiro, número de ponto flutuante, ou string de caracteres) você usaria para representar cada um dos seguintes? Tente pensar em mais de uma boa resposta para cada problema. Por exemplo, no número 1, quando contar os dias com uma variável de ponto flutuante faria mais sentido do que usar um inteiro?
- Número de dias desde o início do ano.
- Tempo do início do ano até agora em dias.
- Número serial de um patrimônio.
- A validade de uma inspeção de segurança.
- População atual de um município.
- População média de um município ao longo do tempo.
Solução
The answers to the questions are:
- Inteiro, já que o número de dias ficaria entre 1 e 365.
- Ponto flutuante, já que os dias fracionais são necessários.
- String se o número serial contém letras e números, se não um integer se o número serial contém apenas números (e não começa com zero).
- Isso pode variar! Como você define a validade? Dias desde a última inspeção (integer)? Data de validade (string)?
- Float para representar a populações como grandes agregados (como milhões), ou inteiro para representar a população em unidades de indivíduos.
- Número de ponto flutuante, já que a média provavelmente vai possuir um valor fracional.
Tipos de Divisão
No Python 3, o operador
//realiza divisão de inteiros, o operador/realiza divisão de ponto flutuante, e o operador%(ou módulo) calcula o resto da divisão de inteiros.print('5 // 3:', 5 // 3) print('5 / 3:', 5 / 3) print('5 % 3:', 5 % 3)5 // 3: 1 5 / 3: 1.6666666666666667 5 % 3: 2Se
num_participantesé o número de participantes em um estudo, enum_por_entrevistaé o número que pode participar em uma única entrevista, escreva uma expressão que calcula o número mínimo de entrevistas necessárias para incluir todos os participantes.Solução
Queremos o mínimo número de entrevistas que inclua todos os participantes, que seria o valor arredondado de
num_participantes / num_por_entrevista. Isso é equivalente a realizar a divisão de inteiros com//e adicionar 1. Antes da divisão precisamos subtrair 1 do número de participantes para lidar com o caso no qualnum_participantesé dividido igualmente portnum_por_entrevista.num_participantes = 600 num_por_entrevista = 42 num_entrevistas = (num_participantes - 1) // num_por_entrevista + 1 print(num_participantes, 'participantes,', num_por_entrevista, 'por entrevista:', num_entrevistas)600 participantes, 42 por entrevista: 15
Strings para Números
Quando possível,
float()vai converter a string em um número de ponto flutuante, eint()vai converter o número de ponto flutuante em um inteiro.print("string para float:", float("3.4")) print("float para int:", int(3.4))string para float: 3.4 float para int: 3Se a conversão não fizer sentido, vai ocorrer um erro.
print("string para float:", float("Olá Mundo!"))--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-5-df3b790bf0a2> in <module> ----> 1 print("string para float:", float("Olá Mundo!")) ValueError: could not convert string to float: 'Olá Mundo!'Dada essa informação, o que você espera que o programa abaixo vai fazer?
O que ele realmente faz?
Por que você acha que ele faz isso?
print("string de fração para int:", int("3.4"))Solução
O que você espera que eswse programa faça? Não seria razoável que o comando
intdo Python 3 convertesse a string"3.4"para3.4e uma conversão adicional para3. Afinal, o Python 3 faz mais um monte de mágicas - isso não faz parte do charme?int("3.4")--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-2-ec6729dfccdc> in <module> ----> 1 int("3.4") ValueError: invalid literal for int() with base 10: '3.4'VEmos que o Python 3 dá erro. Por quê? Possivelmente para se manter consistente. Se você pedir para o Python realizar duas conversões de tipo consecutivas, você precisa declarar isso explicitamente no código.
int(float("3.4"))3
Aritmética com Diferentes Tipos
Qual dos seguintes vai retornar o número de ponto flutuante
2.0? Nota: pode haver mais de uma resposta certa.primeiro = 1.0 segundo = "1" terceiro = "1.1"
primeiro + float(segundo)float(segundo) + float(terceiro)primeiro + int(terceiro)primeiro + int(float(terceiro))int(primeiro) + int(float(terceiro))2.0 * segundoSolução
Resposta: 1 e 4.
Somando Fatias
Como substrings também são strings, é possível somá-las da mesma força que somamos strings. A partir da variável
empresa, escreva o código para criar a variávelabrev, usando o index de cada letra e o operador+.empresa = "Companhia Paulista de Força e Luz" abrev = __________ print(abrev)CPFLSolução
empresa = "Companhia Paulista de Força e Luz" abrev = empresa[0] + empresa[10] + empresa[22] + empresa[30] print(abrev)
Números Complexos
Python vem com números complexos, escritos como
1 + 2j. Sevalé um número complexo, suas partes reais e imaginárias podem ser acessadas usando notação de ponto comoval.realeval.imag.complexo = 6 + 2j print(complexo.real) print(complexo.imag)6.0 2.0
- Por que você acha que usamos
je nãoipara a parte imaginária?- O que você espera que
1 + 2j + 3vai produzir?- O que você espera
4jserá? E4 jou4 + j?Solução
- Tratados padrão da matemática tipicamente usam
ipara denotar um número imaginário. No entanto, isso foi foi uma convenção estabelecida cedo na área de engenharia elétrica e agora representa um área tecnicamente custosa para modificar. Existe uma explicação e discussão adicional no Stack Overflow.(4+2j)4jeSyntax Error: invalid syntax. Nos dois últimos casos,jé considerada uma variável e a declaração depende de sejjá foi definido, e do seu valor assinalado.
Pontos-chave
Todo valor tem um tipo.
Use a função embutida
typepara encontrar o tipo de um valor.Tipos determinam que operações podem ser feitas em um valor.
Strings podem ser somadas e multiplicadas.
Strings têm um comprimento (mas números não).
Preciso converter números para strings ou vice-versa quando fazendo operações entre eles.
Posso misturar inteiros e floats livremente entre operações.
Variáveis só mudam de valor quando algo é assinalado a elas.