HOWTO · Python

Como ler a entrada do utilizador como números inteiros em Python

Leia a entrada do utilizador como números inteiros em Python 3: converta um único valor com int(input()), leia vários números inteiros de uma só linha com split() e map() e trate entradas inválidas com try-except.

Nesta página

Em Python 3, a função input() devolve sempre uma string. Para trabalhar com o valor introduzido como número, converta essa string com int(). Este artigo mostra como ler um único número inteiro, como tratar uma entrada que não é um inteiro válido e como ler vários números inteiros numa só linha.

Este artigo abrange o Python 3. O Python 2 utilizava raw_input() para a mesma tarefa e atingiu o seu fim de vida em 2020, pelo que os exemplos abaixo utilizam input() ao longo de todo o texto.

Ler um número inteiro com int(input())

Comece por ler a entrada como uma string e, em seguida, converta-a:

user_input = input("Please enter an integer: ")
integer_value = int(user_input)

print("You entered:", integer_value)
print(type(integer_value))

Saída:

Please enter an integer: 42
You entered: 42
<class 'int'>

A conversão e a leitura são frequentemente combinadas numa única linha, que se comporta exatamente da mesma forma:

integer_value = int(input("Please enter an integer: "))

Se o utilizador introduzir algo que não é um número inteiro, como hello ou 3.5, int() levanta um ValueError e o programa termina. A secção seguinte mostra como lidar com esse caso.

Tratar entradas inválidas com try-except

Envolva a conversão num bloco try-except para intercetar o ValueError e voltar a pedir, em vez de o programa falhar:

while True:
    user_input = input("Please enter an integer: ")
    try:
        integer_value = int(user_input)
        print("You entered:", integer_value)
        break
    except ValueError:
        print("That's not a valid integer. Please try again.")

O ciclo continua a pedir até a conversão ser bem-sucedida. Só então o break termina o ciclo.

Saída:

Please enter an integer: hello
That's not a valid integer. Please try again.
Please enter an integer: 10
You entered: 10

Validar a entrada desta forma é uma boa prática em programas interativos: um erro de escrita deve custar ao utilizador apenas mais um pedido, e não toda a execução.

Ler vários números inteiros numa só linha

Quando um programa precisa de vários números de uma só vez, permita que o utilizador os escreva numa única linha, separados por espaços. split() divide a linha em partes de string e map() converte cada parte com int():

numbers = list(map(int, input("Enter numbers separated by spaces: ").split()))

print(numbers)
print("Sum:", sum(numbers))

Saída:

Enter numbers separated by spaces: 4 8 15 16 23 42
[4, 8, 15, 16, 23, 42]
Sum: 108

Uma compreensão de lista faz o mesmo trabalho e é igualmente comum:

numbers = [int(piece) for piece in input("Enter numbers separated by spaces: ").split()]

Se precisar de um número fixo de valores, desempacote o resultado diretamente. Aqui, o utilizador tem de introduzir exatamente dois números inteiros:

a, b = map(int, input("Enter two numbers: ").split())

print("a =", a)
print("b =", b)

Saída:

Enter two numbers: 3 17
a = 3
b = 17

Introduzir mais ou menos valores do que o esperado levanta um ValueError, pelo que deve combinar este padrão com o ciclo try-except da secção anterior quando o número de valores for importante.

O que int() aceita e o que rejeita

int() é mais tolerante do que muitas pessoas esperam. Ignora os espaços em branco no início e no fim, aceita um sinal + ou - opcional e permite sublinhados entre os dígitos:

print(int(" 42 "))
print(int("+7"))
print(int("1_000"))

Saída:

42
7
1000

Rejeita tudo o que não seja um literal de número inteiro em forma de string, incluindo "3.5", "12a" e a string vazia "" — todos estes casos levantam ValueError. Se a entrada puder conter valores decimais, converta com float(), ou utilize int(float(text)) quando for aceitável descartar a parte fracionária.

Conclusão

Ler números inteiros em Python 3 resume-se a um único padrão: input() devolve uma string e int() transforma-a num número inteiro. Utilize um ciclo try-except para que as entradas inválidas sejam pedidas novamente, em vez de fazerem o programa falhar, e recorra a split() com map() ou a uma compreensão de lista quando precisar de vários números inteiros de uma só linha.

FAQ

  1. Como leio a entrada do utilizador como um número inteiro em Python 3?
    Utilize int(input()): input() lê uma linha como uma string e int() converte-a num número inteiro.

  2. Como leio vários números inteiros de uma única linha?
    Divida a linha e converta cada parte, por exemplo list(map(int, input().split())) ou [int(x) for x in input().split()].

  3. O que acontece se o utilizador introduzir um valor que não é um número inteiro?
    int() levanta um ValueError. Intercete-o com um bloco try-except e volte a pedir.

  4. Porque não posso fazer aritmética diretamente sobre o resultado de input()?
    Porque input() devolve uma string, e não um número. Somar uma string e um número inteiro levanta um TypeError até converter a string com int().

  5. Qual é a diferença entre Python 2 e Python 3 na leitura de entradas?
    O Python 2 lia a entrada de texto com raw_input(), enquanto o Python 3 utiliza input(). A conversão com int() funciona da mesma forma em ambos, mas o Python 2 já não é mantido, pelo que o código novo deve utilizar Python 3.