Python 3'teki `raw_input ()` ve `input ()` arasındaki fark nedir?


362

Arasındaki fark nedir raw_input()ve input()Python 3'te?


3
Hem Python 2 hem de Python 3 girişlerini alan bir programı nasıl uyumlu hale getirirsiniz?
Solomon Ucko

2
Bunu yapmak inputiçin raw_inputad hatalarını ayarlamaya ve yok saymaya çalışın .
Solomon Ucko

3
Python 2 ve 3 uyumluluğu için 'altı' kütüphaneye bakın.
Jack Homan

Yanıtlar:


418

Fark, raw_input()Python 3.x'te input()bulunmamasıdır. Aslında, eski raw_input()olarak yeniden adlandırıldı input()ve eski input()gitti, ancak kullanılarak kolayca simüle edilebilir eval(input()). (Bunun eval()kötü olduğunu unutmayın . Mümkünse girişinizi ayrıştırmak için daha güvenli yollar kullanmaya çalışın.)


93
" raw_input... arasındaki fark nedir ?" - "Aradaki fark, hayır raw_input." ... Oldukça büyük bir fark, diyebilirim!
ivan_pozdeev

9
Python 2'de, programcıların aslında kullanıcı girdisinin bir komutu olarak "yürütmek" istediklerini tahmin ettiler, çünkü başlangıçta (sanırım) kullanıcıdan girdi istemek sadece bunun için olabilir. Ancak programcıların "raw" girdisini de almak isteyebileceklerini fark ettiklerinde, "raw_input" adlı başka bir işlev tasarladılar. Python 3'te bunun ne kadar aptal olduğunu fark ettiler ve orijinal giriş varsayılanının yürütülmesini sildi, sadece tek bir basit işlev sağladılar.
JC Rocamonde

1
Repl.it, Py3.5.1 çalıştıran bir anahtar kelime olarak raw_input () vardır.
OldBunny2800

2
O söylenmesi gerekiyor eval(ve execonlar bir güvenlik riski olabilir çünkü) genellikle kaçınılmalıdır. Ayrıntılar için, bkz. Eval gerçekten SO kıdemli gazisi Ned Batchelder tarafından tehlikelidir . Ve elbette bu tavsiye eski Python 2 için de geçerlidir input.
PM 2Ring

1
@ PM2Ring Cevaba bir uyarı ekledim. Tabii ki her ikisi için de geçerli kullanım durumları vardır eval()ve exec()ancak kullanmaya eval()karar vermeden önce neden kullanmamanız gerektiğini anlamanız gerekir .
Sven Marnach

192

Python 2'de , raw_input()bir dize döndürür ve input()girdiyi Python ifadesi olarak çalıştırmayı dener.

Bir dize almak neredeyse her zaman istediğiniz şey olduğundan, Python 3 bunu yapar input(). Sven'in dediği gibi, eğer eski davranışı istiyorsanız, eval(input())işe yarıyor.


7
Python 3'ün sahip olmadığını eklemelisiniz raw_input().
Martin Thoma

Python ifadesi olarak çalışan girdinin kullanımı nedir?
Akshay Vijay Jain

1
@AkshayVijayJain, muhtemelen sayı girmek için tasarlandı. Ama tamamen güvensiz.
MarSoft

112

Python 2:

  • raw_input() kullanıcının tam olarak yazdıklarını alır ve bir dize olarak geri gönderir.

  • input()önce alır raw_input()ve sonra eval()üzerinde de gerçekleştirir .

Temel fark, input()sözdizimsel olarak doğru bir python deyimi beklemesidir.raw_input() olması.

Python 3:

  • raw_input()input()şimdi yeniden adlandırıldıinput() tam dizeyi döndürüyor.
  • Eski input()kaldırıldı.

Eskiyi kullanmak istiyorsanız input(), yani bir kullanıcı girişini python deyimi olarak değerlendirmeniz gerekiyorsa, bunu kullanarak manuel olarak yapmanız gerekir eval(input()).


26

Python 3'te, raw_input()Sven tarafından daha önce sözü edilen mevcut değil.

Python 2'de input()işlev girişinizi değerlendirir.

Misal:

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

Yukarıdaki örnekte, Python 2.x harsha'yı bir dize yerine bir değişken olarak değerlendirmeye çalışmaktadır. Bundan kaçınmak için, girdimizin etrafında "harsha" gibi çift tırnak kullanabilirsiniz:

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

Ham girdi()

Raw_input () `işlevi değerlendirilmez, girdiğiniz her şeyi okuyacaktır.

Misal:

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

Misal:

 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

Yukarıdaki örnekte, sadece evalfonksiyon ile kullanıcı girişini değerlendirmeye çalışıyordum .


7

Python 2 kullanıcıları için herkes tarafından sağlanan açıklamaya biraz daha detay eklemek istiyorum . raw_input(), artık kullanıcının dize olarak girdiği verileri değerlendirdiğini bilirsiniz. Bu, python'un girilen verileri tekrar anlamaya çalışmadığı anlamına gelir. Dikkate alınacak tek şey, girilen verilerin gerçek bir dize ya da int ya da herhangi bir şey olsun, dize olacağıdır.

İken input()diğer taraftan denemeden kullanıcı tarafından girilen verileri anlamak için. Böylece girdi helloworldbile hatayı ' helloworld is undefined' olarak gösterecektir .

Sonuç olarak, python 2 için , bir dize girmek için de ' helloworld' python'da dizeleri kullanmak için kullanılan ortak yapı olan ' ' gibi girmeniz gerekir .


3

Kodunuzun python2 ve python3 ile çalıştığından emin olmak istiyorsanız, komut dosyanızda function input () işlevini kullanın ve bunu komut dosyanızın başına eklemek için ekleyin:

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")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.