#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. Вы должны либо использовать рекурсию, либо цикл, а не оба. Смешивание двух приведет к проблемам.