Как я могу читать входные данные как числа?


261

Почему в приведенном ниже коде есть строки xи 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 не оценивает данные, полученные с помощью inputфункции, но функция Python 2 inputделает (прочитайте следующий раздел, чтобы понять смысл).
  • Эквивалентом Python 2 для Python 3 inputявляется raw_inputфункция.

Python 2.x

Было две функции для получения пользовательского ввода, вызванные inputи 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 + 17, он обнаруживает, что вы добавляете два числа, и поэтому результат также будет того же 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 не оценивает и не конвертирует тип данных, вы должны явно преобразовать в ints int, например, так:

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

Вы можете принимать числа любой базы и конвертировать их непосредственно в базу-10 с помощью intфункции, подобной этой

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

Второй параметр сообщает, что является основой введенных чисел, а затем внутренне понимает и преобразует их. Если введенные данные неверны, будет выброшено 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переменной с помощью breakи while True.


Есть ли другой способ, например, функция или что-то еще, чтобы нам не нужно преобразовывать в int в 3.x, кроме явного преобразования в int ??
Шреян Мехта

@ShreyanMehta evalсработает, но не делайте этого, если у вас нет веских причин.
thefourtheye

2
@thefourtheye по крайней мере использовать ast.literal_evalдля этого. У него нет проблем безопасности eval.
спектры

4
Я использую эти вопросы и ответы как двойную цель, но, может быть, вы можете добавить TDLR с решением Python 3, то есть int(input()... вверху? Python 2 приближается к концу своей жизни, и информация о Python 3 слишком похоронена IMO
Chris_Rands

Последнее, что касается удаления play как переменной, не так удобно, поскольку переменная play делает код более понятным. И давать советы о том, как код может измениться без причины, не является хорошей практикой. В противном случае, это хороший ответ :)
OuuGiii

44

В Python 3.x raw_inputбыл переименован в, inputа Python 2.x inputбыл удален.

Это означает , что, так же , как raw_input, inputв Python 3.x всегда возвращает объект строки.

Чтобы решить проблему, вам нужно явно превратить эти входные данные в целые числа, поместив их в int:

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

27

Для нескольких целых чисел в одной строке, 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

Несколько вопросов требуют ввода нескольких чисел в одной строке. Лучший способ - ввести целую строку чисел в одну строку, а затем разбить их на целые числа. Вот версия Python 3:

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

Также может быть использовано понимание списка

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

И чтобы преобразовать все входные данные из строки в 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 раз. вторая 'n' - длина массива. последний оператор отображает целые числа в список и принимает ввод в разделенной пробелами форме. Вы также можете вернуть массив в конце цикла for.


3

Я столкнулся с проблемой получения целочисленного ввода при решении проблемы в CodeChef , где два целых числа, разделенных пробелом, должны читаться из одной строки.

Хотя int(input())достаточно для одного целого числа, я не нашел прямой способ ввода двух целых чисел. Я попробовал это:

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) остается. Я попробовал этот кусок, и он работает правильно.
Аравинд

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«s builtins.inputстоит рассмотреть , так как это делает , что ваш код работает как Python 2 и 3 и поведение отключает python2 по умолчанию inputпытается быть„умным“о типе входных данных ( в builtins.inputосновном только ведет себя как raw_input).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.