web-dev-qa-db-fra.com

Comment faire pour que le programme retourne au début du code au lieu de fermer

J'essaie de comprendre comment faire en sorte que Python revienne au début du code. En SmallBasic, vous faites

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

Mais je ne peux pas comprendre comment vous faites cela en Python:/Des idées, ça vous tente?

Le code que j'essaye de faire est en boucle

#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()

Donc, fondamentalement, lorsque l’utilisateur termine sa conversion, je souhaite qu’il revienne en boucle. Je ne peux toujours pas mettre vos exemples de boucle en pratique avec ceci, car chaque fois que j'utilise la fonction def pour boucler, cela indique que "op" n'est pas défini.

8
monkey334

Python, comme la plupart des langages de programmation modernes, ne supporte pas "goto". Au lieu de cela, vous devez utiliser des fonctions de contrôle. Il y a essentiellement deux façons de procéder.

1. Boucles

Voici un exemple de la façon dont vous pourriez faire exactement ce que fait votre exemple SmallBasic:

while True :
    print "Poo"

C'est si simple.

2. Récursion

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

the_func()

Remarque sur la récursivité: faites cela uniquement si vous souhaitez revenir au début à un nombre spécifique (auquel cas ajoutez un cas où la récursivité doit s'arrêter). C'est une mauvaise idée de faire une récursion infinie comme je le définis ci-dessus, parce que vous finirez par manquer de mémoire!

Edited pour répondre à la question plus précisément

#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()
5
River Tam

Utilisez une boucle infinie:

while True:
    print('Hello world!')

Cela peut certainement s'appliquer à votre fonction start(); vous pouvez quitter la boucle avec break ou utiliser return pour quitter la fonction, ce qui termine également la boucle:

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!")

Si vous deviez ajouter une option pour quitter également, cela pourrait être:

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

par exemple.

16
Martijn Pieters

Vous pouvez facilement le faire avec des boucles, il existe deux types de boucles

Pour Boucles:

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

While Boucles:

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

Chacune de ces boucles affiche "Hello World" cinq fois

2
K DawG

Python a des instructions de flux de contrôle au lieu d'instructions goto. Une implémentation du flux de contrôle est la boucle while de Python. Vous pouvez lui donner une condition booléenne (les valeurs booléennes sont Vrai ou Faux en Python), et la boucle s'exécutera de manière répétée jusqu'à ce que cette condition devienne fausse. Si vous voulez boucler à jamais, il vous suffit de démarrer une boucle infinie.

Soyez prudent si vous décidez d'exécuter le code exemple suivant. Appuyez sur Ctrl + C dans votre shell lorsqu'il est en cours d'exécution si vous souhaitez interrompre le processus. Notez que le processus doit être au premier plan pour que cela fonctionne. 

while True:
    # do stuff here
    pass

La ligne # do stuff here est juste un commentaire. Il n'exécute rien. pass est juste un paramètre fictif dans python qui dit en gros "Bonjour, je suis une ligne de code, mais sautez-moi car je ne fais rien."

Supposons maintenant que vous souhaitiez demander à l'utilisateur de manière répétée une entrée pour toujours et à tout moment, et que vous ne quittiez le programme que si l'utilisateur saisissait le caractère 'q' pour quitter.

Vous pouvez faire quelque chose comme ça:

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

cmd ne stockera que ce que l’utilisateur saisira (l’utilisateur sera invité à taper quelque chose et à appuyer sur Entrée). Si cmd ne stocke que la lettre 'q', le code va forcément break sortir de sa boucle. L'instruction break vous permet d'échapper à tout type de boucle. Même un infini! Il est extrêmement utile de savoir si vous souhaitez programmer des applications utilisateur qui s'exécutent souvent sur des boucles infinies. Si l'utilisateur ne tape pas exactement la lettre 'q', il sera invité à l'invite de manière répétée et infinie jusqu'à ce que le processus soit tué de force ou que l'utilisateur décide qu'il en a assez de ce programme ennuyeux et qu'il veut simplement quitter.

2
Shashank

Vous devez utiliser une boucle while. Si vous faites une boucle while et qu'il n'y a pas d'instruction après la boucle, elle deviendra une boucle infinie et ne s'arrêtera pas tant que vous ne l'avez pas arrêtée manuellement.

0
Infamouslyuseless
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
0
ChipperChimp968

écrire une boucle for ou while et mettre tout votre code à l'intérieur? La programmation de type Goto appartient au passé. 

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

0
A.J.