Come posso leggere gli input come numeri?


261

Perché sono xe ystringhe invece di ints nel codice seguente?

(Nota: in uso Python 2.x raw_input(). Uso 3.x In Python input(). raw_input()È stato rinominato input()in Python 3.x)

play = True

while play:

    x = input("Enter a number: ")
    y = input("Enter a number: ")

    print(x + y)
    print(x - y)
    print(x * y)
    print(x / y)
    print(x % y)

    if input("Play again? ") == "no":
        play = False

Risposte:


313

TLDR

  • Python 3 non valuta i dati ricevuti con la inputfunzione, ma la inputfunzione di Python 2 lo fa (leggi la sezione successiva per capire le implicazioni).
  • L'equivalente di Python 2 di Python 3 inputè la raw_inputfunzione.

Python 2.x

C'erano due funzioni per ottenere l'input dell'utente, chiamato inpute raw_input. La differenza tra loro è, raw_inputnon valuta i dati e ritorna così com'è, in forma di stringa. Tuttavia, inputvaluterà qualunque cosa tu abbia inserito e il risultato della valutazione verrà restituito. Per esempio,

>>> import sys
>>> sys.version
'2.7.6 (default, Mar 22 2014, 22:59:56) \n[GCC 4.8.2]'
>>> data = input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
(22, <type 'int'>)

I dati 5 + 17vengono valutati e il risultato è 22. Quando valuta l'espressione 5 + 17, rileva che stai aggiungendo due numeri e quindi anche il risultato sarà dello stesso inttipo. Pertanto, la conversione del tipo viene eseguita gratuitamente e 22viene restituita come risultato inpute archiviata in una datavariabile. Puoi pensare a inputcome raw_inputcomposto con una evalchiamata.

>>> data = eval(raw_input("Enter a number: "))
Enter a number: 5 + 17
>>> data, type(data)
(22, <type 'int'>)

Nota: prestare attenzione quando si utilizza inputPython 2.x. Ho spiegato perché uno dovrebbe stare attento quando lo si utilizza, in questa risposta .

Ma raw_inputnon valuta l'input e ritorna così com'è, come una stringa.

>>> import sys
>>> sys.version
'2.7.6 (default, Mar 22 2014, 22:59:56) \n[GCC 4.8.2]'
>>> data = raw_input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
('5 + 17', <type 'str'>)

Python 3.x

Python 3.x inpute Python 2.x raw_inputsono simili e raw_inputnon sono disponibili in Python 3.x.

>>> import sys
>>> sys.version
'3.4.0 (default, Apr 11 2014, 13:05:11) \n[GCC 4.8.2]'
>>> data = input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
('5 + 17', <class 'str'>)

Soluzione

Per rispondere alla tua domanda, poiché Python 3.x non valuta e converte il tipo di dati, devi convertire esplicitamente in ints, con int, in questo modo

x = int(input("Enter a number: "))
y = int(input("Enter a number: "))

Puoi accettare numeri di qualsiasi base e convertirli direttamente in base-10 con la intfunzione, in questo modo

>>> data = int(input("Enter a number: "), 8)
Enter a number: 777
>>> data
511
>>> data = int(input("Enter a number: "), 16)
Enter a number: FFFF
>>> data
65535
>>> data = int(input("Enter a number: "), 2)
Enter a number: 10101010101
>>> data
1365

Il secondo parametro indica qual è la base dei numeri immessi, quindi internamente lo capisce e lo converte. Se i dati inseriti sono errati, verrà lanciato un ValueError.

>>> data = int(input("Enter a number: "), 2)
Enter a number: 1234
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: invalid literal for int() with base 2: '1234'

Per i valori che possono avere un componente frazionario, il tipo sarebbe floatinvece di int:

x = float(input("Enter a number:"))

A parte questo, il tuo programma può essere leggermente modificato, in questo modo

while True:
    ...
    ...
    if input("Play again? ") == "no":
        break

È possibile eliminare la playvariabile utilizzando breake while True.


C'è un altro modo, come una funzione o qualcosa del genere in modo che non abbiamo bisogno di convertire in int in 3.x diverso da fare la conversione esplicita in int ??
Shreyan Mehta,

@ShreyanMehta evalavrebbe funzionato, ma non farlo a meno che tu non abbia motivi pressanti.
thefourtheye

2
@thefourtheye almeno usalo ast.literal_evalper quello. Non ha i problemi di sicurezza di eval.
extra il

