入力を数値として読み取るにはどうすればよいですか?


261

以下のコードでintの代わりにxand y文字列があるのはなぜですか?

(注:Pythonの2.xの使用中raw_input()。でのPython 3.xの使用はinput()raw_input()に改名された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

回答:


313

TLDR

  • Python 3はinputfunctionで受け取ったデータを評価しませんが、Python 2のinput関数は評価します(意味を理解するには次のセクションを読んでください)。
  • Pythonの3つの者のPythonの2の同等でinputあるraw_input機能。

Python 2.x

ユーザー入力を取得する関数には、inputおよびの2つがありましたraw_input。それらの違いは、raw_inputデータを評価せず、文字列形式でそのまま返されます。ただし、input入力したものはすべて評価され、評価の結果が返されます。例えば、

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

データ5 + 17が評価され、結果は22です。式を評価するときに、5 + 172つの数値を加算していることが検出されるため、結果も同じint型になります。したがって、型変換は無料で行われ、変数の22結果として返され、変数にinput格納されdataます。あなたは考えることができますinputようraw_inputに構成evalコール。

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

注:input Python 2.xで使用する場合は注意が必要です。この答えで、なぜそれを使用するときに注意が必要なのかを説明しました。

ただし、raw_input入力を評価せず、そのまま文字列として返します。

>>> 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 inputとPython 2.x raw_inputは類似しておりraw_input、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'>)

解決

Pythonの3.xのは評価し、データ型を変換しないため、明示的に変換する必要があり、あなたの質問に答えるためintに、S intのように、

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

次のintような関数を使用して、任意のベースの数を受け入れ、それらを直接base-10に変換できます。

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

2番目のパラメーターは、入力された数値の基数を示し、内部的にそれを理解して変換します。入力したデータが間違っている場合は、がスローされます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'

小数部を持つことができる値については、タイプは以下のようになりfloatいうよりint

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

それとは別に、このようにプログラムを少し変更することができます

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

playを使用して、変数を取り除くことができます。breakwhile True


intへの明示的な変換を行う以外に、3.xでintに変換する必要がないように、関数または何かのような他の方法はありますか?
Shreyan Mehta

@ShreyanMehta evalは機能しますが、差し迫った理由がない限り、それを実行しないでください。
thefourtheye

2
@thefourtheyeは少なくともそのために使用ast.literal_evalします。のセキュリティ上の懸念はありませんeval
18

4
私はこのQ&Aをだまされたターゲットとして使用していますが、おそらくpython 3ソリューションでTDLRを追加できint(input()ます。Python 2の寿命が近づいており、Python 3の情報が埋もれすぎているIMO
Chris_Rands '24 / 07/18

変数としての再生の削除に関する最後のビットは、変数の再生によってコードが理解しやすくなるため、それほど便利ではありません。そして、理由なしにコードがどのように変化するかについての提案をすることは良い習慣ではありません。そうでなければ、それはいい答えです:)
OuuGiii

44

Python 3.xでは、raw_inputに名前が変更されinput、Python 2.x inputは削除されました。

これは、Python 3.xと同様にraw_inputinput常に文字列オブジェクトを返すことを意味します。

問題を解決するには、これらの入力を次のように入力して、明示的に整数にする必要がありますint

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

27

1行に複数の整数がある場合は、mapより良い場合があります。

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

数値が既知の場合(2つの整数など)、次のように使用できます

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

16

input()(Python 3)とraw_input()(Python 2)は常に文字列を返します。結果を明示的に整数に変換しint()ます。

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

11

複数の質問では、1行に複数の整数を入力する必要があります。最良の方法は、数値の文字列全体を1行に入力して、それらを整数に分割することです。Python 3のバージョンは次のとおりです。

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

リスト内包表記も使用できます

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

そして、すべての入力をstringからintに変換するには、次のようにします

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

リストの要素を直線で印刷します。


6

整数に変換:

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

同様に、浮動小数点数の場合:

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

forループは 'n'回実行されます。2番目の「n」は配列の長さです。最後のステートメントは整数をリストにマップし、スペースで区切られた形式で入力を受け取ります。forループの最後に配列を返すこともできます。


3

スペースで区切られた2つの整数を1行で読み取る必要があるCodeChefの問題を解決するときに、整数入力を取得する問題に遭遇しました。

一方でint(input())、単一の整数のために十分である、私は入力2つの整数への直接的な方法を見つけることができませんでした。私はこれを試しました:

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

現在、整数としてnum1とnum2を使用しています。お役に立てれば。


これは非常に興味深く見えます。しかし、ループが終了したiときに破壊されていませんforか?

@hosch250ループが終了すると、インデックス変数(ここではi)の値が残ります。私はこの作品を試してみましたが、正しく動作しました。
Aravind 2014年

1
この種の入力操作では、num1, num2 = map(int, input().split())発生する整数の量がわかっているnums = list(map(int, input().split()))場合とそうでない場合があります。
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

あなたの例では、一方でint(input(...))どのような場合には、トリックを行い、python-futureさんがbuiltins.input検討する価値があるが行うので、必ずあなたのコードは、Python 2と3の両方のために働くのPython2のデフォルト動作無効input入力データ型について『賢い』になろうとする(builtins.input基本的にはのように動作しますraw_input)。

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