оператор if с вводом, который принимает int & string - PullRequest
1 голос
/ 08 июля 2019

Новое в Python (2.7).Я пытаюсь собрать пользовательский ввод, который может быть как int, так и строкой (я предполагаю, что это возможно, хотя я не уверен на 100%).Когда я добираюсь до заявления, которое я опубликовал ниже, любой номер, который я ввожу, печатает сообщение «Неверный ввод» и снова запрашивает ввод пользователя, даже если он находится в пределах диапазона, который я хочу.Ввод «q» по-прежнему работает правильно и возвращается, если введен.

Я попытался изменить это первое if выражение на (0 <= collectEyesBlade <= 9) ... тоже безуспешно.

while True:
    collectEyesBlade = raw_input(
        "\nEnter desired blade number: ")
    if collectEyesBlade in [range(0,9)]:
        break
    elif collectEyesBlade.lower() == 'q':
        return
    else:
        print "\nInvalid input. Enter value between 0 and 9, or 'q' to quit"
        continue

Ответы [ 3 ]

1 голос
/ 08 июля 2019

Поскольку raw_input возвращает str, начните со сравнения, в котором используется другая строка.Затем попробуйте преобразовать его в int.Наконец, если это удастся, попробуйте сравнение целых чисел.

while True:
    collectEyesBlade = raw_input("\nEnter desired blade number: ")

    if collectEyesBlade.lower() == 'q':
        return

    try:
        collectEyesBlade = int(collectEyesBlade)
    except ValueError:
        print "\nInvalid input. Enter value between 0 and 9, or 'q' to quit"
        continue

    if collectEyesBlade in range(0,9):
        break
0 голосов
/ 08 июля 2019

Вы попали в две маленькие причуды Python.Один: диапазон сам по себе является итеративным, но его можно поместить внутри другого итерируемого.

Другими словами, ваше утверждение

if collectEyesBlade in [range(0,9)]:

проверяет, является ли collectEyesBladeэлемент в списке, который имеет только один элемент: диапазон итерируемый.Так как вы не вводите диапазон итеративно, он терпит неудачу.

Вместо этого вы можете сказать

if collectEyesBlade in list(range(0,9)):

, который превратит диапазон итерируемо в фактический список, или просто

if collectEyesBlade in range(0,9):

Любой из них должен делать то, что вы намерены.

Однако, как уже упоминал другой ответчик, это только половина проблемы.Если бы ваш ввод был, возможно, целочисленным, вышеприведенного было бы достаточно, но вы запрашиваете строковый ввод.Тот факт, что ввод «1», не означает, что он не строковый.

Здесь есть несколько вариантов.Вы можете сделать попытку, за исключением преобразования строкового ввода в целое число, и если это не удастся из-за невозможности преобразования строки в целое число, продолжайте;или вы можете преобразовать диапазон / список чисел для сравнения в строки.

0 голосов
/ 08 июля 2019

if collectEyesBlade in [str(x) for x in range(0,9)] - это должно работать, поскольку collectEyesBlade является строкой, поэтому нам нужно сравнить ее со строкой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...