Python-как заставить программу вернуться в начало кода вместо закрытия [дубликат]

этот вопрос уже есть ответ здесь:

  • запрос пользователя для ввода, пока они не дадут действительный ответ 13 ответов

Я пытаюсь понять, как заставить Python вернуться к началу кода. В SmallBasic, вы делаете

start:
    textwindow.writeline("Poo")
    goto start

но я не могу понять, как вы это делаете в Python : / любые идеи кто?

код, который я пытаюсь зациклить, это

#Alan's Toolkit for conversions

def start() :
    print ("Welcome to the converter toolkit made by Alan.")
    op = input ("Please input what operation you wish to perform. 1 for Fahrenheit to Celsius, 2 for meters to centimetres and 3 for megabytes to gigabytes")

if op == "1":
    f1 = input ("Please enter your fahrenheit temperature: ")
    f1 = int(f1)

    a1 = (f1 - 32) / 1.8
    a1 = str(a1)

    print (a1+" celsius") 

elif op == "2":
    m1 = input ("Please input your the amount of meters you wish to convert: ")
    m1 = int(m1)
    m2 = (m1 * 100)

    m2 = str(m2)
    print (m2+" m")


if op == "3":
    mb1 = input ("Please input the amount of megabytes you want to convert")
    mb1 = int(mb1)
    mb2 = (mb1 / 1024)
    mb3 = (mb2 / 1024)

    mb3 = str(mb3)

    print (mb3+" GB")

else:
    print ("Sorry, that was an invalid command!")

start()

таким образом, в основном, когда пользователь заканчивает свое преобразование, я хочу, чтобы он вернулся к началу. Я все еще не могу применить ваши примеры цикла на практике, так как каждый раз, когда я использую функцию def для цикла, он говорит, что "op" не определен.

7 ответов


Python, как и большинство современных языков программирования, не поддерживает "goto". Вместо этого необходимо использовать функции управления. Есть два основных способа сделать это.

1. Петли

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

while True :
    print "Poo"

Это очень просто.

2. Рекурсия

def the_func() :
   print "Poo"
   the_func()

the_func()

примечание по рекурсии: только сделать это, если у вас есть определенное количество время, когда вы хотите вернуться к началу (в этом случае добавьте случай, когда рекурсия должна остановиться). Это плохая идея делать бесконечную рекурсию, как я определил выше, потому что у вас в конечном итоге закончится память!

редактировать чтобы ответить на вопрос более конкретно

#Alan's Toolkit for conversions

invalid_input = True
def start() :
    print ("Welcome to the converter toolkit made by Alan.")
    op = input ("Please input what operation you wish to perform. 1 for Fahrenheit to Celsius, 2 for meters to centimetres and 3 for megabytes to gigabytes")
    if op == "1":
        #stuff
        invalid_input = False # Set to False because input was valid


    elif op == "2":
        #stuff
        invalid_input = False # Set to False because input was valid
    elif op == "3": # you still have this as "if"; I would recommend keeping it as elif
        #stuff
        invalid_input = False # Set to False because input was valid
    else:
        print ("Sorry, that was an invalid command!")

while invalid_input : # this will loop until invalid_input is set to be True
    start()

используйте бесконечный цикл:

while True:
    print('Hello world!')

это, безусловно, может относиться к вашему start() функции Также; вы можете выйти из цикла с помощью break, или использовать return чтобы полностью выйти из функции, которая также завершает цикл:

def start():
    print ("Welcome to the converter toolkit made by Alan.")

    while True:
        op = input ("Please input what operation you wish to perform. 1 for Fahrenheit to Celsius, 2 for meters to centimetres and 3 for megabytes to gigabytes")

        if op == "1":
            f1 = input ("Please enter your fahrenheit temperature: ")
            f1 = int(f1)

            a1 = (f1 - 32) / 1.8
            a1 = str(a1)

            print (a1+" celsius") 

        elif op == "2":
            m1 = input ("Please input your the amount of meters you wish to convert: ")
            m1 = int(m1)
            m2 = (m1 * 100)

            m2 = str(m2)
            print (m2+" m")

        if op == "3":
            mb1 = input ("Please input the amount of megabytes you want to convert")
            mb1 = int(mb1)
            mb2 = (mb1 / 1024)
            mb3 = (mb2 / 1024)

            mb3 = str(mb3)

            print (mb3+" GB")

        else:
            print ("Sorry, that was an invalid command!")

