if-Anweisung mit Neustart

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
FiftyShadesOfPython
User
Beiträge: 5
Registriert: Samstag 23. Januar 2021, 09:09

Hallo zusammen,

ich will im folgenden Programm falls der else Fall eintrifft das die if Anweisung von vorne beginnt oder das komplette Programm von vorne anfängt...

if option == 2:
pick=int(input("1=Add name,2=delete Name\n---->"))
if pick == 1:
add_name=input("Please enter the name you want to add: ")
class_list.append(add_name)

if pick == 2:
delete_name=int(input("Please enter the number of the name you want to remove: "))
delete_name=delete_name-1
del class_list[delete_name]
else:

Habe es mit break und continue versucht wie in der while Schleife, das funktioniert bei der if anweisung aber anscheinend nicht.. wie ihr seht bin ich noch blutiger Anfänger.
Schon mal danke im Vorfeld! :)

Gruß
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Deshalb brauchst du auch eine while-Schleife
BT72
User
Beiträge: 8
Registriert: Samstag 23. Januar 2021, 12:21

Warum machst du keine while-Schleife, aus der du in den If-Fällen raus gehst... entweder indem du die Variable aus der Schleife auf False setzt, oder mit einem break.
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Sirius3 hat recht.

Nächste mal bitte den Code Button benutzen dann kann man es leichter lesen ... naja nebenbei würde Ich deine liste nicht class nennen....

Code: Alles auswählen

namen_liste = []
while True:
    pick = int(input("1=Add name,2=delete Name"))
    if pick == 1:
        add_name = input("Please enter the name you want to add: ")
        namen_liste.append(add_name)
        continue
    elif pick == 2:
        delete_name = int(input("Please enter the number of the name you want to remove: "))
        delete_name = delete_name - 1
        del namen_liste[delete_name]
        continue
    else:
        break
Ich will dir nur grob zeigen wie es aussieht in dem Programm so wie du es programmiert ist dort aber ein Fehler drinne.
Eine Vision ohne Aktion bleibe eine Illusion
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Bl3nder: continue sollte man sparsam benutzen, weil es den Programmfluss sehr undurchsichtig macht. Bei deinen Beispiel absolut überflüssig.
FiftyShadesOfPython
User
Beiträge: 5
Registriert: Samstag 23. Januar 2021, 09:09

Vielen Dank für Eure Antworten. Hab es wie ihr gesagt habt mit der while- schleife gelöst, bin da irgendwie auf dem Schlauch gestanden. :)
Danke noch mal!
FiftyShadesOfPython
User
Beiträge: 5
Registriert: Samstag 23. Januar 2021, 09:09

Vielen Dank für Eure Antworten. Hab es wie ihr gesagt habt mit der while- schleife gelöst, bin da irgendwie auf dem Schlauch gestanden. :)
Danke noch mal!
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

mit ein bisschen try und except kann man die Eingabe auch so gestalten, dass keine ungültigen Werte weiterverarbeitet werden und das Programm nicht bei einer fehlerhaften Eingabe abstürzt.

Code: Alles auswählen

def main():
    names = []
    while True:
        while True:
            try:
                choice = int(input("Enter your choice:\n1 - add name\n2 - delete name\n3 - show name list\n> "))
                if choice in (1,2,3):
                        break
                else:
                    raise ValueError
            except ValueError:
                print("invalid input")
        if choice == 1:
            name_to_add = input("Please enter the name you want to add: ")
            names.append(name_to_add)
            print(f"{name_to_add} was added to list.")
        elif choice == 2:
            name_to_delete = input("Please enter the name you want to delete: ")
            if name_to_delete in names:
                names.remove(name_to_delete)
                print(f"{name_to_delete} was deleted")
            else:
                print(f"{name_to_delete} is not in list.")
        elif choice == 3:
            for index, name in enumerate(names):
                print(f"{index} - {name}")
            print()
Außerdem würde ich nicht del benutzen um Elemente einer Liste zu löschen, sondern entweder remove() um über den Wert zu entfernen, oder pop() um über den Index zu entfernen. Bei deiner Methode fehlt aber noch eine Möglichkeit den Index eines Namens herauszubekommen, das kannst du wie in meinem Beispiel mit enumerate() machen oder auch mit index().
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Jankie: hier hast Du zu viele Abstraktionsebenen in einer Funktion. Das Einlesen und Validieren einer Eingabe und die Verarbeitung.
Teile main in mehrere Funktionen:

Code: Alles auswählen

def input_choice():
    while True:
        try:
            choice = int(input("Enter your choice:\n1 - add name\n2 - delete name\n3 - show name list\n> "))
        except ValueError:
            pass
        else:
            if choice in (1,2,3):
                return choice
        print("invalid input")

def main():
    names = []
    while True:
        choice = input_choice()
        if choice == 1:
            name_to_add = input("Please enter the name you want to add: ")
            names.append(name_to_add)
            print(f"{name_to_add} was added to list.")
        elif choice == 2:
            name_to_delete = input("Please enter the name you want to delete: ")
            if name_to_delete in names:
                names.remove(name_to_delete)
                print(f"{name_to_delete} was deleted")
            else:
                print(f"{name_to_delete} is not in list.")
        elif choice == 3:
            for index, name in enumerate(names, 1):
                print(f"{index} - {name}")
            print()
Wenn die Design-Entscheidung ist, dass der Name über den Index entfernt werden soll, dann ist del das Mittel der Wahl, wenn mit dem Rückgabewert von pop gar nichts gemacht wird.
Antworten