Python 3の `raw_input()`と `input()`の違いは何ですか?


362

違いは何であるraw_input()input()はPython 3では?


3
Python 2とPython 3の両方の入力に対応するプログラムをどのように互換性がありますか?
ソロモンウッコ2016年

2
これを行うには、名前エラーを設定inputraw_inputて無視します。
ソロモンウッコ2016年

3
python 2および3の互換性については、 'six'ライブラリを検索してください。
ジャックホーマン2017年

回答:


418

違いはraw_input()、Python 3.xには存在しないが、存在することですinput()。実際、古いraw_input()名前はに変更されinput()、古いものinput()はなくなりましたが、を使用して簡単にシミュレートできますeval(input())。(それeval()は悪であることを忘れないでください。可能であれば、入力を解析するより安全な方法を使用するようにしてください。)


93
raw_input... の違いは何ですか?」-「違いはないということraw_inputです。」...かなりの違いがあると思います!
ivan_pozdeev 2015

9
Python 2では、最初は(おそらく)ユーザーからの入力を要求するのはそのためだけだったので、プログラマーがユーザー入力をコマンドとして実際に「実行」したいと思っていたと思います。しかし、プログラマーが「raw」入力も取得したい場合があることに気付いたとき、「raw_input」と呼ばれる別の関数を設計しました。Python 3で彼らは何が愚かであるかに気づき、元の入力のデフォルトの実行を削除するだけで、1つの単純な関数しか得られませんでした。
JCロカモンデ2015

1
Py3.5.1を実行しているRepl.itには、キーワードとしてraw_input()があります。
OldBunny2800

2
セキュリティリスクとなる可能性があるため、一般的にはeval(およびexec)は回避する必要があると言う必要があります。詳細については、SOのベテランNed BatchelderによるEvalの危険性をご覧ください。そしてもちろん、そのアドバイスは古いPython 2にも適用されinputます。
PM 2Ring 2017年

1
@ PM2Ring回答に警告を追加しました。もちろん、eval()との両方に有効な使用例exec()がありますが、使用eval()することを決定する前に、使用しない理由を理解する必要があります。
Sven Marnach

192

Python 2ではraw_input()、文字列を返しinput()、入力をPython式として実行しようとします。

ほとんどの場合、文字列を取得することが目的どおりだったので、Python 3はでそれを行いinput()ます。スヴェンが言うように、もしあなたが古い振る舞いを望むなら、うまくいきますeval(input())


7
Python 3にはないことを追加する必要がありますraw_input()
Martin Thoma 2013年

入力をpython式として使用することは何ですか?
Akshay Vijay Jain 2017

1
@AkshayVijayJain、おそらくそれは数字を入力するためのものでした。しかし、それは完全に安全ではありません。
MarSoft、2017年

112

Python 2:

  • raw_input() ユーザーが入力した内容を正確に取り、文字列として返します。

  • input()最初にraw_input()それを取り、次にそれに対しても実行eval()します。

主な違いはinput()、構文的に正しいpythonステートメントを期待しているところにraw_input()あります。

Python 3:

  • raw_input()に名前が変更されたinput()ためinput()、正確な文字列を返すようになりました。
  • 古いinput()が削除されました。

古いを使用input()する場合、つまりユーザー入力をpythonステートメントとして評価する必要がある場合は、を使用して手動で実行する必要がありeval(input())ます。


26

Python 3では、raw_input()Svenによってすでに言及されたものは存在しません。

Python 2では、input()関数は入力を評価します。

例:

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

上記の例では、Python 2.xはharshaを文字列ではなく変数として評価しようとしています。これを回避するには、 "harsha"のように入力を二重引用符で囲みます。

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

raw_input()

raw_input() `関数は評価せず、入力した内容を読み取るだけです。

例:

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

例:

 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

上記の例では、eval関数でユーザー入力を評価しようとしていました。


7

私はpython 2ユーザーのために皆から提供された説明にもう少し詳細を追加したいと思いますraw_input()これで、ユーザーが文字列として入力するデータを評価します。これは、Pythonが入力されたデータを再度理解しようとはしないことを意味します。考慮されるのは、入力されたデータが実際の文字列であるかintであるかどうかに関係なく、文字列であることだけです。

一方input()、ユーザーが入力したデータを理解しようとします。そのため、入力のようなhelloworld場合でも、エラーが ' helloworld is undefined'と表示されます。

結論として、python 2の場合、文字列も入力するhelloworldには、Pythonで文字列を使用するために使用される一般的な構造である「」のように入力する必要があります。


3

コードがpython2およびpython3で実行されていることを確認したい場合は、スクリプトで関数input()を使用し、これをスクリプトの開始に追加します。

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")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.