цикл while, не завершающий python

#python #python-2.x

#python #python-2.x

Вопрос:

я пишу интерактивную программу, которая отображает y / n после выбора опции. если в самом начале я нажимаю s или c, цикл while завершается. если я выбираю какой-то не первый раз «скажем, 5», 5-й параметр превращается в y, но после этого, если я нажимаю «s» или «c», 5-я запись отображается как «n», и программа не завершается. не уверен, что происходит не так. вопрос для начинающих.(также предлагается альтернативное решение, также невозможно импортировать другие пакеты)

 import os,time
selected_list=[]
def px_filter_menu(num):
    os.system("clear")
    data = ["p1","p2","p3","p4","p5","p6","p7","p8","p9","p10","p11","p12","p13","p14","p15","p16","p17","p18","p19","p20","p21","p22","p23","p24","p25","p26"]

    print("============================================================================n= Filter selection menu")
    print("============================================================================nn")

    gap =5

    for count , item in enumerate(data, 1):
        if count <10:
            if data[count-1] in selected_list:
                print("{0}.  {1} {2}".format(count,item.ljust(gap),"[y]"))
            else:
                print("{0}.  {1} {2}".format(count,item.ljust(gap),"[n]"))
        else:
            if data[count-1] in selected_list:
                print("{0}. {1} {2}".format(count,item.ljust(gap),"[y]"))
            else:
                print("{0}. {1} {2}".format(count,item.ljust(gap),"[n]"))

    print("nn[S] save and exit")
    print("nn[C] if you press C and wish to make changes please remove the PX and add againn")

    input = raw_input("enter the desired number ")
    
    if len(input.strip()) ==0:
        print("first")
        time.sleep(2)
        px_filter_menu(-1)
       
    while True:
        if input.upper()=="S":
            print("5")
            time.sleep(2)
            break

        elif input.upper()=="C":
            del selected_list[:]
            #by default all protocol goes
            print("6")
            time.sleep(2)
            break

        elif input.isdigit() and data[int(input)-1] in selected_list:
            print(input)
            selected_list.remove(data[int(input)-1])
            print("3")
            time.sleep(2)
            px_filter_menu(-1)

        elif input.isdigit():
            selected_list.append(data[int(input)-1])
            print("4")
            time.sleep(2)
            px_filter_menu(-1)
        else:
            px_filter_menu(-1)
    return

px_filter_menu(-1)
  

Комментарии:

1. используйте большие ‘S’ и ‘C’, при использовании .upper() во входных данных

2. Где вы получаете 2-й ввод? Я вижу, что вы спрашиваете только один раз…. вам нужно запросить новый ввод внутри цикла wile, чтобы сбросить выбранный input = raw_input("enter the desired number ")

3. @ZarakiKenpachi это все еще не завершает цикл, если сначала задано некоторое число, а затем задан s / c

4. Все еще бывают случаи, когда вы вводите бесконечный цикл while, даже не обновляя свое условие и никогда не сталкиваясь с break . То, что там есть рекурсивный вызов, не имеет значения.

5. @sai — ну и что? Вы находитесь внутри while True: , вы получаете входные данные, которые позволяют вам перейти к другой версии себя, получая новую input — если вы сейчас прерветесь, вы вернетесь к 1-му while True и не сможете избежать этого, потому что вы никогда не сбрасываете его input . Кстати, «дизайн» — это не то, что вы хотите сделать — используйте прямой цикл, а не рекурсию.

Ответ №1:

Проблема в том, что для случаев, когда в качестве входных данных задается число, вы снова рекурсивно вызываете ту же функцию. Если / когда этот вызов завершается, выполнение продолжается в этом вызове, возвращаясь в цикл while.

Поскольку у вас есть цикл while, вам не нужны рекурсивные вызовы. Цикл позаботится о том, чтобы все было повторено, если это необходимо.

Комментарии:

1. но тогда я не смогу изменить переключатель на y / n, когда пользователь выберет его правильно

2. Ну, это означает, что вам придется поместить пользовательский ввод внутрь цикла while. Вы должны либо использовать рекурсию, либо цикл, а не оба. Смешивание двух приведет к проблемам.