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 ушло в прошлое.
вам нужно использовать цикл 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