Можно ли остановить цикл из другой функции в Python? - PullRequest
0 голосов
/ 05 февраля 2019

Мне нужна программа, которая запускается с главного меню, которое выполняет различные функции.В конце каждой функции я хочу, чтобы у пользователя спросили: «Вы хотите вернуться в главное меню?»если пользователь говорит «нет», я хочу завершить программу, остановив основной цикл (я не хочу использовать sys.exit () или что-то подобное).Пример кода:

#Issue is almost at the bottom
#Feel free to comment on the rest of the code as well,
#Always looking to improve
def main():
    loop = True
    while loop:
        print('''MENU CHOICE''')
        print('''1: go here''')
        print('''2: go there''')
        print('''3: You get the point''')
        print('''0: Terminate program''')
        print()

        try:
            answer = int(input('''I want to go to program: '''))
        except:
            print('''Not a valid menu choice, please try again''')
            print()

        if answer != 1 and answer != 2 and answer != 3 and answer != 0:
            print('''Not a valid menu choice, please try again''')
            print()
        elif answer == 1:
            program1()
        elif answer == 2:
            program2()
        elif answer == 3:
            program3()
        else:
            loop = False

def program1():
    print('''This is program 1''')
    itdontwork = input('''Do you want to go back to the menu? Y/N''')

    if itdontwork == 'Y' or itdontwork == 'y':
        print()
    else:
        print('''SHUTTING DOWN''')
        loop = False #Here is the issue

#The rest of the programs would be the same

main()

Ответы [ 5 ]

0 голосов
/ 05 февраля 2019

Самый простой способ - сделать ваш цикл переменных глобальным

loop = True
def main():
    global loop
    while loop:
        print('''MENU CHOICE''')
        print('''1: go here''')
        print('''2: go there''')
        print('''3: You get the point''')
        print('''0: Terminate program''')
        print()

        try:
            answer = int(input('''I want to go to program: '''))
        except:
            print('''Not a valid menu choice, please try again''')
            print()

        if answer != 1 and answer != 2 and answer != 3 and answer != 0:
            print('''Not a valid menu choice, please try again''')
            print()
        elif answer == 1:
            program1()
        elif answer == 2:
            program2()
        elif answer == 3:
            program3()
        else:
            loop = False

def program1():
    global loop
    print('''This is program 1''')
    itdontwork = input('''Do you want to go back to the menu? Y/N''')

    if itdontwork == 'Y' or itdontwork == 'y':
        print()
    else:
        print('''SHUTTING DOWN''')
        loop = False #Here is the issue

#The rest of the programs would be the same

main()

Глобальный позволит вам везде иметь одну и ту же переменную w / r.Без глобальных все переменные локальные.

0 голосов
/ 05 февраля 2019

Проблема в том, что вы пытаетесь изменить переменную, которая была определена вне области действия program1.loop был определен внутри main, поэтому только main может получить к нему доступ.Есть несколько способов исправить это, вы можете объявить loop снаружи (сделать его глобальным) или просто заставить ваш program1 возвращать логическое значение функции вызывающей стороны, например:

def main():
    loop = True
    while loop:
        loop = program1()

def program1():
    itdontwork = input('''Do you want to go back to the menu? Y/N''')
    if itdontwork == 'Y' or itdontwork == 'y':
        print()
    else:
        print('''SHUTTING DOWN''')
        return False
0 голосов
/ 05 февраля 2019

Вы можете raise ValueError('Words and stuff') и затем поймать его в ловушку.

if answer != 1 and answer != 2 and answer != 3 and answer != 0:
    print('''Not a valid menu choice, please try again''')
    print()
elif answer == 1:
    try:
        program1()
    except ValueError:
        break
elif answer == 2:
    try:
        program2()
    except ValueError:
        break
elif answer == 3:
    try:
        program3()
    except ValueError:
        break
else:
    loop = False


def program1():
    print('''This is program 1''')
    itdontwork = input('''Do you want to go back to the menu? Y/N''')

    if itdontwork == 'Y' or itdontwork == 'y':
        print()
    else:
        print('''SHUTTING DOWN''')
        # loop = False #Here is the issue
        raise ValueError('BOOM SHAKA LAKA!')
0 голосов
/ 05 февраля 2019

Я думаю, что вы хотите попытаться сделать так, чтобы разные программы возвращали значение.

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

#Issue is almost at the bottom
#Feel free to comment on the rest of the code as well,
#Always looking to improve
def main():
    loop = True
    while loop:
        print('''MENU CHOICE''')
        print('''1: go here''')
        print('''2: go there''')
        print('''3: You get the point''')
        print('''0: Terminate program''')
        print()

        try:
            answer = int(input('''I want to go to program: '''))
        except:
            print('''Not a valid menu choice, please try again''')
            print()

        if answer != 1 and answer != 2 and answer != 3 and answer != 0:
            print('''Not a valid menu choice, please try again''')
            print()
        elif answer == 1:
            return program1() # Return the output of this function
        elif answer == 2:
            return program2() # Return the output of this function
        elif answer == 3:
            return program3() # Return the output of this function
        else:
            loop = False

def program1():
    print('''This is program 1''')
    itdontwork = input('''Do you want to go back to the menu? Y/N''')

    if itdontwork == 'Y' or itdontwork == 'y':
        print()
    else:
        print('''SHUTTING DOWN''')
        return False # Return the output of this function

#The rest of the programs would be the same

main()
0 голосов
/ 05 февраля 2019
...
        elif answer == 1:
            loop = program1()
        elif answer == 2:
            loop = program2()
        elif answer == 3:
            loop = program3()
        else:
            loop = False

def program1():
    print('''This is program 1''')
    itdontwork = input('''Do you want to go back to the menu? Y/N''')

    if itdontwork == 'Y' or itdontwork == 'y':
        print()
        return 1 # back to menu...
    else:
        print('''SHUTTING DOWN''')
        return 0

Это позволит вам получать нужные данные из вызываемых функций в цикл по вашему желанию.

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