Apa perbedaan antara `raw_input ()` dan `input ()` dalam Python 3?

362

Apa perbedaan antara raw_input()dan input()dalam Python 3?

pkumar
sumber
3
Bagaimana Anda membuat program yang mengambil input yang kompatibel dengan Python 2 dan Python 3?
Solomon Ucko
2
Untuk melakukan itu Anda mencoba untuk set inputke raw_inputdan mengabaikan kesalahan nama.
Solomon Ucko
3
Cari pustaka 'enam' untuk kompatibilitas python 2 dan 3.
Jack Homan

Jawaban:

418

Perbedaannya adalah bahwa raw_input()tidak ada dalam Python 3.x, sementara input()tidak. Sebenarnya, yang lama raw_input()telah diubah namanya menjadi input(), dan yang lama input()hilang, tetapi dapat dengan mudah disimulasikan dengan menggunakan eval(input()). (Ingat itu eval()jahat. Coba gunakan cara yang lebih aman untuk menguraikan masukan Anda jika memungkinkan.)

Sven Marnach
sumber
93
"Apa bedanya raw_input...?" - "Perbedaannya adalah tidak ada raw_input." ... Perbedaan yang cukup drastis, kataku!
ivan_pozdeev
9
Dalam Python 2 saya kira mereka menganggap programmer ingin benar-benar "mengeksekusi" sebagai perintah input pengguna, karena pada awalnya (saya kira) meminta input dari pengguna mungkin hanya untuk itu. Tetapi ketika mereka menyadari programmer mungkin juga ingin mendapatkan input "raw", mereka mendesain fungsi lain yang disebut "raw_input". Dalam Python 3 mereka memperhatikan apa yang bodoh itu dan hanya menghapus eksekusi default input asli, hanya menghasilkan satu fungsi sederhana.
JC Rocamonde
1
Repl.it, menjalankan Py3.5.1 memiliki raw_input () sebagai kata kunci.
OldBunny2800
2
Perlu dikatakan bahwa eval(dan exec) umumnya harus dihindari karena mereka dapat menjadi risiko keamanan. Untuk perincian, silakan lihat Eval benar-benar berbahaya oleh veteran SO Ned Batchelder. Dan tentu saja saran itu juga berlaku untuk Python 2 lama input.
PM 2Ring
1
@ PM2Ring Saya menambahkan peringatan pada jawabannya. Tentu saja ada kasus penggunaan yang valid untuk keduanya eval()dan exec(), tetapi Anda harus terlebih dahulu memahami mengapa Anda tidak harus menggunakan eval()sebelum memutuskan untuk menggunakannya.
Sven Marnach
192

Dalam Python 2 , raw_input()mengembalikan sebuah string, dan input()mencoba menjalankan input sebagai ekspresi Python.

Karena mendapatkan string hampir selalu seperti yang Anda inginkan, Python 3 melakukannya dengan input(). Seperti yang dikatakan Sven, jika Anda menginginkan perilaku lama, itu akan eval(input())berhasil.

Thomas K
sumber
7
Anda harus menambahkan bahwa Python 3 tidak punya raw_input().
Martin Thoma
apa gunanya menjalankan input sebagai ekspresi python?
Akshay Vijay Jain
1
@AkshayVijayJain, mungkin itu dimaksudkan untuk memasukkan angka. Tapi itu sama sekali tidak aman.
MarSoft
112

Python 2:

  • raw_input() mengambil persis apa yang diketik pengguna dan meneruskannya kembali sebagai string.

  • input()pertama mengambil raw_input()dan kemudian melakukan eval()di atasnya juga.

Perbedaan utama adalah bahwa input()mengharapkan pernyataan python yang benar secara sintaksis di mana raw_input()tidak.

Python 3:

  • raw_input()diganti namanya input()jadi sekarang input()mengembalikan string yang tepat.
  • Lama input()dihapus.

Jika Anda ingin menggunakan yang lama input(), artinya Anda perlu mengevaluasi input pengguna sebagai pernyataan python, Anda harus melakukannya secara manual dengan menggunakan eval(input()).

screenglow
sumber
26

Dalam Python 3, raw_input()tidak ada yang sudah disebutkan oleh Sven.

Dalam Python 2, input()fungsi mengevaluasi input Anda.

Contoh:

name = input("what is your name ?")
what is your name ?harsha

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    name = input("what is your name ?")
  File "<string>", line 1, in <module>
NameError: name 'harsha' is not defined

Pada contoh di atas, Python 2.x mencoba mengevaluasi harsha sebagai variabel daripada string. Untuk menghindari itu, kita dapat menggunakan tanda kutip ganda di sekitar input kita seperti "harsha":

>>> name = input("what is your name?")
what is your name?"harsha"
>>> print(name)
harsha

raw_input ()

Fungsi raw_input () `tidak mengevaluasi, itu hanya akan membaca apa pun yang Anda masukkan.

Contoh:

name = raw_input("what is your name ?")
what is your name ?harsha
>>> name
'harsha'

Contoh:

 name = eval(raw_input("what is your name?"))
what is your name?harsha

Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    name = eval(raw_input("what is your name?"))
  File "<string>", line 1, in <module>
NameError: name 'harsha' is not defined

Dalam contoh di atas, saya hanya mencoba mengevaluasi input pengguna dengan evalfungsi.

Harsha Vardhan
sumber
7

Saya ingin menambahkan sedikit lebih detail pada penjelasan yang diberikan oleh semua orang untuk pengguna python 2 . raw_input(), yang, sekarang, Anda tahu yang mengevaluasi data apa pun yang dimasukkan pengguna sebagai string. Ini berarti bahwa python bahkan tidak mencoba untuk memahami data yang dimasukkan lagi. Yang akan dipertimbangkan adalah bahwa data yang dimasukkan akan berupa string, apakah itu string aktual atau int atau apa pun.

Sementara input()di sisi lain mencoba memahami data yang dimasukkan oleh pengguna. Jadi input seperti helloworldbahkan akan menunjukkan kesalahan sebagai ' helloworld is undefined'.

Sebagai kesimpulan, untuk python 2 , untuk memasukkan string juga Anda harus memasukkannya seperti ' helloworld' yang merupakan struktur umum yang digunakan dalam python untuk menggunakan string.

Rubal
sumber
3

Jika Anda ingin memastikan, bahwa kode Anda berjalan dengan python2 dan python3, gunakan input fungsi () dalam skrip Anda dan tambahkan ini untuk memulai skrip Anda:

from sys import version_info
if version_info.major == 3:
    pass
elif version_info.major == 2:
    try:
        input = raw_input
    except NameError:
        pass
else:
    print ("Unknown python version - input function not safe")
Josef Klotzner
sumber