Я хочу вернуть элемент управления, используя функцию в классе в Python 3 - PullRequest
0 голосов
/ 15 января 2019

У меня есть 3 разные функции в классе, если команда в любой из функций возвращает false, я хочу, чтобы программа начиналась заново так, как она начиналась, если функция, которая возвращает false, была последней командой среди функций. Кроме того, я хочу, чтобы программа вернулась к последней успешной функциональной команде, если неудачная команда не является последней среди функций

Когда я запускаю программу и последняя команда функции завершается неудачно, программа возвращается к начальной точке, но игнорирует определенную и важную часть того, чего я хочу достичь, вместо этого она полностью выполняет вторую команду функции

class Test():
    def greeting(self):
        user_input = input("Greeting: ")
        print("This is the greeting function")
        list1 = ["hello", "Hi"]

        if user_input in list1:
            print("Thats good")

            Test.cities(self)

        elif user_input not in list1:
            print("Mtchewwww")
            Test.greeting(self)
        else:
            print("be serious")




    def cities(self):
        print("U re now inside the city function")
        list2 = ["Otukpo", "Gboko"]

        user_input = input("Cities: ")

        if user_input in list2:
            print("Nice one")
            Test.num(self)
        else:
            print("that's not a city")
            Test.cities(self)
    def num(self):
        user_input = input("Numbers: ")
        list3 = [1, 2, 3, 4]
        if int(user_input) in list3:
            print("good number")


        elif user_input not in list3:
            print("That was bad")
            Test.greeting(self)
        else: 
            print("Can not compute")

calling = Test()
cal = calling.greeting
cal()

Я хочу, чтобы программа вела себя так: если элемент находится в списке list1, переходите к следующей функции, но если его нет в списке, попробуйте текущую функцию снова 3 раза и после 3-х шансов, но ее все еще нет в списке, чтобы вернуться к предыдущей функции

1 Ответ

0 голосов
/ 17 января 2019
def greeting():
    user_input = input("Greeting: ")

    # It is not good to name your variables like `list1`, `str2`...
    # plus, if your list is immutable, use a tuple instead.
    options = ('hello', 'Hi')

    if user_input in options:
        print("That's good")
        return True
    else:
        return False


def cities():
    user_input = input("Cities: ")
    options = ("Otukpo", "Gboko")

    if user_input in options:
        print("Nice one")
        return True
    else:
        print("That's not a city")
        return False

def num():
    user_input = input("Numbers: ")
    options = (1, 2, 3, 4)
    try:
        if int(user_input) in options:
            print("Good number")
            return True
        else:
            return False
    except ValueError:
        # In case that the input is not a number
        return False

def main():
    fns = (greeting, cities, num)
    ptr = 0
    cnt = 0

    # Just for your information, you don't have to use `ptr >= 0 and ptr <3` in python
    while 0 <= ptr < 3:
        # print(ptr, cnt)
        if cnt >= 3:
            # if failed for 3 times, move `ptr` to the previous function, and reset `cnt` to 0
            ptr -= 1
            cnt = 0
            continue

        # Get the current function, as `fn`
        fn = fns[ptr] 
        if fn():
            # if the current function is a success, move to next, and reset `cnt`
            ptr += 1
            cnt = 0
        else:
            # if the current function is a failure, it will be tried again in next while loop
            cnt += 1


main()

Используйте указатель ptr для итерации трех ваших функций и используйте переменную cnt для ограничения времени отказов. Просто попробуйте.

Веселись с питоном!

...