Bagaimana saya bisa membaca input sebagai angka?

261

Mengapa xdan ystring bukan ints dalam kode di bawah ini?

(Catatan: menggunakan Python 2.x. raw_input()Dalam Python 3.x digunakan input(). raw_input()Diubah namanya menjadi input()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
smci
sumber

Jawaban:

313

TLDR

  • Python 3 tidak mengevaluasi data yang diterima dengan inputfungsi, tetapi fungsi Python 2 inputtidak (baca bagian selanjutnya untuk memahami implikasinya).
  • Setara dengan Python 2 dengan Python 3 inputadalah raw_inputfungsinya.

Python 2.x

Ada dua fungsi untuk mendapatkan input pengguna, dipanggil inputdan raw_input. Perbedaan di antara mereka adalah, raw_inputtidak mengevaluasi data dan mengembalikan apa adanya, dalam bentuk string. Tetapi, inputakan mengevaluasi apa pun yang Anda masukkan dan hasil evaluasi akan dikembalikan. Sebagai contoh,

>>> 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'>)

Data 5 + 17dievaluasi dan hasilnya adalah 22. Ketika mengevaluasi ekspresi 5 + 17, itu mendeteksi bahwa Anda menambahkan dua angka dan hasilnya juga akan dari inttipe yang sama . Jadi, konversi jenis dilakukan secara gratis dan 22dikembalikan sebagai hasil inputdan disimpan dalam datavariabel. Anda dapat menganggapnya inputsebagai yang raw_inputdikomposisi dengan evalpanggilan.

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

Catatan: Anda harus berhati-hati saat menggunakan inputPython 2.x. Saya menjelaskan mengapa orang harus berhati-hati saat menggunakannya, dalam jawaban ini .

Tapi, raw_inputjangan mengevaluasi input dan kembali apa adanya, sebagai string.

>>> 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's inputdan Python 2.x's raw_inputserupa dan raw_inputtidak tersedia di 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'>)

Larutan

Untuk menjawab pertanyaan Anda, karena Python 3.x tidak mengevaluasi dan mengubah tipe data, Anda harus secara eksplisit mengonversi ke ints, dengan int, seperti ini

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

Anda dapat menerima nomor dari basis mana pun dan mengonversinya langsung ke basis-10 dengan intfungsi, seperti ini

>>> 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

Parameter kedua memberi tahu apa basis dari angka-angka yang dimasukkan dan kemudian secara internal memahami dan mengubahnya. Jika data yang dimasukkan salah maka akan melempar a 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'

Untuk nilai-nilai yang dapat memiliki komponen fraksional, tipe akan floatlebih daripada int:

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

Terlepas dari itu, program Anda dapat diubah sedikit, seperti ini

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

Anda dapat menyingkirkan playvariabel dengan menggunakan breakdan while True.

thethourtheye
sumber
Apakah ada cara lain, seperti fungsi atau sesuatu sehingga kita tidak perlu mengkonversi ke int di 3.x selain melakukan konversi eksplisit ke int ??
Shreyan Mehta
@ShreyanMehta evalakan berfungsi, tetapi jangan lakukan itu kecuali Anda memiliki alasan mendesak.
theouroureyey
2
@thefourtheye setidaknya gunakan ast.literal_evaluntuk itu. Itu tidak memiliki masalah keamanan eval.
spektrum
4
Saya menggunakan T&J ini sebagai target dupe, tetapi mungkin Anda dapat menambahkan TDLR dengan solusi python 3, yaitu int(input()... di bagian atas? Python 2 mendekati akhir kehidupannya dan info python 3 terlalu dikubur IMO
Chris_Rands
Bit terakhir tentang menghapus permainan sebagai variabel tidak semudah bermain variabel membuat kode lebih dimengerti. Dan memberikan saran untuk bagaimana kode dapat berubah tanpa alasan bukanlah praktik yang baik. Kalau tidak, itu adalah jawaban yang bagus :)
OuuGiii
44

Dalam Python 3.x, raw_inputdiubah namanya menjadi inputdan Python 2.x inputdihapus.

Ini berarti, sama seperti raw_input, inputdi Python 3.x selalu mengembalikan objek string.

Untuk memperbaiki masalah, Anda perlu secara eksplisit membuat input tersebut menjadi bilangan bulat dengan memasukkannya ke dalam int:

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

Untuk beberapa integer dalam satu baris, mapmungkin lebih baik.

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

Jika nomornya sudah diketahui, (seperti 2 bilangan bulat), Anda dapat menggunakan

num1, num2 = map(int, raw_input().split())
pengguna1341043
sumber
16

input()(Python 3) dan raw_input()(Python 2) selalu mengembalikan string. Konversi hasilnya menjadi integer secara eksplisit dengan int().

x = int(input("Enter a number: "))
y = int(input("Enter a number: "))
Martijn Pieters
sumber
11

Beberapa pertanyaan memerlukan input untuk beberapa bilangan bulat pada satu baris. Cara terbaik adalah dengan memasukkan seluruh string angka satu baris dan kemudian membaginya menjadi bilangan bulat. Ini adalah versi Python 3:

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

Juga pemahaman daftar dapat digunakan

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

Dan untuk mengkonversi semua input dari string ke int kita lakukan hal berikut

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

harus mencetak elemen daftar dalam garis lurus.

tolol
sumber
6

Konversikan ke bilangan bulat:

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

Demikian pula untuk nomor floating point:

my_decimalnumber = float(input("enter the number"))
Hemanth Savasere
sumber
4
n=int(input())
for i in range(n):
    n=input()
    n=int(n)
    arr1=list(map(int,input().split()))

for for akan menjalankan 'n' beberapa kali. 'n' yang kedua adalah panjang array. pernyataan terakhir memetakan bilangan bulat ke daftar dan mengambil input dalam bentuk yang dipisahkan ruang. Anda juga dapat mengembalikan array di akhir for for loop.

ravi tanwar
sumber
3

Saya mengalami masalah dalam mengambil input integer sambil menyelesaikan masalah pada CodeChef , di mana dua integer - dipisahkan oleh spasi - harus dibaca dari satu baris.

Meskipun int(input())cukup untuk satu integer, saya tidak menemukan cara langsung untuk memasukkan dua integer. Saya mencoba ini:

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:])

Sekarang saya menggunakan num1 dan num2 sebagai bilangan bulat. Semoga ini membantu.

Aravind
sumber
Ini terlihat sangat menarik. Namun, bukankah idihancurkan ketika forloop keluar?
@hosch250Ketika loop keluar, nilai variabel indeks (di sini, i) tetap. Saya mencoba bagian ini, dan itu berfungsi dengan benar.
Aravind
1
Untuk manipulasi input semacam ini, Anda bisa num1, num2 = map(int, input().split())jika Anda tahu berapa banyak bilangan bulat yang akan Anda temui atau nums = list(map(int, input().split()))jika tidak.
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
Sanyal
sumber
2

Sementara dalam contoh Anda, int(input(...))lakukan trik dalam hal apa pun, python-futureitu builtins.inputpatut dipertimbangkan karena memastikan kode Anda berfungsi untuk Python 2 dan 3 dan menonaktifkan perilaku default Python2 untuk inputmencoba menjadi "pintar" tentang tipe data input ( builtins.inputpada dasarnya hanya berperilaku seperti raw_input).

Tobias Kienzler
sumber