Бесконечный цикл с input () в Python 3, даже учитывая учебник об этом - PullRequest
0 голосов
/ 22 мая 2019

Я использую Python 3.7.1.

Я представлю свои ожидания, чтобы быть понятнее читателю. Я ввожу выбор через input(), и если я написал цикл while, это делается для того, чтобы снова спросить меня, введу ли я неправильную «команду» (неправильный ввод).

Итак, давайте посмотрим на script.py ниже:

champ_choix=""
while champ_choix!="1" or champ_choix!="2":
    champ_choix=input("Pour cat_course tapez 1\nPour hippodrome tapez 2\n")
    print("L'input est : {}".format(champ_choix))#print the input is:
    print("le type de l'input est: {}".format(type(champ_choix)))#print the type is:

    if champ_choix=="1":
    ##CHOIX DE LA COLLECTION##
        collection_num=""
        while collection_num!="1" or collection_num!="2":
            collection_num=input("Pour la collection geny_rapp tapez 1\nPour la collection geny_cotes tapez 2\n")
        #Do some instructions useless to show

    if champ_choix=="2":
        subprocess.run(['scrapy crawl test_shell -a nom_prix=True'],shell=True)
        #if choice is "2" launch a spider with scrapy

Мне нужно уточнить, что я пытался сначала без отступа от условий if, указанных выше, и с использованием других слов условий: if champ_choix=="1": .... elif champ_choix=="2":... else: pass, но это все равно не работает.

Проблема в том, что когда я запускаю скрипт в терминале, он дает мне:

(base) avy@avy-Moi:~/folder$ python script.py
Pour cat_course tapez 1
Pour hippodrome tapez 2
2 <- the input I entered
L'input est : 2
le type de l'input est: <class 'str'>
Pour cat_course tapez 1
Pour hippodrome tapez 2

Как видите, он действительно создает правильный вход: 2, и это правильный тип ввода: str. Но это делает бесконечный цикл, и я не понимаю почему, потому что с учетом этого урока это так же.

Ответы [ 2 ]

3 голосов
/ 22 мая 2019
while champ_choix!="1" or champ_choix!="2"

не работает так, как вы думаете.champ_choix должно иметь два значения одновременно, чтобы оно всегда было ложным, а это невозможно.

Вы хотите убедиться, что оно не равно "1", и это не равно "2":

while champ_choix!="1" and champ_choix!="2"
2 голосов
/ 22 мая 2019

Самый простой способ проверить champ_choix против 1 или 2 - использовать in, или в этом случае not in:

while champ_choix not in ('1', '2'):

Точно так же вы можете использовать not вокруг всего выражения и отрицать операторы сравнения (превратить != в ==):

while not (champ_choix == '1' or champ_choix == '2'):
...