4
Uso queste domande e risposte come target dupe, ma forse puoi aggiungere un TDLR con la soluzione python 3, cioè int(input()... in alto? Python 2 si avvicina alla fine della sua vita e le informazioni su Python 3 sono troppo sepolte IMO
Chris_Rands

L'ultimo bit sulla rimozione di play come variabile non è così conveniente in quanto la variabile play rende il codice più comprensibile. E dare suggerimenti su come il codice potrebbe cambiare senza una ragione non è una buona pratica. Altrimenti, è una bella risposta :)
OuuGiii

44

In Python 3.x, è raw_inputstato rinominato in inputPython 2.x e inputrimosso.

Ciò significa che, proprio come raw_input, inputin Python 3.x restituisce sempre un oggetto stringa.

Per risolvere il problema, è necessario rendere esplicitamente tali input in numeri interi inserendoli in int:

x = int(input("Enter a number: "))
y = int(input("Enter a number: "))

27

Per più numeri interi in una singola riga, mappotrebbe essere migliore.

arr = map(int, raw_input().split())

Se il numero è già noto (come 2 numeri interi), è possibile utilizzare

num1, num2 = map(int, raw_input().split())

16

input()(Python 3) e raw_input()(Python 2) restituiscono sempre le stringhe. Converti il ​​risultato in numero intero in modo esplicito con int().

x = int(input("Enter a number: "))
y = int(input("Enter a number: "))

11

Domande multiple richiedono input per più numeri interi su una sola riga. Il modo migliore è inserire l'intera stringa di numeri su una riga e quindi dividerli in numeri interi. Ecco una versione di Python 3:

a = []
p = input()
p = p.split()      
for i in p:
    a.append(int(i))

È possibile utilizzare anche una comprensione dell'elenco

p = input().split("whatever the seperator is")

E per convertire tutti gli input da stringa a int facciamo quanto segue

x = [int(i) for i in p]
print(x, end=' ')

deve stampare gli elementi dell'elenco in linea retta.


6

Converti in numeri interi:

my_number = int(input("enter the number"))

Allo stesso modo per i numeri in virgola mobile:

my_decimalnumber = float(input("enter the number"))

4
n=int(input())
for i in range(n):
    n=input()
    n=int(n)
    arr1=list(map(int,input().split()))

il ciclo for deve funzionare 'n' numero di volte. la seconda 'n' è la lunghezza dell'array. l'ultima istruzione associa gli interi a un elenco e accetta input in forma separata da spazio. puoi anche restituire l'array alla fine del ciclo for.


3

Ho riscontrato un problema di acquisizione dell'input di numeri interi durante la risoluzione di un problema su CodeChef , in cui due numeri interi - separati da spazio - devono essere letti da una riga.

Mentre int(input())è sufficiente per un singolo numero intero, non ho trovato un modo diretto per inserire due numeri interi. Ho provato questo:

num = input()
num1 = 0
num2 = 0

for i in range(len(num)):
    if num[i] == ' ':
        break

num1 = int(num[:i])
num2 = int(num[i+1:])

Ora uso num1 e num2 come numeri interi. Spero che questo ti aiuti.


Questo sembra molto interessante. Tuttavia, non viene idistrutto quando forsi esce dal loop?

@hosch250Quando si esce da un ciclo, il valore della variabile indice (qui, i) rimane. Ho provato questo pezzo e funziona correttamente.
Aravind,

1
Per questo tipo di manipolazione dell'input, puoi num1, num2 = map(int, input().split())sapere se sai quanti numeri interi incontrerai o in nums = list(map(int, input().split()))caso contrario.
301_Moved_Permanently

3
def dbz():
    try:
        r = raw_input("Enter number:")
        if r.isdigit():
            i = int(raw_input("Enter divident:"))
            d = int(r)/i
            print "O/p is -:",d
        else:
            print "Not a number"
    except Exception ,e:
        print "Program halted incorrect data entered",type(e)
dbz()

Or 

num = input("Enter Number:")#"input" will accept only numbers

2

Mentre nel tuo esempio, int(input(...))fa il trucco, in ogni caso, python-future's builtins.inputvale la pena di considerazione dal momento che consente di verificare le tue opere codice sia per Python 2 e 3 e il comportamento predefinito di disabili python2 di inputcercare di essere 'intelligente' sul tipo di dati in ingresso ( builtins.inputfondamentalmente solo si comporta come raw_input).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.