0 Вопрос: моя программа високосного года в Python показывает ошибку [дубликат]

вопрос создан в Wed, Apr 10, 2019 12:00 AM

Почему в приведенном ниже коде вместо строк вставляются строки 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
    
262
  1. 2018-09-13 20: 50: 23Z
10 ответов                              10                         

TLDR

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

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

    

270
2019-05-17 12: 04: 18Z
  1. Есть ли другой способ, например, функция или что-то такое, что нам не нужно преобразовывать в int в 3.x, кроме явного преобразования в int ??
    2016-04-09 06: 19: 24Z
  2. @ ShreyanMehta eval будет работать, но не делайте этого, если у вас нет веских причин.
    2016-04-09 07: 01: 32Z
  3. @ thefourtheye хотя бы используйте ast.literal_eval для этого. У него нет проблем безопасности eval.
    2018-04-06 12: 48: 28Z
  4. Я использую этот Q & A в качестве цели двойного назначения, но, возможно, вы можете добавить TDLR с решением Python 3, т.е. int(input() ... вверху? Python 2 подходит к концу, а информация о Python 3 слишком скрыта. IMO
    2018-07-24 14: 36: 54Z

В 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: "))
    
40
2019-05-17 12: 08: 00Z

Для нескольких целых чисел в одной строке может быть лучше использовать map . р>

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

Если число уже известно (например, 2 целых числа), вы можете использовать

num1, num2 = map(int, raw_input().split())
    
23
2019-05-17 12: 11: 57Z

input() (Python 3) и raw_input() (Python 2) всегда возвращают строки. Преобразуйте результат в целое число явно с int().

x = int(input("Enter a number: "))
y = int(input("Enter a number: "))
    
13
2019-05-17 12: 12: 35Z

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

a = []
p = input()
p = p.split()      
for i in p:
    a.append(int(i))
    
10
2019-05-17 12: 20: 13Z

Преобразовать в целые числа:

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

Аналогично для чисел с плавающей запятой:

my_decimalnumber = float(input("enter the number"))
    
6
2017-01-26 04: 28: 51Z

Я столкнулся с проблемой получения целочисленного ввода при решении проблемы в 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 в качестве целых чисел. Надеюсь, это поможет.

    
3
2014-05-23 11: 32: 22Z
  1. Это выглядит очень интересно. Однако не уничтожается ли i при выходе из цикла for?
    2014-05-23 16: 33: 19Z
  2. @hosch250 При выходе из цикла значение индексной переменной (здесь i) остается. Я попробовал этот кусок, и он работает правильно.
    2014-05-24 15: 18: 11Z
  3. Для этого вида манипулирования вводом вы можете либо num1, num2 = map(int, input().split()), если вы знаете, сколько целых чисел вы встретите, либо nums = list(map(int, input().split())), если вы этого не сделаете.
    2018-07-12 12: 58: 38Z
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
    
3
2019-04-04 08: 47: 19Z
raw_input

цикл for должен выполняться n раз. второе «n» - длина массива. последний оператор отображает целые числа в список и принимает ввод в разделенной пробелами форме. Вы также можете вернуть массив в конце цикла.

    
2
2018-08-03 16: 30: 31Z
n=int(input())
for i in range(n):
    n=input()
    n=int(n)
    arr1=list(map(int,input().split()))
источник размещен Вот