если бы вы также добавили опцию выхода, это могло бы быть:

if op.lower() in {'q', 'quit', 'e', 'exit'}:
    print("Goodbye!")
    return

например.


Вы можете легко сделать это с петлями, есть два типа циклов

на петли:

for i in range(0,5):
    print 'Hello World'

пока петли:

count = 1
while count <= 5:
    print 'Hello World'
    count += 1

каждый из этих циклов печати "Здравствуй, Мир!" пять раз


Python имеет операторы потока управления вместо goto заявления. Одной из реализаций потока управления является Python while петли. Вы можете дать ему логическое условие (логические значения либо True, либо False в Python), и цикл будет выполняться неоднократно, пока это условие не станет false. Если вы хотите, чтобы цикл навсегда, все, что вам нужно сделать, это начать бесконечный цикл.

будьте осторожны, если вы решите выполнить следующий пример кода. Нажмите Control+C в вашей оболочке, пока она есть если вы когда-нибудь хотите убить процесс. Обратите внимание, что для этого процесс должен быть на переднем плане.

while True:
    # do stuff here
    pass

строку # do stuff here это просто комментарий. Он ничего не выполняет. pass - это просто заполнитель в python, который в основном говорит: "Привет, я строка кода, но Пропустите меня, потому что я ничего не делаю."

теперь предположим, что вы хотите повторно попросить пользователя ввести навсегда и когда-либо, и только выйти из программы, если пользователь вводит символ "q" за увольнение.

вы могли бы сделать что-то вроде этого:

while True:
    cmd = raw_input('Do you want to quit? Enter \'q\'!')
    if cmd == 'q':
        break

cmd будет просто хранить все, что пользователь вводит (пользователю будет предложено ввести что-то и нажмите enter). Если cmd хранит только букву "q", код будет принудительно break из своей заключительной петли. The break оператор позволяет избежать любого вида цикла. Даже бесконечное! Чрезвычайно полезно узнать, хотите ли вы программировать пользовательские приложения, которые часто работают на бесконечных циклах. Если пользователь не вводит точно букву "q", пользователю просто будет предложено несколько раз и бесконечно, пока процесс не будет насильственно убит или пользователь не решит, что ему достаточно этой раздражающей программы и просто хочет выйти.


напишите цикл for или while и поместите в него весь свой код? Программирование типа Goto ушло в прошлое.

https://wiki.python.org/moin/ForLoop


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


def start():

Offset = 5

def getMode():
    while True:
        print('Do you wish to encrypt or decrypt a message?')
        mode = input().lower()
        if mode in 'encrypt e decrypt d'.split():
            return mode
        else:
            print('Please be sensible try just the lower case')

def getMessage():
    print('Enter your message wanted to :')
    return input()

def getKey():
    key = 0
    while True:
        print('Enter the key number (1-%s)' % (Offset))
        key = int(input())
        if (key >= 1 and key <= Offset):
            return key

def getTranslatedMessage(mode, message, key):
    if mode[0] == 'd':
        key = -key
    translated = ''

    for symbol in message:
        if symbol.isalpha():
            num = ord(symbol)
            num += key

            if symbol.isupper():
                if num > ord('Z'):
                    num -= 26
                elif num < ord('A'):
                    num += 26
            elif symbol.islower():
                if num > ord('z'):
                    num -= 26
                elif num < ord('a'):
                    num += 26

            translated += chr(num)
        else:
            translated += symbol
    return translated

mode = getMode()
message = getMessage()
key = getKey()

print('Your translated text is:')
print(getTranslatedMessage(mode, message, key))
if op.lower() in {'q', 'quit', 'e', 'exit'}:
    print("Goodbye!")
    return