Python: как запросить строку как ввод, а не конкретное значение - PullRequest
0 голосов
/ 28 июня 2018

Для ввода YourName () я хотел бы получить значение, которое является строкой. Следовательно, это не должно быть float, int и т. Д. В этом примере я хотел бы заменить «Sunny» на любое значение, являющееся строкой, чтобы цикл while принимал ввод.

YourName = ''

while YourName != "Sunny":
    print("Please type in your name")
    YourName = input()

print(YourName + " is correct")

Заранее спасибо, лучший

Sentino

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Как уже отмечали другие, input() всегда возвращает строку.

Вы можете использовать метод str.isalpha, чтобы проверить, является ли символ буквой.

YourName = ''

while True:
    print("Please type in your name")
    YourName = input()
    failed = False
    for char in YourName:
        if not char.isalpha():
            failed = True

    if not failed:
        break

Пример:

Please type in your name
> 123
Please type in your name
> John1
Please type in your name
John
John is correct
0 голосов
/ 28 июня 2018

Возможно, вы используете Python 2.7, и в этом случае вам нужно использовать raw_input(), если вы хотите получить входные данные в виде строки напрямую.

В противном случае, в Python 3, input() всегда возвращает строку. Поэтому, если пользователь вводит «3 @!%» В качестве своего имени, это значение будет сохранено в виде строки (тип переменной можно проверить с помощью type(variable)).

Если вы хотите проверить, что строка содержит только буквы, вы можете использовать методы isalpha() и isspace() (в моем примере кода я предполагаю, что вы хотите разрешить пробелы, но вы можете исключить это часть, если вы хотите, чтобы одно слово ответы).

Поскольку эти методы работают с символами, вам необходимо использовать цикл for:

YourName =""
while YourName is not "Sunny" or not all(x.isalpha() or x.isspace() for x in YourName):

     #You can pass a string as a prompt for the user here
     name = input("please enter name")
print (YourName)

Однако я должен отметить, что эта проверка является полностью избыточной, поскольку ни одна строка, содержащая небуквенный символ, никогда не может быть равна "Sunny".

0 голосов
/ 28 июня 2018

Как уже упоминалось в комментариях, вы можете использовать что-то похожее на следующее:

YourName = input("Please enter your name: ")

while True:
    if YourName.isalpha():
        break
    else:
        print("Must enter string")
        print("Please type in your name")
        YourName = input("Please enter your name: ")
        continue

isinstance () - это встроенная функция, которая проверяет, принадлежит ли переменная определенному классу, например, isinstance(my_var, str) == True. Однако , функция Input() всегда возвращает строку. Таким образом, если вы хотите убедиться, что введены все буквы, которые вы хотите использовать .isalpha () . Вы также можете использовать Try/except. Как сказал @SiHa , этот вопрос SO имеет большой ответ.


Как указано в комментариях, этот ответ не будет работать, если в строке есть пробел. Если вы хотите разрешить несколько форматов имен, вы можете использовать Regex. Например, вы можете сделать следующее:

import re

YourName = input("Please enter your name: ")

while True:
    if re.fullmatch(r"[a-zA-Z]+\s?[a-zA-Z]+", YourName) is not None:
        break
    else:
        print("Must enter string")
        print("Please type in your name")
        YourName = input("Please enter your name: ")
        continue

Использование регулярных выражений даст вам больше контроля над входными данными, чем обычные строковые методы. Документы , Python Regex HOWTO . re - это стандартная библиотека, которая поставляется с python и обеспечит вам максимальную гибкость. Вы можете использовать regex101 , чтобы помочь вам тестировать и отлаживать.

Что re.fullmatch() вернет объект совпадения, если найден, и None, если нет. Он говорит, что ввод может быть любой заглавной или заглавной буквой с необязательным пробелом в середине, за которым следуют дополнительные буквы.


Если вы не хотите импортировать пакет, вы можете перебрать свой входной объект и проверить, все ли символы - пробел или альфа, используя:

all([x.isalpha() | x.isspace() for x in YourName])

однако это не скажет, сколько мест есть или где они находятся. Было бы оптимально использовать Regex, если вы хотите больше контроля.

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