Як я можу прочитати вводи як цифри?


261

Чому xі yрядки замість ints у наведеному нижче коді?

(Примітка: при використанні 2.x Python 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

Другий параметр вказує, що є базою введених чисел, а потім внутрішньо він це розуміє та перетворює. Якщо введені дані неправильні, він викине a 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

Останній біт про видалення гри як змінної не так зручний, оскільки відтворення змінної робить код більш зрозумілим. І давати пропозиції про те, як код міг би змінюватися без причини, не є хорошою практикою. Інакше це приємна відповідь :)
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' - довжина масиву. останнє висловлення відображає цілі числа до списку і приймає вхід у розділеному пробілом вигляді. Ви також можете повернути масив в кінці для циклу.


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_Постійно

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.