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.

Use a função embutida type para descobrir o tipo de um valor.

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.

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.

nome_completo = 'Felipe' + ' ' + 'da Silva'
print(nome_completo)
Felipe da Silva
separador = '=' * 10
print(separador)
==========

Strings têm um comprimento (mas números não).

print(len(nome_completo))
15
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.

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'
print(1 + int('2'))
print(str(1) + '2')
3
12

É possível misturar integers e floats livremente entre operações.

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.

primeiro = 1
segundo = 5 * primeiro
primeiro = 2
print('primeiro é', primeiro, 'e segundo é', segundo)
primeiro é 2 e segundo é 5

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?

  1. Número de dias desde o início do ano.
  2. Tempo do início do ano até agora em dias.
  3. Número serial de um patrimônio.
  4. A validade de uma inspeção de segurança.
  5. População atual de um município.
  6. População média de um município ao longo do tempo.

Solução

The answers to the questions are:

  1. Inteiro, já que o número de dias ficaria entre 1 e 365.
  2. Ponto flutuante, já que os dias fracionais são necessários.
  3. 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).
  4. Isso pode variar! Como você define a validade? Dias desde a última inspeção (integer)? Data de validade (string)?
  5. Float para representar a populações como grandes agregados (como milhões), ou inteiro para representar a população em unidades de indivíduos.
  6. 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: 2

Se num_participantes é o número de participantes em um estudo, e num_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 qual num_participantes é dividido igualmente port num_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, e int() 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: 3

Se 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 int do Python 3 convertesse a string "3.4" para 3.4 e uma conversão adicional para 3. 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"
  1. primeiro + float(segundo)
  2. float(segundo) + float(terceiro)
  3. primeiro + int(terceiro)
  4. primeiro + int(float(terceiro))
  5. int(primeiro) + int(float(terceiro))
  6. 2.0 * segundo

Soluçã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ável abrev, usando o index de cada letra e o operador +.

empresa = "Companhia Paulista de Força e Luz"
abrev = __________
print(abrev)
CPFL

Soluçã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. Se val é um número complexo, suas partes reais e imaginárias podem ser acessadas usando notação de ponto como val.real e val.imag.

complexo = 6 + 2j
print(complexo.real)
print(complexo.imag)
6.0
2.0
  1. Por que você acha que usamos j e não i para a parte imaginária?
  2. O que você espera que 1 + 2j + 3 vai produzir?
  3. O que você espera 4j será? E 4 j ou 4 + j?

Solução

  1. Tratados padrão da matemática tipicamente usam i para 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.
  2. (4+2j)
  3. 4j e Syntax Error: invalid syntax. Nos dois últimos casos, j é considerada uma variável e a declaração depende de se j já foi definido, e do seu valor assinalado.

Pontos-chave

  • Todo valor tem um tipo.

  • Use a função embutida type para 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.